[ppl] 01/68: Imported Upstream version 0.9
Andreas Tille
tille at debian.org
Sat Nov 12 08:39:48 UTC 2016
This is an automated email from the git hooks/post-receive script.
tille pushed a commit to branch master
in repository ppl.
commit ebc0ded6e4c41f61b2585393a42143efb8484290
Author: Andreas Tille <tille at debian.org>
Date: Sat Nov 12 01:13:11 2016 -0600
Imported Upstream version 0.9
---
BUGS | 22 +
COPYING | 340 +
CREDITS | 222 +
ChangeLog | 48803 ++++++++++++++++++++++
INSTALL | 236 +
Makefile.am | 42 +
Makefile.in | 767 +
NEWS | 1116 +
README | 1052 +
README.configure | 217 +
STANDARDS | 489 +
TODO | 68 +
Watchdog/BUGS | 2 +
Watchdog/COPYING | 340 +
Watchdog/CREDITS | 12 +
Watchdog/ChangeLog | 1024 +
Watchdog/INSTALL | 236 +
Watchdog/Makefile.am | 30 +
Watchdog/Makefile.in | 654 +
Watchdog/NEWS | 65 +
Watchdog/README | 94 +
Watchdog/aclocal.m4 | 7227 ++++
Watchdog/compile | 142 +
Watchdog/config.guess | 1498 +
Watchdog/config.h.in | 70 +
Watchdog/config.sub | 1609 +
Watchdog/configure | 22264 ++++++++++
Watchdog/configure.ac | 299 +
Watchdog/depcomp | 530 +
Watchdog/install-sh | 401 +
Watchdog/ltmain.sh | 6863 +++
Watchdog/missing | 359 +
Watchdog/mkinstalldirs | 158 +
Watchdog/src/Doubly_Linked_Object.defs.hh | 64 +
Watchdog/src/Doubly_Linked_Object.inlines.hh | 69 +
Watchdog/src/Doubly_Linked_Object.types.hh | 21 +
Watchdog/src/EList.defs.hh | 87 +
Watchdog/src/EList.inlines.hh | 112 +
Watchdog/src/EList.types.hh | 22 +
Watchdog/src/EList_Iterator.defs.hh | 83 +
Watchdog/src/EList_Iterator.inlines.hh | 104 +
Watchdog/src/EList_Iterator.types.hh | 22 +
Watchdog/src/Handler.defs.hh | 90 +
Watchdog/src/Handler.inlines.hh | 57 +
Watchdog/src/Handler.types.hh | 26 +
Watchdog/src/Makefile.am | 143 +
Watchdog/src/Makefile.in | 644 +
Watchdog/src/Pending_Element.cc | 32 +
Watchdog/src/Pending_Element.defs.hh | 75 +
Watchdog/src/Pending_Element.inlines.hh | 63 +
Watchdog/src/Pending_Element.types.hh | 21 +
Watchdog/src/Pending_List.cc | 75 +
Watchdog/src/Pending_List.defs.hh | 74 +
Watchdog/src/Pending_List.inlines.hh | 65 +
Watchdog/src/Pending_List.types.hh | 21 +
Watchdog/src/Time.cc | 32 +
Watchdog/src/Time.defs.hh | 111 +
Watchdog/src/Time.inlines.hh | 144 +
Watchdog/src/Time.types.hh | 21 +
Watchdog/src/Watchdog.cc | 252 +
Watchdog/src/Watchdog.defs.hh | 139 +
Watchdog/src/Watchdog.inlines.hh | 80 +
Watchdog/src/Watchdog.types.hh | 21 +
Watchdog/src/pwl.hh.dist | 1338 +
Watchdog/src/pwl_header.hh | 50 +
Watchdog/utils/Makefile.am | 45 +
Watchdog/utils/Makefile.in | 374 +
Watchdog/utils/build_header.in | 102 +
aclocal.m4 | 7241 ++++
compile | 142 +
config.guess | 1498 +
config.h.in | 286 +
config.rpath | 557 +
config.sub | 1609 +
configure | 33025 +++++++++++++++
configure.ac | 911 +
debian/Makefile.am | 44 +
debian/Makefile.in | 465 +
debian/README | 35 +
debian/changelog | 11 +
debian/compat | 1 +
debian/control | 74 +
debian/libppl-c.dirs | 1 +
debian/libppl-c.install | 1 +
debian/libppl-c.links | 1 +
debian/libppl-dev.dirs | 3 +
debian/libppl-dev.doc-base | 17 +
debian/libppl-dev.doc-base.user | 17 +
debian/libppl-dev.docs | 0
debian/libppl-dev.install | 5 +
debian/libppl-dev.links | 1 +
debian/libppl-pwl.copyright.in | 444 +
debian/libppl-pwl.dirs | 2 +
debian/libppl-pwl.docs | 5 +
debian/libppl-pwl.install | 4 +
debian/libppl.copyright.in | 444 +
debian/libppl.dirs | 3 +
debian/libppl.docs | 5 +
debian/libppl.install | 8 +
debian/rules | 186 +
demos/Makefile.am | 23 +
demos/Makefile.in | 594 +
demos/ppl_lcdd/Makefile.am | 122 +
demos/ppl_lcdd/Makefile.in | 770 +
demos/ppl_lcdd/examples/1d.ine | 5 +
demos/ppl_lcdd/examples/1da.ine | 6 +
demos/ppl_lcdd/examples/Makefile.am | 135 +
demos/ppl_lcdd/examples/Makefile.in | 552 +
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.cc | 1294 +
demos/ppl_lpsol/Makefile.am | 160 +
demos/ppl_lpsol/Makefile.in | 821 +
demos/ppl_lpsol/dummy.cc | 1 +
demos/ppl_lpsol/examples/Makefile.am | 38 +
demos/ppl_lpsol/examples/Makefile.in | 456 +
demos/ppl_lpsol/examples/README | 7 +
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 | 359 +
demos/ppl_lpsol/examples/boeing1.mps | 2636 ++
demos/ppl_lpsol/examples/boeing2.mps | 970 +
demos/ppl_lpsol/examples/ex1.mps | 19 +
demos/ppl_lpsol/examples/kb2.mps | 219 +
demos/ppl_lpsol/examples/mip.mps | 27 +
demos/ppl_lpsol/examples/sample.mps | 22 +
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 | 19 +
demos/ppl_lpsol/expected_int16 | 79 +
demos/ppl_lpsol/expected_int16_a | 67 +
demos/ppl_lpsol/expected_int32 | 98 +
demos/ppl_lpsol/expected_int32_a | 96 +
demos/ppl_lpsol/expected_int64 | 98 +
demos/ppl_lpsol/expected_int64_a | 96 +
demos/ppl_lpsol/expected_int8 | 56 +
demos/ppl_lpsol/expected_int8_a | 54 +
demos/ppl_lpsol/expected_mpz | 1980 +
demos/ppl_lpsol/expected_mpz_a | 1910 +
demos/ppl_lpsol/ppl_lpsol.c | 895 +
depcomp | 530 +
doc/Makefile.am | 284 +
doc/Makefile.in | 766 +
doc/README.doc | 139 +
doc/definitions.dox | 3502 ++
doc/devref.doxyconf-html | 1446 +
doc/devref.doxyconf-html.in | 1446 +
doc/devref.doxyconf-latex | 1446 +
doc/devref.doxyconf-latex.in | 1446 +
doc/devref.tex | 135 +
doc/fdl.dox | 405 +
doc/fdl.pdf | Bin 0 -> 59059 bytes
doc/fdl.ps.gz | Bin 0 -> 67885 bytes
doc/fdl.tex | 454 +
doc/fdl.txt | 397 +
doc/gpl.dox | 461 +
doc/gpl.pdf | Bin 0 -> 71909 bytes
doc/gpl.ps.gz | Bin 0 -> 78865 bytes
doc/gpl.tex | 380 +
doc/gpl.txt | 340 +
doc/ppl-config.1 | 106 +
doc/ppl-user-0.9-html.tar.gz | Bin 0 -> 583785 bytes
doc/ppl-user-0.9.pdf | Bin 0 -> 2839226 bytes
doc/ppl-user-0.9.ps.gz | Bin 0 -> 1163250 bytes
doc/ppl.sty | 178 +
doc/ppl_lcdd.1 | 50 +
doc/ppl_lpsol.1 | 60 +
doc/user.doxyconf-html | 1243 +
doc/user.doxyconf-html.in | 1243 +
doc/user.doxyconf-latex | 1243 +
doc/user.doxyconf-latex.in | 1243 +
doc/user.tex | 135 +
install-sh | 401 +
instchk.hh | 81 +
interfaces/C/Makefile.am | 70 +
interfaces/C/Makefile.in | 644 +
interfaces/C/ppl_c.cc | 2524 ++
interfaces/C/ppl_c.h | 2695 ++
interfaces/C/ppl_c.h.in | 2695 ++
interfaces/Makefile.am | 23 +
interfaces/Makefile.in | 594 +
interfaces/Prolog/Ciao/Makefile.am | 168 +
interfaces/Prolog/Ciao/Makefile.in | 734 +
interfaces/Prolog/Ciao/ciao_clpq.pl | 55 +
interfaces/Prolog/Ciao/ciao_clpq2.pl | 56 +
interfaces/Prolog/Ciao/ciao_pl_check.pl | 163 +
interfaces/Prolog/Ciao/ppl_ciao.cc | 412 +
interfaces/Prolog/Ciao/ppl_ciao.pl | 1683 +
interfaces/Prolog/GNU/Makefile.am | 153 +
interfaces/Prolog/GNU/Makefile.in | 751 +
interfaces/Prolog/GNU/README | 32 +
interfaces/Prolog/GNU/gnu_pl_check.pl | 36 +
interfaces/Prolog/GNU/gp_clpq.pl | 31 +
interfaces/Prolog/GNU/ppl_gprolog.pl | 182 +
interfaces/Prolog/GNU/ppl_gprolog_sd.cc | 438 +
interfaces/Prolog/Makefile.am | 25 +
interfaces/Prolog/Makefile.in | 598 +
interfaces/Prolog/Prolog_interface.dox | 2175 +
interfaces/Prolog/SICStus/Makefile.am | 162 +
interfaces/Prolog/SICStus/Makefile.in | 742 +
interfaces/Prolog/SICStus/ppl_sicstus.pl | 29 +
interfaces/Prolog/SICStus/ppl_sicstus_sd.cc | 474 +
interfaces/Prolog/SICStus/sicstus_cfli.cc | 27 +
interfaces/Prolog/SICStus/sicstus_cfli.h | 155 +
interfaces/Prolog/SICStus/sicstus_cfli.ic | 299 +
interfaces/Prolog/SICStus/sp_clpq.pl | 35 +
interfaces/Prolog/SICStus/sp_pl_check.pl | 40 +
interfaces/Prolog/SWI/Makefile.am | 151 +
interfaces/Prolog/SWI/Makefile.in | 789 +
interfaces/Prolog/SWI/pl_clpq.cc | 42 +
interfaces/Prolog/SWI/pl_clpq.pl | 32 +
interfaces/Prolog/SWI/ppl_pl.cc | 38 +
interfaces/Prolog/SWI/ppl_swiprolog.cc | 524 +
interfaces/Prolog/SWI/ppl_swiprolog.pl | 23 +
interfaces/Prolog/SWI/swi_pl_check.pl | 38 +
interfaces/Prolog/XSB/Makefile.am | 171 +
interfaces/Prolog/XSB/Makefile.in | 737 +
interfaces/Prolog/XSB/expected_clpq2_int16 | 102 +
interfaces/Prolog/XSB/expected_clpq2_int16_a | 103 +
interfaces/Prolog/XSB/expected_clpq2_int32 | 109 +
interfaces/Prolog/XSB/expected_clpq2_int32_a | 102 +
interfaces/Prolog/XSB/expected_clpq2_int64 | 109 +
interfaces/Prolog/XSB/expected_clpq2_int64_a | 109 +
interfaces/Prolog/XSB/expected_clpq2_int8 | 101 +
interfaces/Prolog/XSB/expected_clpq2_int8_a | 101 +
interfaces/Prolog/XSB/expected_clpq2_mpz | 109 +
interfaces/Prolog/XSB/expected_clpq2_mpz_a | 109 +
interfaces/Prolog/XSB/expected_clpq_int16 | 35 +
interfaces/Prolog/XSB/expected_clpq_int16_a | 35 +
interfaces/Prolog/XSB/expected_clpq_int32 | 35 +
interfaces/Prolog/XSB/expected_clpq_int32_a | 35 +
interfaces/Prolog/XSB/expected_clpq_int64 | 35 +
interfaces/Prolog/XSB/expected_clpq_int64_a | 35 +
interfaces/Prolog/XSB/expected_clpq_int8 | 29 +
interfaces/Prolog/XSB/expected_clpq_int8_a | 29 +
interfaces/Prolog/XSB/expected_clpq_mpz | 35 +
interfaces/Prolog/XSB/expected_clpq_mpz_a | 35 +
interfaces/Prolog/XSB/expected_pchk_int16 | 3 +
interfaces/Prolog/XSB/expected_pchk_int16_a | 3 +
interfaces/Prolog/XSB/expected_pchk_int32 | 3 +
interfaces/Prolog/XSB/expected_pchk_int32_a | 3 +
interfaces/Prolog/XSB/expected_pchk_int64 | 1 +
interfaces/Prolog/XSB/expected_pchk_int64_a | 3 +
interfaces/Prolog/XSB/expected_pchk_int8 | 9 +
interfaces/Prolog/XSB/expected_pchk_int8_a | 9 +
interfaces/Prolog/XSB/expected_pchk_mpz | 1 +
interfaces/Prolog/XSB/expected_pchk_mpz_a | 1 +
interfaces/Prolog/XSB/ppl_xsb.H | 143 +
interfaces/Prolog/XSB/ppl_xsb.cc | 834 +
interfaces/Prolog/XSB/xsb_clpq.P | 52 +
interfaces/Prolog/XSB/xsb_clpq2.P | 53 +
interfaces/Prolog/XSB/xsb_pl_check.P | 163 +
interfaces/Prolog/YAP/Makefile.am | 125 +
interfaces/Prolog/YAP/Makefile.in | 685 +
interfaces/Prolog/YAP/ppl_yap.cc | 725 +
interfaces/Prolog/YAP/ppl_yap.pl | 23 +
interfaces/Prolog/YAP/yap_clpq.pl | 30 +
interfaces/Prolog/YAP/yap_clpq2.pl | 30 +
interfaces/Prolog/YAP/yap_pl_check.pl | 34 +
interfaces/Prolog/exceptions.hh | 174 +
interfaces/Prolog/ppl_prolog.icc | 3483 ++
interfaces/Prolog/tests/Makefile.am | 51 +
interfaces/Prolog/tests/Makefile.in | 465 +
interfaces/Prolog/tests/ack.clpq | 5 +
interfaces/Prolog/tests/ackn.clpq | 6 +
interfaces/Prolog/tests/clpq.pl | 801 +
interfaces/Prolog/tests/clpq2.pl | 1119 +
interfaces/Prolog/tests/expected_clpq2_int16 | 102 +
interfaces/Prolog/tests/expected_clpq2_int16_a | 103 +
interfaces/Prolog/tests/expected_clpq2_int32 | 109 +
interfaces/Prolog/tests/expected_clpq2_int32_a | 102 +
interfaces/Prolog/tests/expected_clpq2_int64 | 109 +
interfaces/Prolog/tests/expected_clpq2_int64_a | 109 +
interfaces/Prolog/tests/expected_clpq2_int8 | 101 +
interfaces/Prolog/tests/expected_clpq2_int8_a | 101 +
interfaces/Prolog/tests/expected_clpq2_mpz | 109 +
interfaces/Prolog/tests/expected_clpq2_mpz_a | 109 +
interfaces/Prolog/tests/expected_clpq_int16 | 35 +
interfaces/Prolog/tests/expected_clpq_int16_a | 35 +
interfaces/Prolog/tests/expected_clpq_int32 | 35 +
interfaces/Prolog/tests/expected_clpq_int32_a | 35 +
interfaces/Prolog/tests/expected_clpq_int64 | 35 +
interfaces/Prolog/tests/expected_clpq_int64_a | 35 +
interfaces/Prolog/tests/expected_clpq_int8 | 29 +
interfaces/Prolog/tests/expected_clpq_int8_a | 29 +
interfaces/Prolog/tests/expected_clpq_mpz | 35 +
interfaces/Prolog/tests/expected_clpq_mpz_a | 35 +
interfaces/Prolog/tests/expected_pchk_int16 | 3 +
interfaces/Prolog/tests/expected_pchk_int16_a | 3 +
interfaces/Prolog/tests/expected_pchk_int32 | 3 +
interfaces/Prolog/tests/expected_pchk_int32_a | 3 +
interfaces/Prolog/tests/expected_pchk_int64 | 1 +
interfaces/Prolog/tests/expected_pchk_int64_a | 3 +
interfaces/Prolog/tests/expected_pchk_int8 | 9 +
interfaces/Prolog/tests/expected_pchk_int8_a | 9 +
interfaces/Prolog/tests/expected_pchk_mpz | 1 +
interfaces/Prolog/tests/expected_pchk_mpz_a | 1 +
interfaces/Prolog/tests/fib.clpq | 6 +
interfaces/Prolog/tests/mc91.clpq | 6 +
interfaces/Prolog/tests/pl_check.pl | 3314 ++
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/Prolog/track_allocation.hh | 116 +
ltmain.sh | 6863 +++
m4/Makefile.am | 44 +
m4/Makefile.in | 488 +
m4/ac_check_fpu_control.m4 | 51 +
m4/ac_check_gmp.m4 | 127 +
m4/ac_check_sicstus_prolog.m4 | 62 +
m4/ac_check_swi_prolog.m4 | 79 +
m4/ac_check_xsb_prolog.m4 | 49 +
m4/ac_cxx_attribute_weak.m4 | 58 +
m4/ac_cxx_double_binary_format.m4 | 100 +
m4/ac_cxx_flexible_arrays.m4 | 95 +
m4/ac_cxx_float_binary_format.m4 | 91 +
m4/ac_cxx_long_double_binary_format.m4 | 272 +
m4/ac_text_md5sum.m4 | 37 +
m4/lib-ld.m4 | 110 +
m4/lib-link.m4 | 553 +
m4/lib-prefix.m4 | 153 +
m4/ppl.m4 | 280 +
missing | 359 +
mkinstalldirs | 158 +
ppl.lsm.in | 31 +
ppl.spec.in | 185 +
src/BDS_Status.idefs.hh | 116 +
src/BDS_Status.inlines.hh | 266 +
src/BD_Shape.cc | 96 +
src/BD_Shape.defs.hh | 1342 +
src/BD_Shape.inlines.hh | 711 +
src/BD_Shape.templates.hh | 3774 ++
src/BD_Shape.types.hh | 22 +
src/BHRZ03_Certificate.cc | 332 +
src/BHRZ03_Certificate.defs.hh | 117 +
src/BHRZ03_Certificate.inlines.hh | 62 +
src/BHRZ03_Certificate.types.hh | 21 +
src/BUGS.cc.dist | 24 +
src/Bounding_Box.cc | 158 +
src/Bounding_Box.defs.hh | 207 +
src/Bounding_Box.inlines.hh | 137 +
src/Bounding_Box.types.hh | 21 +
src/COPYING.cc.dist | 342 +
src/CREDITS.cc.dist | 224 +
src/C_Polyhedron.cc | 71 +
src/C_Polyhedron.defs.hh | 213 +
src/C_Polyhedron.inlines.hh | 135 +
src/C_Polyhedron.types.hh | 21 +
src/Checked_Number.cc | 89 +
src/Checked_Number.defs.hh | 913 +
src/Checked_Number.inlines.hh | 820 +
src/Checked_Number.types.hh | 27 +
src/Coefficient.cc | 25 +
src/Coefficient.defs.hh | 47 +
src/Coefficient.inlines.hh | 42 +
src/Coefficient.types.hh | 99 +
src/Coefficient_traits_template.hh | 27 +
src/Congruence.cc | 251 +
src/Congruence.defs.hh | 474 +
src/Congruence.inlines.hh | 233 +
src/Congruence.types.hh | 21 +
src/Congruence_System.cc | 550 +
src/Congruence_System.defs.hh | 480 +
src/Congruence_System.inlines.hh | 211 +
src/Congruence_System.types.hh | 21 +
src/Constraint.cc | 268 +
src/Constraint.defs.hh | 489 +
src/Constraint.inlines.hh | 343 +
src/Constraint.types.hh | 21 +
src/Constraint_System.cc | 594 +
src/Constraint_System.defs.hh | 394 +
src/Constraint_System.inlines.hh | 220 +
src/Constraint_System.types.hh | 21 +
src/DB_Matrix.defs.hh | 324 +
src/DB_Matrix.inlines.hh | 679 +
src/DB_Matrix.types.hh | 22 +
src/DB_Row.defs.hh | 431 +
src/DB_Row.inlines.hh | 556 +
src/DB_Row.types.hh | 25 +
src/Determinate.defs.hh | 316 +
src/Determinate.inlines.hh | 291 +
src/Determinate.types.hh | 22 +
src/Float.cc | 42 +
src/Float.defs.hh | 249 +
src/Float.inlines.hh | 388 +
src/GMP_Integer.defs.hh | 136 +
src/GMP_Integer.inlines.hh | 112 +
src/GMP_Integer.types.hh | 43 +
src/Generator.cc | 381 +
src/Generator.defs.hh | 508 +
src/Generator.inlines.hh | 225 +
src/Generator.types.hh | 21 +
src/Generator_System.cc | 1032 +
src/Generator_System.defs.hh | 506 +
src/Generator_System.inlines.hh | 212 +
src/Generator_System.types.hh | 21 +
src/Grid.defs.hh | 2485 ++
src/Grid.inlines.hh | 264 +
src/Grid.templates.hh | 569 +
src/Grid.types.hh | 21 +
src/Grid_Certificate.cc | 114 +
src/Grid_Certificate.defs.hh | 103 +
src/Grid_Certificate.inlines.hh | 60 +
src/Grid_Certificate.types.hh | 21 +
src/Grid_Generator.cc | 339 +
src/Grid_Generator.defs.hh | 493 +
src/Grid_Generator.inlines.hh | 218 +
src/Grid_Generator.types.hh | 21 +
src/Grid_Generator_System.cc | 429 +
src/Grid_Generator_System.defs.hh | 497 +
src/Grid_Generator_System.inlines.hh | 268 +
src/Grid_Generator_System.types.hh | 21 +
src/Grid_Status.cc | 245 +
src/Grid_Status.idefs.hh | 167 +
src/Grid_Status.inlines.hh | 216 +
src/Grid_chdims.cc | 444 +
src/Grid_conversion.cc | 559 +
src/Grid_nonpublic.cc | 612 +
src/Grid_public.cc | 2218 +
src/Grid_simplify.cc | 660 +
src/Grid_widenings.cc | 226 +
src/H79_Certificate.cc | 119 +
src/H79_Certificate.defs.hh | 97 +
src/H79_Certificate.inlines.hh | 70 +
src/H79_Certificate.types.hh | 21 +
src/Init.cc | 71 +
src/Init.defs.hh | 57 +
src/Init.types.hh | 21 +
src/Interval.cc | 55 +
src/Interval.defs.hh | 204 +
src/Interval.inlines.hh | 127 +
src/Interval.types.hh | 24 +
src/LP_Problem.cc | 1035 +
src/LP_Problem.defs.hh | 394 +
src/LP_Problem.inlines.hh | 267 +
src/LP_Problem.types.hh | 32 +
src/Limits.hh | 95 +
src/Linear_Expression.cc | 289 +
src/Linear_Expression.defs.hh | 444 +
src/Linear_Expression.inlines.hh | 212 +
src/Linear_Expression.types.hh | 21 +
src/Linear_Row.cc | 209 +
src/Linear_Row.defs.hh | 458 +
src/Linear_Row.inlines.hh | 290 +
src/Linear_Row.types.hh | 21 +
src/Linear_System.cc | 916 +
src/Linear_System.defs.hh | 517 +
src/Linear_System.inlines.hh | 393 +
src/Linear_System.types.hh | 21 +
src/Makefile.am | 413 +
src/Makefile.in | 1167 +
src/Matrix.cc | 409 +
src/Matrix.defs.hh | 356 +
src/Matrix.inlines.hh | 213 +
src/Matrix.types.hh | 21 +
src/NNC_Polyhedron.cc | 66 +
src/NNC_Polyhedron.defs.hh | 187 +
src/NNC_Polyhedron.inlines.hh | 134 +
src/NNC_Polyhedron.types.hh | 21 +
src/Numeric_Format.defs.hh | 37 +
src/Ph_Status.cc | 245 +
src/Ph_Status.idefs.hh | 182 +
src/Ph_Status.inlines.hh | 216 +
src/Poly_Con_Relation.cc | 77 +
src/Poly_Con_Relation.defs.hh | 170 +
src/Poly_Con_Relation.inlines.hh | 99 +
src/Poly_Con_Relation.types.hh | 21 +
src/Poly_Gen_Relation.cc | 65 +
src/Poly_Gen_Relation.defs.hh | 143 +
src/Poly_Gen_Relation.inlines.hh | 84 +
src/Poly_Gen_Relation.types.hh | 21 +
src/Polyhedra_Powerset.cc | 143 +
src/Polyhedra_Powerset.defs.hh | 553 +
src/Polyhedra_Powerset.inlines.hh | 268 +
src/Polyhedra_Powerset.templates.hh | 684 +
src/Polyhedra_Powerset.types.hh | 22 +
src/Polyhedron.defs.hh | 2475 ++
src/Polyhedron.inlines.hh | 344 +
src/Polyhedron.templates.hh | 512 +
src/Polyhedron.types.hh | 21 +
src/Polyhedron_chdims.cc | 637 +
src/Polyhedron_nonpublic.cc | 1568 +
src/Polyhedron_public.cc | 2965 ++
src/Polyhedron_widenings.cc | 862 +
src/Powerset.defs.hh | 620 +
src/Powerset.inlines.hh | 399 +
src/Powerset.templates.hh | 302 +
src/Powerset.types.hh | 22 +
src/Ptr_Iterator.defs.hh | 171 +
src/Ptr_Iterator.inlines.hh | 188 +
src/Ptr_Iterator.types.hh | 26 +
src/Result.defs.hh | 118 +
src/Result.inlines.hh | 60 +
src/Rounding_Dir.defs.hh | 70 +
src/Rounding_Dir.inlines.hh | 48 +
src/Row.cc | 282 +
src/Row.defs.hh | 496 +
src/Row.inlines.hh | 404 +
src/Row.types.hh | 22 +
src/Saturation_Matrix.cc | 227 +
src/Saturation_Matrix.defs.hh | 177 +
src/Saturation_Matrix.inlines.hh | 145 +
src/Saturation_Matrix.types.hh | 21 +
src/Saturation_Row.cc | 347 +
src/Saturation_Row.defs.hh | 239 +
src/Saturation_Row.inlines.hh | 136 +
src/Saturation_Row.types.hh | 21 +
src/Scalar_Products.cc | 121 +
src/Scalar_Products.defs.hh | 182 +
src/Scalar_Products.inlines.hh | 152 +
src/Scalar_Products.types.hh | 23 +
src/Topology.hh | 28 +
src/Variable.cc | 52 +
src/Variable.defs.hh | 156 +
src/Variable.inlines.hh | 88 +
src/Variable.types.hh | 21 +
src/Widening_Function.defs.hh | 126 +
src/Widening_Function.inlines.hh | 74 +
src/Widening_Function.types.hh | 25 +
src/algorithms.hh | 71 +
src/checked.cc | 375 +
src/checked.defs.hh | 392 +
src/checked.inlines.hh | 277 +
src/checked_ext.inlines.hh | 763 +
src/checked_float.inlines.hh | 940 +
src/checked_int.inlines.hh | 1537 +
src/checked_mpq.inlines.hh | 413 +
src/checked_mpz.inlines.hh | 529 +
src/checked_numeric_limits.hh | 161 +
src/compiler.hh | 38 +
src/conversion.cc | 856 +
src/fpu-c99.inlines.hh | 81 +
src/fpu-ia32.inlines.hh | 134 +
src/fpu-none.inlines.hh | 69 +
src/fpu-sparc.inlines.hh | 73 +
src/fpu.defs.hh | 85 +
src/fpu.types.hh | 26 +
src/globals.cc | 33 +
src/globals.defs.hh | 290 +
src/globals.inlines.hh | 80 +
src/globals.types.hh | 73 +
src/initializer.hh | 34 +
src/max_space_dimension.hh | 48 +
src/minimize.cc | 401 +
src/mp_numeric_limits.hh | 157 +
src/namespaces.hh | 100 +
src/ppl-config.cc | 720 +
src/ppl-config.cc.in | 720 +
src/ppl.hh.dist | 41175 ++++++++++++++++++
src/ppl_header.hh | 51 +
src/simplify.cc | 307 +
src/swapping_sort.icc | 141 +
src/version.cc | 83 +
src/version.hh.in | 92 +
tests/BBox.cc | 188 +
tests/BBox.hh | 129 +
tests/BD_Shape/Makefile.am | 202 +
tests/BD_Shape/Makefile.in | 1217 +
tests/BD_Shape/addconstraints1.cc | 231 +
tests/BD_Shape/addspacedims1.cc | 277 +
tests/BD_Shape/affinedimension1.cc | 236 +
tests/BD_Shape/affineimage1.cc | 467 +
tests/BD_Shape/affineimage2.cc | 351 +
tests/BD_Shape/affinepreimage1.cc | 181 +
tests/BD_Shape/affinepreimage2.cc | 253 +
tests/BD_Shape/ascii_dump_load1.cc | 246 +
tests/BD_Shape/bdsdifference1.cc | 278 +
tests/BD_Shape/bdshull1.cc | 220 +
tests/BD_Shape/bgp99extrapolation1.cc | 93 +
tests/BD_Shape/bhmz05widening1.cc | 343 +
tests/BD_Shape/bhz03widening1.cc | 76 +
tests/BD_Shape/cc76extrapolation1.cc | 488 +
tests/BD_Shape/cc76narrowing1.cc | 216 +
tests/BD_Shape/closure1.cc | 379 +
tests/BD_Shape/concatenate1.cc | 203 +
tests/BD_Shape/constraints1.cc | 124 +
tests/BD_Shape/contains1.cc | 124 +
tests/BD_Shape/empty1.cc | 206 +
tests/BD_Shape/equality1.cc | 131 +
tests/BD_Shape/fromgensys1.cc | 163 +
tests/BD_Shape/generalizedaffineimage1.cc | 592 +
tests/BD_Shape/generalizedaffineimage2.cc | 516 +
tests/BD_Shape/generalizedaffinepreimage1.cc | 477 +
tests/BD_Shape/generalizedaffinepreimage2.cc | 118 +
tests/BD_Shape/geomcovers1.cc | 69 +
tests/BD_Shape/h79widening1.cc | 62 +
tests/BD_Shape/intersection1.cc | 324 +
tests/BD_Shape/limitedbhmz05extrapolation1.cc | 526 +
tests/BD_Shape/limitedcc76extrapolation1.cc | 537 +
tests/BD_Shape/limitedh79extrapolation1.cc | 70 +
tests/BD_Shape/mapspacedims1.cc | 291 +
tests/BD_Shape/maxspacedim.cc | 92 +
tests/BD_Shape/minconstraints1.cc | 70 +
tests/BD_Shape/relations1.cc | 470 +
tests/BD_Shape/relations2.cc | 449 +
tests/BD_Shape/relations3.cc | 108 +
tests/BD_Shape/removespacedims1.cc | 311 +
tests/BD_Shape/run_tests | 30 +
tests/BD_Shape/timeelapse1.cc | 209 +
tests/BD_Shape/universe1.cc | 57 +
tests/BD_Shape/writebdshape1.cc | 78 +
tests/Grid/Makefile.am | 261 +
tests/Grid/Makefile.in | 1494 +
tests/Grid/addcongruence1.cc | 135 +
tests/Grid/addcongruences1.cc | 409 +
tests/Grid/addconstraint1.cc | 244 +
tests/Grid/addconstraints1.cc | 516 +
tests/Grid/addgenerator1.cc | 366 +
tests/Grid/addgenerators1.cc | 281 +
tests/Grid/addspacedims1.cc | 546 +
tests/Grid/affinedim1.cc | 321 +
tests/Grid/affineimage1.cc | 402 +
tests/Grid/affineimage2.cc | 317 +
tests/Grid/affinepreimage1.cc | 443 +
tests/Grid/affinepreimage2.cc | 372 +
tests/Grid/asciidumpload1.cc | 178 +
tests/Grid/bhz03widening1.cc | 111 +
tests/Grid/bounded1.cc | 397 +
tests/Grid/boundingbox1.cc | 295 +
tests/Grid/boundingbox2.cc | 520 +
tests/Grid/bounds1.cc | 441 +
tests/Grid/certificate1.cc | 228 +
tests/Grid/concatenate1.cc | 341 +
tests/Grid/congruence1.cc | 377 +
tests/Grid/congruences1.cc | 213 +
tests/Grid/congruencesystem1.cc | 419 +
tests/Grid/contains1.cc | 213 +
tests/Grid/copyconstruct1.cc | 70 +
tests/Grid/coveringbox1.cc | 305 +
tests/Grid/coveringbox2.cc | 879 +
tests/Grid/discrete1.cc | 342 +
tests/Grid/disjoint1.cc | 234 +
tests/Grid/equals1.cc | 253 +
tests/Grid/expandspacedim1.cc | 238 +
tests/Grid/foldspacedims1.cc | 400 +
tests/Grid/generalizedaffineimage1.cc | 555 +
tests/Grid/generalizedaffineimage2.cc | 552 +
tests/Grid/generalizedaffinepreimage1.cc | 514 +
tests/Grid/generalizedaffinepreimage2.cc | 359 +
tests/Grid/generator1.cc | 209 +
tests/Grid/generators1.cc | 309 +
tests/Grid/grid1.cc | 586 +
tests/Grid/grid2.cc | 558 +
tests/Grid/grid3.cc | 488 +
tests/Grid/griddifference1.cc | 349 +
tests/Grid/intersection1.cc | 500 +
tests/Grid/isempty1.cc | 293 +
tests/Grid/isuniverse1.cc | 321 +
tests/Grid/join1.cc | 376 +
tests/Grid/join2.cc | 325 +
tests/Grid/limitedextrapolation1.cc | 496 +
tests/Grid/mapspacedims1.cc | 313 +
tests/Grid/maxmin1.cc | 494 +
tests/Grid/membytes1.cc | 284 +
tests/Grid/mincongruences1.cc | 214 +
tests/Grid/mingenerators1.cc | 240 +
tests/Grid/outputoperator1.cc | 139 +
tests/Grid/relations1.cc | 180 +
tests/Grid/relations2.cc | 376 +
tests/Grid/removespacedims1.cc | 484 +
tests/Grid/timeelapse1.cc | 340 +
tests/Grid/topclosed1.cc | 336 +
tests/Grid/topclosure1.cc | 93 +
tests/Grid/widening1.cc | 616 +
tests/Grid/writecongruencesystem.cc | 61 +
tests/Makefile.am | 50 +
tests/Makefile.in | 693 +
tests/Partial_Function.cc | 73 +
tests/Partial_Function.defs.hh | 53 +
tests/Partial_Function.inlines.hh | 40 +
tests/Partial_Function.types.hh | 21 +
tests/Polyhedron/Makefile.am | 663 +
tests/Polyhedron/Makefile.in | 4125 ++
tests/Polyhedron/README | 115 +
tests/Polyhedron/addcongruence1.cc | 129 +
tests/Polyhedron/addcongruences1.cc | 166 +
tests/Polyhedron/addconstraint1.cc | 106 +
tests/Polyhedron/addconstraints1.cc | 363 +
tests/Polyhedron/addconstraints2.cc | 93 +
tests/Polyhedron/addgenerator1.cc | 101 +
tests/Polyhedron/addgenerator2.cc | 129 +
tests/Polyhedron/addgenerators1.cc | 336 +
tests/Polyhedron/addgenerators2.cc | 137 +
tests/Polyhedron/addspacedims1.cc | 201 +
tests/Polyhedron/addspacedims2.cc | 248 +
tests/Polyhedron/affineimage1.cc | 265 +
tests/Polyhedron/affineimage2.cc | 74 +
tests/Polyhedron/affinepreimage1.cc | 437 +
tests/Polyhedron/affinetrans.cc | 81 +
tests/Polyhedron/append1.cc | 108 +
tests/Polyhedron/append2.cc | 129 +
tests/Polyhedron/ascii_dump_load1.cc | 601 +
tests/Polyhedron/ascii_dump_load2.cc | 138 +
tests/Polyhedron/ascii_dump_load3.cc | 433 +
tests/Polyhedron/bgp99extrapolation1.cc | 269 +
tests/Polyhedron/bhrz03widening1.cc | 754 +
tests/Polyhedron/bhrz03widening2.cc | 261 +
tests/Polyhedron/bhrz03widening3.cc | 607 +
tests/Polyhedron/bhz03widening1.cc | 723 +
tests/Polyhedron/bounded1.cc | 106 +
tests/Polyhedron/boundedaffineimage1.cc | 120 +
tests/Polyhedron/boundedaffinepreimage1.cc | 124 +
tests/Polyhedron/boundedbhrz03extrapolation1.cc | 111 +
tests/Polyhedron/boundedh79extrapolation1.cc | 74 +
tests/Polyhedron/boundingbox1.cc | 594 +
tests/Polyhedron/boundingbox2.cc | 50 +
tests/Polyhedron/boundingbox3.cc | 218 +
tests/Polyhedron/bounds1.cc | 64 +
tests/Polyhedron/bug2.cc | 62 +
tests/Polyhedron/cnncconversion1.cc | 103 +
tests/Polyhedron/concatenate1.cc | 283 +
tests/Polyhedron/congruences1.cc | 53 +
tests/Polyhedron/constraints1.cc | 165 +
tests/Polyhedron/contains1.cc | 114 +
tests/Polyhedron/contains2.cc | 176 +
tests/Polyhedron/disjoint1.cc | 145 +
tests/Polyhedron/disjoint2.cc | 132 +
tests/Polyhedron/dualhypercubes.cc | 290 +
tests/Polyhedron/empty1.cc | 50 +
tests/Polyhedron/equals1.cc | 61 +
tests/Polyhedron/exceptions1.cc | 1375 +
tests/Polyhedron/exceptions2.cc | 1098 +
tests/Polyhedron/exceptions3.cc | 242 +
tests/Polyhedron/expandspacedim1.cc | 268 +
tests/Polyhedron/expandspacedim2.cc | 102 +
tests/Polyhedron/foldspacedims1.cc | 336 +
tests/Polyhedron/foldspacedims2.cc | 230 +
tests/Polyhedron/generalizedaffineimage1.cc | 268 +
tests/Polyhedron/generalizedaffineimage2.cc | 559 +
tests/Polyhedron/generalizedaffinepreimage1.cc | 123 +
tests/Polyhedron/generalizedaffinepreimage2.cc | 63 +
tests/Polyhedron/generators1.cc | 234 +
tests/Polyhedron/geomcovers1.cc | 60 +
tests/Polyhedron/h79widening1.cc | 254 +
tests/Polyhedron/h79widening2.cc | 63 +
tests/Polyhedron/intersection1.cc | 516 +
tests/Polyhedron/limitedbhrz03extrapolation1.cc | 66 +
tests/Polyhedron/limitedh79extrapolation1.cc | 273 +
tests/Polyhedron/linearpartition1.cc | 298 +
tests/Polyhedron/linearsystem1.cc | 105 +
tests/Polyhedron/linexpression1.cc | 56 +
tests/Polyhedron/lpproblem1.cc | 764 +
tests/Polyhedron/mapspacedims1.cc | 443 +
tests/Polyhedron/matrix1.cc | 80 +
tests/Polyhedron/max_min1.cc | 138 +
tests/Polyhedron/maxspacedim1.cc | 62 +
tests/Polyhedron/mc91.cc | 117 +
tests/Polyhedron/membytes1.cc | 218 +
tests/Polyhedron/membytes2.cc | 92 +
tests/Polyhedron/memory1.cc | 195 +
tests/Polyhedron/memory2.cc | 222 +
tests/Polyhedron/minconstraints1.cc | 77 +
tests/Polyhedron/minconstraints2.cc | 70 +
tests/Polyhedron/mingenerators1.cc | 85 +
tests/Polyhedron/mingenerators2.cc | 48 +
tests/Polyhedron/nncminimize1.cc | 378 +
tests/Polyhedron/nncminimize2.cc | 80 +
tests/Polyhedron/numberinput1.cc | 341 +
tests/Polyhedron/onepoint.cc | 56 +
tests/Polyhedron/permute.cc | 221 +
tests/Polyhedron/polydifference1.cc | 276 +
tests/Polyhedron/polydifference2.cc | 150 +
tests/Polyhedron/polyhull1.cc | 404 +
tests/Polyhedron/polyhull2.cc | 58 +
tests/Polyhedron/polypowerset1.cc | 382 +
tests/Polyhedron/powerset1.cc | 249 +
tests/Polyhedron/randphull1.cc | 68 +
tests/Polyhedron/randphull2.cc | 131 +
tests/Polyhedron/relations1.cc | 484 +
tests/Polyhedron/relations2.cc | 128 +
tests/Polyhedron/relations3.cc | 294 +
tests/Polyhedron/removespacedims1.cc | 298 +
tests/Polyhedron/removespacedims2.cc | 66 +
tests/Polyhedron/smm1.cc | 149 +
tests/Polyhedron/timeelapse1.cc | 250 +
tests/Polyhedron/timeelapse2.cc | 132 +
tests/Polyhedron/topclosed1.cc | 95 +
tests/Polyhedron/topclosure1.cc | 160 +
tests/Polyhedron/universe1.cc | 164 +
tests/Polyhedron/universe2.cc | 79 +
tests/Polyhedron/watchdog1.cc | 131 +
tests/Polyhedron/writeconsys1.cc | 58 +
tests/Polyhedron/writegensys1.cc | 97 +
tests/Polyhedron/writepolyhedron1.cc | 77 +
tests/Polyhedron/writepolyhedron2.cc | 71 +
tests/Polyhedron/writerelation1.cc | 95 +
tests/Polyhedron/writevariable1.cc | 103 +
tests/Random_Number_Generator.defs.hh | 46 +
tests/Random_Number_Generator.inlines.hh | 90 +
tests/Random_Number_Generator.types.hh | 21 +
tests/files.cc | 49 +
tests/files.hh | 35 +
tests/ppl_test.cc | 137 +
tests/ppl_test.hh | 390 +
tests/print.cc | 158 +
tests/print.hh | 186 +
utils/Makefile.am | 58 +
utils/Makefile.in | 592 +
utils/build_header.in | 102 +
utils/text2cxxarray.in | 61 +
utils/timings.cc | 88 +
utils/timings.hh | 31 +
924 files changed, 437068 insertions(+)
diff --git a/BUGS b/BUGS
new file mode 100644
index 0000000..794468e
--- /dev/null
+++ b/BUGS
@@ -0,0 +1,22 @@
+
+The PPL developers encourage you to report any bugs you find to
+ppl-devel at cs.unipr.it. 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://www.cs.unipr.it/ppl/Bugs/ .
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+ 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
+convey 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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
diff --git a/CREDITS b/CREDITS
new file mode 100644
index 0000000..8bc4e84
--- /dev/null
+++ b/CREDITS
@@ -0,0 +1,222 @@
+
+Authors
+=======
+
+The Parma Polyhedra Library and its documentation is being designed,
+written, debugged and improved by the following people:
+
+
+Current core development team:
+------------------------------
+
+ Roberto Bagnara [1] (University of Parma)
+ Patricia M. Hill [2] (University of Leeds)
+ Enea Zaffanella [3] (University of Parma)
+
+
+Former members of the core development team:
+--------------------------------------------
+
+ Elisa Ricci (former student of the University of Parma) has
+ been a major contributor to the development of
+ the PPL, up until December 2002.
+
+
+Current contributors:
+---------------------
+
+ Abramo Bagnara (Opera Unica) rewrote and generalized the
+ support for checked coefficients. He also
+ wrote the support for extended numbers and is
+ currently writing a new implementation of
+ intervals. He also helps on other design and
+ implementation issues.
+
+ Andrea Cimino (University of Parma) wrote the initial version
+ of our primal simplex solver. He is still
+ working on its refinement and optimization.
+
+ Katy Dobson [4] (University of Leeds) is working on the
+ formalization and definition of algorithms
+ for rational grids.
+
+ Elena Mazzi (University of Parma) has been working on our
+ first implementation of bounded differences
+ and octagons. She also participated in the
+ theoretical and practical work concerning
+ widening operators for weakly relational
+ domains. She is still working on this.
+
+ David Merchat [5] (University of Parma) is helping us with
+ the generation of the library's documentation
+ using Doxygen.
+
+ Matthew Mundell [6] (University of Leeds) is working on the
+ implementation of rational grids. He also
+ helps on other implementation issues.
+
+ Andrea Pescetti (University of Parma) is helping with the
+ library's documentation. Andrea was also one
+ of the four students with which the PPL
+ project started.
+
+ Barbara Quartieri (University of Parma) is working on the
+ implementation of bounded differences
+ and octagons.
+
+ Alessandro Zaccagnini [7] (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:
+------------------
+
+ Irene Bacchi (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.
+
+ Danilo Bonardi (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.
+
+ Giordano Fracasso (University of Parma) wrote the initial version
+ of the support for native and checked integer
+ coefficients.
+
+ Maximiliano Marchesi (University of Parma) helped to improve the
+ documentation for bounded differences.
+
+ Angela Stazzone (former student of the University of Parma)
+ worked on the library's documentation.
+
+
+ Fabio Trabucchi (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 (University of Pisa) worked 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!
+=======
+
+The following people have given important help to the project:
+
+ 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.
+
+ Marco Comini [8] (University of Udine) allowed us to use his
+ Mac OS X machine to work on portability to
+ that platform.
+
+ Bruno Haible [9] (ILOG) made it possible (by writing the
+ AC_LIB_LINKFLAGS macro and explaining how
+ to use it) to allow the use of versions of the
+ GMP library installed into nonstandard places.
+
+ Bertrand Jeannet [10] (IRISA) wrote the New Polka library [11]
+ and made it available.
+
+ Herve' Le Verge (r.i.p.) wrote and published an implementation
+ [12] of the Chernikova's algorithm [13] that
+ has set the stage for subsequent
+ implementation work, including our own.
+
+ Francesco Logozzo [14] (Ecole Polytechnique) helped us straighten
+ out some portability issues on Cygwin.
+
+ Costantino Medori [15] (University of Parma) helped us on the
+ mathematical aspects of the development.
+
+ Fred Mesnard [16] (University of La Reunion), the main author
+ of cTI [17], has worked with us at 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 [18] 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 them to
+ analyze the same Prolog programs. Since that
+ systems did not share a single line of code,
+ this gave us excellent opportunities for our
+ initial testing and debugging work.
+
+
+This work has been partly supported by the following projects and
+organizations:
+
+ 1. University of Parma's FIL scientific research project (ex 60%)
+ ``Pure and Applied Mathematics'';
+
+ 2. MURST project ``Automatic Program Certification by Abstract
+ Interpretation'' [19];
+
+ 3. MURST project ``Abstract Interpretation, Type Systems and
+ Control-Flow Analysis''.
+
+ 4. MURST project ``Automatic Aggregate- and Number-Reasoning for
+ Computing: from Decision Algorithms to Constraint Programming
+ with Multisets, Sets, and Maps'' [20].
+
+ 5. MURST project ``Constraint Based Verification of Reactive
+ Systems'' [21].
+
+ 6. MURST project ``AIDA - Abstract Interpretation: Design and
+ Applications'' [22].
+
+ 7. Royal Society Joint project 2004/R1-EU (UK-Italy)
+ ``Automatic Detection of Unstable Numerical Computations''.
+
+ 8. EPSRC (UK) project EP/C520726/1
+ ``Numerical Domains for Software Analysis'' [23].
+
+--------
+
+ [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.comp.leeds.ac.uk/katyd/
+ [5] http://www.cs.unipr.it/~merchat/
+ [6] http://www.mundell.ukfsn.org/
+ [7] http://www.math.unipr.it/~zaccagni/
+ [8] http://www.dimi.uniud.it/~comini/
+ [9] http://www.haible.de/bruno/
+[10] http://www.irisa.fr/prive/Bertrand.Jeannet/
+[11] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html
+[12] http://www.cs.unipr.it/ppl/Documentation/chernikova.c
+[13] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92
+[14] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/
+[15] http://www.math.unipr.it/~medori/
+[16] http://www.univ-reunion.fr/~fred/
+[17] http://www.cs.unipr.it/cTI/
+[18] http://www.cs.unipr.it/China/
+[19] http://theory.sci.univr.it/p40/
+[20] http://www.cs.unipr.it/Projects/COFIN01
+[21] http://www.disi.unige.it/person/DelzannoG/cover/
+[22] http://www.cs.unipr.it/Projects/AIDA/
+[23] http://www.comp.leeds.ac.uk/hill/linda/
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..8d39dd8
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,48803 @@
+2006-03-12 Release Manager
+
+ * PPL 0.9 Released.
+
+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 18:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * debian/changelog (1.4): Updated for PPL 0.9.
+
+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 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: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/: 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 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_double_binary_format.m4 (1.3): Fixed a couple of
+ comments.
+
+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-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 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 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>
+
+ * 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: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 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: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: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>
+
+ * 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 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 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: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 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: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: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-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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (1.6): Take NOISY directive out of
+ AM_CPPFLAGS.
+
+2006-02-01 Wednesday 01:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/README (1.1): Initial revision.
+
+2006-01-31 Tuesday 19:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (1.4): Move variables to a local namespace.
+
+2006-01-31 Tuesday 19:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/bounds1.cc (1.3): Add space dimension exception test.
+
+2006-01-31 Tuesday 19:08 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: expandspacedim1.cc (1.3), foldspacedims1.cc (1.3):
+ Add tests of exception cases.
+
+2006-01-31 Tuesday 13:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/concatenate1.cc (1.3): Add possible space dimension
+ exception test.
+
+2006-01-31 Tuesday 13:09 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_chdims.cc (1.4): Correct exception message in
+ expand_space_dimension.
+
+2006-01-30 Monday 20:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator.defs.hh (1.7): Correct the Grid class friend
+ declaration comment.
+
+2006-01-30 Monday 13:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_widenings.cc (1.3): Correct the exception message in
+ method widening_assign.
+
+2006-01-30 Monday 10:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/join3.cc (1.3): Add test of space dimension exception.
+
+2006-01-30 Monday 10:02 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (1.4): Add tests for adding to an
+ empty grid.
+
+2006-01-30 Monday 09:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (1.3): Add more zero dimension tests.
+
+2006-01-28 Saturday 18:20 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/congruence1.cc (1.3): Add space dimension exception
+ test.
+
+2006-01-27 Friday 19:23 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/bounded1.cc (1.3): Add test13, where a paramter comes
+ first in the system.
+
+2006-01-27 Friday 19:22 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (1.3): Add zero dimension and space
+ dimension exception tests.
+
+2006-01-27 Friday 19:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (1.4): Drop the extra
+ topological_closure_assign and difference_assign PPL namespace
+ qualifiers.
+
+2006-01-27 Friday 14:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (1.6): Drop the extra rows_are_zero Grid
+ namespace qualifier.
+
+2006-01-27 Friday 14:42 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * doc/devref.doxyconf-latex.in (1.9): Clip trailing whitespace.
+ Add grid-related files.
+
+2006-01-27 Friday 14:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/relations1.cc (1.4): Add zero dim universe test test9.
+
+2006-01-26 Thursday 23:24 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am (1.3), isempty1.cc (1.1): Add isempty1,
+ which tests is_empty().
+
+2006-01-26 Thursday 23:20 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/relations1.cc (1.3): Add test8, of the space dimension
+ exception.
+
+2006-01-26 Thursday 21:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.4): Improve the relation_with(cg) zero dim
+ case a little.
+
+2006-01-26 Thursday 18:25 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.cc (1.3): Take old alternative code out of
+ ascii_load.
+
+2006-01-26 Thursday 14:50 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.191): Update anchor names in references in
+ the grids sections.
+
+2006-01-26 Thursday 13:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator_System.defs.hh (1.3): Correct
+ add_universe_rows_and_columns doc.
+
+2006-01-26 Thursday 13:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * TODO (1.177): Complete some grid items, move rest into section 1.
+
+2006-01-25 Wednesday 21:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (1.3): Convert final FIX to a FIXME.
+
+2006-01-25 Wednesday 21:46 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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: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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/generalizedaffinepreimage2.cc (grids.6): Correct the
+ expected results in test17, test18, test21 and test22.
+
+2006-01-25 Wednesday 16:33 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/generalizedaffinepreimage1.cc (grids.7): Enable test6
+ and test7, and adjust their expected results.
+
+2006-01-25 Wednesday 16:32 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/generalizedaffineimage2.cc (grids.7): Correct the
+ expected result in test18.
+
+2006-01-25 Wednesday 16:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.40): Slightly improve comments,
+ error messages and formatting.
+
+2006-01-24 Tuesday 13:33 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.39): Improve comments in both
+ conversion methods.
+
+2006-01-24 Tuesday 11:52 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.37): Leave variable name
+ tem_source_index as such.
+
+2006-01-24 Tuesday 00:20 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (grids.61): Note a possible todo item in the
+ congruence simplify method.
+
+2006-01-23 Monday 23:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (grids.99): Correct the description of
+ reduce_parameter_with_line.
+
+2006-01-23 Monday 15:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * TODO (grids.18): Complete the ascii_dump item.
+
+2006-01-23 Monday 12:33 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.defs.hh (grids.12): Take out the Grid friend
+ declaration.
+
+2006-01-22 Sunday 22:38 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addconstraint1.cc (grids.3): Correct test name in
+ message.
+
+2006-01-22 Sunday 22:38 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator_System.cc (grids.28): Declare old_num_rows in
+ recycling_insert const.
+
+2006-01-22 Sunday 22:18 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.inlines.hh (grids.23): Correct
+ is_equal_at_dimension.
+
+2006-01-22 Sunday 22:15 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (grids.96): Improve the description of
+ reduce_line_with_line a little.
+
+2006-01-21 Saturday 19:39 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (grids.50): Correct a comment in the
+ generator system simplify.
+
+2006-01-20 Friday 23:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (grids.48): Add a rough query to
+ reduce_pc_with_pc.
+
+2006-01-20 Friday 18:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.22): Improve the comment about
+ cong_test4.
+
+2006-01-20 Friday 18:08 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * debian/: control (ppl-0_8-branch.1), control (1.13): Update
+ libppl-dev to depend on the system compiler.
+
+2006-01-20 Friday 14:23 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/rules (ppl-0_8-branch.1): Correct version parsing sed
+ expression.
+
+2006-01-20 Friday 14:17 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/rules (1.10): Correct version parsing sed expression.
+
+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 <mattm at comp.leeds.ac.uk>
+
+ * 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 01:06 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * debian/rules (1.9): Use the system C and C++ compilers.
+
+2006-01-20 Friday 01:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/control (1.12): Revert to the stable distribution (sarge)
+ dependencies.
+
+2006-01-20 Friday 00:59 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/changelog (1.3): Add entry for 0.8 release.
+
+2006-01-20 Friday 00:25 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator_System.defs.hh (grids.21): Improve the
+ add_universe_rows_and_columns description.
+
+2006-01-20 Friday 00:24 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Makefile.am (grids.5): Run the grid tests before the
+ others.
+
+2006-01-19 Thursday 18:24 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/Makefile.am (grids.9): Correct temporary
+ BD_SHAPE_INSTANCE values.
+
+2006-01-19 Thursday 16:59 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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:25 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/congruencesystem1.cc (grids.10): Revert change made
+ during testing.
+
+2006-01-17 Tuesday 20:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid4.cc (grids.2): Clear out tracing messages.
+
+2006-01-17 Tuesday 20:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * README (1.42): Change "source distributions" to "source
+ distribution".
+
+2006-01-17 Tuesday 12:58 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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: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 <mattm at comp.leeds.ac.uk>
+
+ * src/Powerset.defs.hh (1.19): Document the requirements for
+ template parameter D.
+
+2006-01-17 Tuesday 01:13 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (1.186): Revert last change.
+
+2006-01-14 Saturday 22:17 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * NEWS (1.177): Always indent code with two spaces. Convert tabs
+ to spaces.
+
+2006-01-14 Saturday 16:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * Watchdog/NEWS (1.7): Add detail to the 0.5 Time entry.
+
+2006-01-14 Saturday 15:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * TODO (1.170): Add Debian package TODO list.
+
+2006-01-13 Friday 14:19 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/control.prologs (1.1): Initial revision.
+
+2006-01-13 Friday 14:19 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/GNU/README (1.2): Clip trailing whitespace.
+
+2006-01-12 Thursday 22:42 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl-pwl.install (1.3): Add usr/lib/libpwl.so.
+
+2006-01-12 Thursday 22:42 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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:39 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * debian/rules (1.8): Correct the ppl-config source directory.
+ Improve two comments.
+
+2006-01-12 Thursday 16:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl.install (1.4): Add ppl_lpsol and the manual pages.
+
+2006-01-12 Thursday 16:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl.dirs (1.3): Add usr/share/man/man1.
+
+2006-01-12 Thursday 16:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl-pwl.install (1.2): Move pwl.hh to libppl-dev.
+
+2006-01-12 Thursday 16:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl-dev.install (1.2): Add the header files.
+
+2006-01-12 Thursday 16:28 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/control (1.9): Add glpk to Build-Depends.
+
+2006-01-12 Thursday 13:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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:02 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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: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 <mattm at comp.leeds.ac.uk>
+
+ * 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: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>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Matrix.defs.hh (grids.7): Take out old grid includes and
+ declaration.
+
+2006-01-06 Friday 18:13 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/affinepreimage1.cc (grids.10): Add two simple tests.
+
+2006-01-03 Tuesday 16:36 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.128): Take the empty flag query out of
+ add_recycled_generators.
+
+2006-01-03 Tuesday 16:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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: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/: 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 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.126): Enable the all-zero parameter OK
+ check.
+
+2005-12-23 Friday 15:48 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Matrix.defs.hh (grids.6): Correct typo in add_recycled_row
+ description.
+
+2005-12-22 Thursday 13:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator_System.cc (grids.23): Improve the insert query
+ about wrapping an NNC generator.
+
+2005-12-22 Thursday 13:08 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/ppl_test.hh (grids.16): Make parens in find_variation
+ messages consistent.
+
+2005-12-21 Wednesday 17:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.32): Correct a comment in the
+ congruence to generator conversion.
+
+2005-12-21 Wednesday 14:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/generator1.cc (grids.4): Enable test5 (comparison of
+ parameters that have divisors > 1).
+
+2005-12-20 Tuesday 21:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/relations1.cc (grids.6): Use parameter divisors in
+ test6 and test7.
+
+2005-12-20 Tuesday 21:48 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/join1.cc (grids.12): Correct the expected result in
+ test4.
+
+2005-12-20 Tuesday 21:47 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/isuniverse1.cc (grids.8): Correct the fail case in
+ test10.
+
+2005-12-20 Tuesday 21:46 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/congruencesystem2.cc (grids.11): Use parameter
+ divisors.
+
+2005-12-20 Tuesday 21:45 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, copyconstruct1.cc (grids.[54,1]): Add
+ copyconstruct1, to test Grid copy construction.
+
+2005-12-19 Monday 20:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.61): Enable the system equality
+ checks in quick_equivalence_test.
+
+2005-12-17 Saturday 01:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (grids.48): Add note for map_space_dimensions
+ code awaiting parameter divisors.
+
+2005-12-16 Friday 23:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.118): Improve relation descriptions in
+ relation_with(cg).
+
+2005-12-16 Friday 23:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator.defs.hh (grids.14): Move Grid_Generator(g) to
+ the private section.
+
+2005-12-15 Thursday 14:14 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/generator1.cc (grids.2): Insert test8, to check
+ construction from a Generator reference.
+
+2005-12-03 Saturday 15:09 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, generator1.cc (grids.[53,1]): Add
+ generator1, to test Grid_Generator.
+
+2005-12-03 Saturday 12:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.defs.hh (grids.10): Keep the Grid friend
+ declaration.
+
+2005-12-03 Saturday 12:13 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/: Grid_Generator.defs.hh, Grid_Generator.inlines.hh
+ (grids.[9,8]): Add access operators.
+
+2005-12-02 Friday 17:38 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator.defs.hh (grids.8): Keep the Grid friend
+ declaration.
+
+2005-12-01 Thursday 22:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/join1.cc (grids.10): Turn off test4 (includes ray
+ insertion), for now.
+
+2005-12-01 Thursday 22:34 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.108): Revert is_universe to create a
+ generator for each dimension.
+
+2005-12-01 Thursday 22:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.28): Improve a comment slightly.
+
+2005-12-01 Thursday 22:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Generator.inlines.hh (grids.6): Add a temporary note.
+
+2005-12-01 Thursday 22:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.14): Update test4 to add all
+ generators.
+
+2005-12-01 Thursday 19:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.27): Update upper_triangular to use
+ Generator instead of Grid_Generator.
+
+2005-12-01 Thursday 18:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.23): Turn of ray test for now.
+
+2005-11-30 Wednesday 20:09 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/: Grid_Generator.cc, Grid_Generator.defs.hh (grids.[2,3]):
+ Add OK method.
+
+2005-11-30 Wednesday 19:53 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.13): Add only NC generators
+ for now.
+
+2005-11-30 Wednesday 17:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (grids.34): Compare to zero explicitly
+ in normalize_moduli.
+
+2005-11-28 Monday 21:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_widenings.cc (grids.10): Improve a comment slightly.
+
+2005-11-28 Monday 16:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.inlines.hh (grids.11): Align comment.
+
+2005-11-28 Monday 13:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.100): Leave congruences as they are
+ (update_generators will simplify them).
+
+2005-11-27 Sunday 18:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.99): Assert false if relation_with(cg)
+ finds a closure point.
+
+2005-11-27 Sunday 18:05 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Row.defs.hh (grids.7): Take out the Grid friend declaration.
+
+2005-11-27 Sunday 18:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Polyhedron_public.cc (grids.9): Note a possible improvement
+ in add_congruences(cgs).
+
+2005-11-27 Sunday 18:02 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Constraint.defs.hh (grids.9): Take out the Congruence_System
+ friend declaration.
+
+2005-11-27 Sunday 17:52 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * STANDARDS (grids.8): Take out section "Standards for the Test
+ Programs".
+
+2005-11-25 Friday 15:53 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Row.defs.hh (grids.6): Take out the Congruence_System friend
+ declaration.
+
+2005-11-25 Friday 14:08 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Polyhedron_public.cc (grids.8): Take out a query that relates
+ to the trunk.
+
+2005-11-25 Friday 14:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/affinepreimage1.cc (grids.7): Simplify a congruence in
+ test8.
+
+2005-11-25 Friday 14:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Matrix.cc (grids.6): Improve a comment in add_recycled_row.
+
+2005-11-25 Friday 11:42 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (grids.82): Improve the update_congruences() and
+ minimize() descriptions.
+
+2005-11-24 Thursday 13:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.defs.hh (grids.31): Take out Polyhedron friend
+ declaration.
+
+2005-11-24 Thursday 13:14 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.25): Move TRACE definition into the
+ PPL namespace. #undef TRACE afterwards.
+
+2005-11-24 Thursday 12:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.48): In bounds(expr,char*) use
+ Generator::is_line_or_ray.
+
+2005-11-24 Thursday 12:05 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.24): Replace the tracing stream
+ with cerr and macro TRACE.
+
+2005-11-23 Wednesday 20:53 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.cc (grids.17): Re-enable the OK assertion.
+
+2005-11-23 Wednesday 20:51 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.defs.hh (grids.20): Make
+ has_linear_equalities public.
+
+2005-11-23 Wednesday 17:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Checked_Number.inlines.hh (grids.7): Update policy
+ ROUND_DEFAULT to ROUND_DEFAULT_FUNCTION.
+
+2005-11-23 Wednesday 17:33 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Linear_Expression.defs.hh (grids.7): Declare
+ Congruence_System a friend.
+
+2005-11-23 Wednesday 17:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.cc (grids.16): Include compiler.hh. Resolve
+ two merge conflicts.
+
+2005-11-23 Wednesday 17:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.23): Improve two comments.
+
+2005-11-22 Tuesday 11:34 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/: Grid.defs.hh, Grid_conversion.cc (grids.[80,22]): Make
+ conversion void of return.
+
+2005-11-22 Tuesday 11:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 (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 (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 (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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.21): Reduce the number of known_gr
+ congruences in test15.
+
+2005-11-18 Friday 13:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/intersection2.cc (grids.7): Modify test7 slightly.
+
+2005-11-18 Friday 12:40 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/congruence1.cc (grids.8): Resolve a query (the two
+ grids should be equal).
+
+2005-11-17 Thursday 13:19 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/scalar_products.cc (grids.4): Clean a
+ reduced_scalar_product_assign comment.
+
+2005-11-17 Thursday 12:51 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Matrix.defs.hh (grids.4): Take out old friends.
+
+2005-11-16 Wednesday 18:02 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (grids.34): Correct typo in temporary
+ comment.
+
+2005-11-16 Wednesday 18:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.cc (grids.14): "Use" parameter
+ check_normalization in method `insert'.
+
+2005-11-15 Tuesday 17:17 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, mingenerators1.cc (grids.[52,1]): Add
+ mingenerators1, which tests Grid::minimized_generators().
+
+2005-11-15 Tuesday 15:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.18): Add zero dimension construction
+ tests.
+
+2005-11-14 Monday 17:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, congruences1.cc (grids.[50,1]): Add
+ congrueces1, which tests Grid::congruences().
+
+2005-11-14 Monday 16:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Certificate.cc (grids.6): Use gr instead of cgr, for
+ consistency.
+
+2005-11-14 Monday 16:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/affinepreimage1.cc (grids.6): Correct expected result
+ in test16.
+
+2005-11-11 Friday 15:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.inlines.hh (grids.9): Only qualify the
+ namespace of insert(cg) once.
+
+2005-11-11 Friday 15:32 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.85): Add colon between namespace and
+ class in comment.
+
+2005-11-10 Thursday 21:28 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Generator.defs.hh (grids.9): Keep Congruence_System as a
+ friend.
+
+2005-11-10 Thursday 21:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: affineimage1.cc, affinepreimage1.cc (grids.[7,5]):
+ Add three simple tests.
+
+2005-11-10 Thursday 19:14 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_widenings.cc (grids.6): Rename parameter selected_cgs as
+ cgs_selected.
+
+2005-11-10 Thursday 11:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/contains1.cc (grids.4): Improve comments, messages and
+ a variable name.
+
+2005-11-08 Tuesday 20:22 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (grids.36): Take out is_necessarily_closed()
+ and topology().
+
+2005-11-08 Tuesday 20:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.17): Align copyright line.
+
+2005-11-08 Tuesday 17:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (grids.35): Move box constructors to follow
+ other constructors.
+
+2005-11-08 Tuesday 17:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid3.cc (grids.5): Align copyright line.
+
+2005-11-08 Tuesday 14:07 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addcongruence1.cc (grids.6): Improve title comment.
+ Add namespace with shared Variables.
+
+2005-11-08 Tuesday 13:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/griddifference1 (grids.2): Remove file added in error
+ earlier.
+
+2005-11-07 Monday 18:24 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addconstraints1.cc (grids.9): Add test10, for
+ add_recycled_congruences_and_minimize(cs).
+
+2005-11-07 Monday 18:20 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addconstraints1.cc (grids.8): Add test9, for
+ add_recycled_congruences(cs).
+
+2005-11-07 Monday 18:07 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addconstraints1.cc (grids.7): Add test8, for
+ add_congruences(cs).
+
+2005-11-07 Monday 14:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.defs.hh (grids.16): Narrow a comment.
+
+2005-11-07 Monday 12:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/bounds1.cc (grids.2): Match expected values to updated
+ method behaviour.
+
+2005-11-07 Monday 11:58 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/bounded1.cc (grids.2): Add test12, in which every
+ generator is the same point.
+
+2005-11-04 Friday 11:15 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.75): In is_bounded use the generator
+ system in any form.
+
+2005-11-04 Friday 11:13 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/topclosed1.cc (grids.3): Take out the find_variation
+ directive.
+
+2005-11-04 Friday 11:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * TODO (grids.8): Complete operation is_bounded.
+
+2005-11-02 Wednesday 21:06 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, bounded1.cc (grids.[42,1]): Add
+ bounded1, which tests Grid::is_bounded.
+
+2005-11-02 Wednesday 21:05 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/: Grid.defs.hh, Grid_public.cc (grids.[61,74]): Add method
+ is_bounded.
+
+2005-11-02 Wednesday 20:45 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * TODO (grids.7): Complete operation affine_dimension.
+
+2005-11-02 Wednesday 20:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, affinedim1.cc (grids.[41,1]): Add
+ affinedim1, which tests Grid::affine_dimension().
+
+2005-11-02 Wednesday 11:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * TODO (grids.6): Complete operators is_topologally_closed and
+ shrink_bounding_box.
+
+2005-11-01 Tuesday 18:44 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/ppl_test.hh (grids.13): Add function copy_compare(Grid&,
+ Grid&).
+
+2005-11-01 Tuesday 18:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, pointed1.cc (grids.[40,1]): Add
+ pointed1, which tests Grid::is_pointed().
+
+2005-11-01 Tuesday 18:40 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.70): Implement method
+ is_topologically_closed.
+
+2005-11-01 Tuesday 14:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/boundingbox2.cc (grids.2): Improve comment slightly.
+
+2005-10-30 Sunday 00:42 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/boundingbox1.cc (grids.7): Note that boundingbox2 also
+ tests the constructor under test.
+
+2005-10-29 Saturday 20:15 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/globals.defs.hh (grids.4): Add tag class From_Covering_Box.
+
+2005-10-26 Wednesday 16:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * configure.ac (1.195): Set text_md5sum, to complete last change.
+
+2005-10-24 Monday 11:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, coveringbox1.cc (grids.[36,1]): Add
+ coveringbox1, which tests get_covering_box.
+
+2005-10-21 Friday 21:25 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_Certificate.cc (grids.4): Finalise calculation of number
+ of congruences from number of generators.
+
+2005-10-21 Friday 21:25 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/numberinput1.cc (1.12): Include cstdlib.
+
+2005-10-18 Tuesday 23:28 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/checked_int.inlines.hh (1.39): Clip trailing spaces.
+
+2005-10-06 Thursday 11:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/GMP_Integer.defs.hh (grids.5): Take `inline' out of gcdext
+ declarations.
+
+2005-10-06 Thursday 11:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/minimize.cc (1.42): Indent note consistently.
+
+2005-10-04 Tuesday 14:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <merchat at cs.unipr.it>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/matrix1.cc (1.4): Correct spelling.
+
+2005-09-26 Monday 15:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/checked.defs.hh (1.24): Indent arguments to function
+ declaration macros consistently.
+
+2005-09-26 Monday 15:24 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.283): Correct grammar.
+
+2005-09-22 Thursday 17:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/matasciidumpload1.cc (1.3): Correct the
+ numeric_limits instantiation. Only allow valid modulation.
+
+2005-09-22 Thursday 13:09 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.cc (1.9): Align argument indentation of
+ affine_image.
+
+2005-09-21 Wednesday 12:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * configure.ac (1.179): Add tests/Matrix/Makefile to
+ AC_CONFIG_FILES.
+
+2005-09-21 Wednesday 12:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Makefile.am (1.244): Add Matrix to SUBDIRS.
+
+2005-09-21 Wednesday 12:44 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * configure.ac (1.178): Indent all lines with spaces in
+ AC_CONFIG_FILES.
+
+2005-09-20 Tuesday 19:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/checked.inlines.hh (grids.4): Take a redundant assignment out
+ of gcdext_generic.
+
+2005-09-20 Tuesday 19:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Native_Integer.inlines.hh (grids.3): Take a redundant
+ assignment out of gcdext.
+
+2005-09-20 Tuesday 19:28 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.67): Improve temporary comment.
+
+2005-09-20 Tuesday 19:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, boundingbox1.cc (grids.[34,1]): Add
+ boundingbox1, which tests Grid(Box& box).
+
+2005-09-20 Tuesday 19:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.30): Correct grammar in notes.
+
+2005-09-19 Monday 19:06 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/BD_Shape.defs.hh (1.29): Clip trailing whitespace.
+
+2005-09-19 Monday 18:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/checked.cc (1.5): In parse_number1 parse the exponent in the
+ FRACTIONAL case.
+
+2005-09-19 Monday 17:11 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/affineimage6.cc (1.6): Neaten expression
+ formatting.
+
+2005-09-19 Monday 17:11 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/addspacedims3.cc (1.6): Correct argument in
+ print_generators message.
+
+2005-09-19 Monday 17:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/BD_Shape/Makefile.am (1.15): Clip trailing whitespace.
+
+2005-09-19 Monday 17:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/checked.cc (1.4): Use `true' to evaluate true. Clip trailing
+ whitespace.
+
+2005-09-19 Monday 17:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Polyhedron_widenings.cc (1.47): Correct variable names in
+ H79_widening_assign comments.
+
+2005-09-19 Monday 17:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Polyhedron.defs.hh (1.281): Markup parameter in description.
+
+2005-09-19 Monday 16:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Linear_System.defs.hh (1.16): Reformat comment.
+
+2005-09-19 Monday 16:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addcongruence1.cc (grids.5): Only call find_variation
+ on the grid under test.
+
+2005-09-18 Sunday 19:39 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/print.cc (grids.4): Include Congruence_System definitions.
+
+2005-09-18 Sunday 19:38 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/Makefile.am (grids.7): Add derived tests for the
+ congruence adding tests.
+
+2005-09-13 Tuesday 19:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Polyhedron/addcongruence2.cc (grids.2): Use C_Polyhedron
+ instead of NNC_Polyhedron.
+
+2005-09-13 Tuesday 18:57 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/: print.cc, print.hh (grids.[3,6]): Add
+ print_constraints(cgs).
+
+2005-09-13 Tuesday 17:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (grids.46): Correct two descriptions.
+
+2005-09-13 Tuesday 15:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.33): List related tests in TESTS on
+ single lines.
+
+2005-09-13 Tuesday 15:52 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.defs.hh (grids.20): Declare Polyhedron a friend.
+
+2005-09-13 Tuesday 15:46 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/: Constraint.cc, Constraint.defs.hh (grids.[3,4]): Add
+ ascii_dump(s).
+
+2005-09-13 Tuesday 15:44 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addconstraints1.cc (grids.5): Add test7 (adds an NNC
+ constraint).
+
+2005-09-12 Monday 16:17 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * STANDARDS (1.23): Add coding standard entries for negation and
+ comparison to zero.
+
+2005-09-12 Monday 14:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/widening1.cc (grids.5): Add test15, to show problems
+ with using the Halbwachs method.
+
+2005-09-06 Tuesday 16:23 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_widenings.cc (grids.4): Add space between sentences.
+
+2005-09-06 Tuesday 15:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, certificate1.cc (grids.[32,1]): Add
+ certificate1, which tests class Grid_Certificate.
+
+2005-09-06 Tuesday 13:19 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, contains2.cc (grids.[31,1]): Add
+ contains2, which tests strictly_contains.
+
+2005-09-06 Tuesday 13:19 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/contains1.cc (grids.2): Improve failure messages.
+
+2005-09-06 Tuesday 13:07 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/congruence1.cc (grids.6): Add colons to messages.
+
+2005-09-05 Monday 22:50 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, bhz03widening1.cc (grids.[30,1]): Add
+ an initial bhz03widening1.
+
+2005-09-05 Monday 22:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.32): Shorten two comments.
+
+2005-09-05 Monday 22:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/generalizedaffinepreimage1.cc (grids.4): Correct the
+ known grids in test3, test4 and test5.
+
+2005-09-04 Sunday 21:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addconstraints1.cc (grids.4): Comment the end of the
+ namespace block.
+
+2005-09-04 Sunday 20:57 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.64): Implement join_assign_if_exact.
+
+2005-09-04 Sunday 19:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/join1.cc (grids.7): Use upper_bound_assign in some of
+ the tests.
+
+2005-09-03 Saturday 12:44 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/writecongruencesystem.cc (grids.4): Use a single equal
+ sign in the expected output string.
+
+2005-09-03 Saturday 11:17 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.inlines.hh (grids.12): Compute the row capacity in
+ Congruence(c).
+
+2005-09-02 Friday 18:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, addconstraints1.cc (grids.[27,1]): Add
+ addconstraints1.
+
+2005-09-02 Friday 18:53 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.inlines.hh (grids.10): Check for all cases of
+ trivially true congruences.
+
+2005-09-02 Friday 11:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.27): Take tracing out of
+ is_included_in.
+
+2005-09-01 Thursday 15:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (grids.20): Take tracing out of
+ satisfies_all_congruences.
+
+2005-09-01 Thursday 15:23 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_chdims.cc (grids.15): Use correct domain in comment.
+
+2005-09-01 Thursday 15:20 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (grids.38): Mark up parameter description
+ correctly.
+
+2005-08-31 Wednesday 18:08 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (grids.6): Correct spelling of anchor.
+
+2005-08-31 Wednesday 17:19 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * doc/definitions.dox (grids.5): Clip trailing whitespace.
+
+2005-08-31 Wednesday 17:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Makefile.am (grids.5): Add grid_widenings.cc to
+ libppl_la_SOURCES.
+
+2005-08-31 Wednesday 17:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, limitedextrapolation1.cc
+ (grids.[26,1]): Add limitedextrapolation1.
+
+2005-08-25 Thursday 18:36 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (grids.12): Swap dim_kinds in method swap.
+
+2005-08-23 Tuesday 22:07 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, widening1.cc (grids.[25,1]): Add
+ widening1.
+
+2005-08-23 Tuesday 22:06 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, timeelapse1.cc (grids.[24,1]): Add
+ timeelapse1.
+
+2005-08-18 Thursday 20:45 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.51): Enable method time_elapse_assign.
+
+2005-08-18 Thursday 20:44 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.25): Improve temporary comment.
+
+2005-08-18 Thursday 15:34 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/griddifference1.cc (grids.2): Add test10.
+
+2005-08-18 Thursday 12:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/: Grid.defs.hh, Grid_public.cc (grids.[35,49]): Add the
+ generalized_affine_preimage methods.
+
+2005-08-18 Thursday 12:16 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (grids.19): Add a comment.
+
+2005-08-18 Thursday 12:15 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, griddifference1.cc (grids.[22,1]): Add
+ griddifference1.
+
+2005-08-16 Tuesday 11:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/generalizedaffineimage2.cc (grids.2): Add test22.
+
+2005-08-11 Thursday 17:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, generalizedaffineimage2.cc
+ (grids.[21,1]): Add generalizedaffineimage2.
+
+2005-08-11 Thursday 17:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/intersection1.cc (grids.2): In test8 leave
+ minimization to intersection_assign.
+
+2005-08-11 Thursday 17:20 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (grids.33): Improve some descriptions.
+
+2005-08-09 Tuesday 16:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/mapspacedims1.cc (grids.7): Correct comment.
+
+2005-08-09 Tuesday 16:36 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, generalizedaffineimage1.cc
+ (grids.[20,1]): Add generalizedaffineimage1.
+
+2005-08-08 Monday 19:59 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.cc (grids.10): Call
+ remove_invalid_lines_and_rays when grid is true.
+
+2005-08-03 Wednesday 20:36 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, foldspacedims1.cc (grids.[19,1]): Add
+ foldspacedims1.
+
+2005-08-03 Wednesday 20:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/affineimage1.cc (grids.2): Format linear expressions
+ consistently.
+
+2005-08-02 Tuesday 19:42 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, affinepreimage1.cc (grids.[18,1]): Add
+ affinepreimage1.
+
+2005-08-02 Tuesday 19:41 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.44): Enable affine_preimage.
+
+2005-08-01 Monday 18:32 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, affineimage1.cc (grids.[17,1]): Add
+ affineimage1.
+
+2005-08-01 Monday 18:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/: Linear_Row.cc, Linear_Row.defs.hh (grids.[3,3]): Add method
+ ascii_dump().
+
+2005-08-01 Monday 18:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/relations2.cc (grids.2): Add test4 to test8.
+
+2005-07-27 Wednesday 13:17 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/expandspacedim1.cc (grids.2): Indent the copyright
+ line.
+
+2005-07-14 Thursday 20:52 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, relations1.cc, relations2.cc
+ (grids.[16,1,1]): Add relations1 and relations2.
+
+2005-07-14 Thursday 20:51 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/: Congruence_System.cc, Congruence_System.defs.hh
+ (grids.[17,12]): Add method insert_verbatim.
+
+2005-07-13 Wednesday 14:58 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, expandspacedim1.cc (grids.[15,1]): Add
+ expandspacedim1.
+
+2005-07-13 Wednesday 14:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: grid1.cc, grid2.cc (grids.[17,13]): Match tests to
+ revised Chiara algorithm tests.
+
+2005-07-11 Monday 17:47 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: Makefile.am, equals1.cc (grids.[14,1]): Add equals,
+ which tests operator== and operator!=.
+
+2005-07-08 Friday 19:58 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/mapspacedims1.cc (grids.5): Correct test7 expected
+ result. Print test name from all tests.
+
+2005-07-08 Friday 19:57 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/congruencesystem2.cc (grids.5): Add another line test,
+ and some temporary comments.
+
+2005-07-08 Friday 19:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.8): Correct test3 expected
+ result.
+
+2005-07-08 Friday 19:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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: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 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: addspacedims2.cc, removespacedims1.cc,
+ removespacedims2.cc (grids.[4,3,3]): Correct known_gr.
+
+2005-06-27 Monday 13:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.7): Improve comment.
+
+2005-06-14 Tuesday 15:22 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/ppl_test.hh (grids.7): Print ASCII dump of a when loading
+ it fails.
+
+2005-06-14 Tuesday 15:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.34): Improve comment.
+
+2005-06-10 Friday 18:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.15): Take tracing out of test20.
+
+2005-06-10 Friday 18:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.13): Move bug1 to TESTS.
+
+2005-06-10 Friday 18:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/bug1.cc (grids.2): Add header comment, use nout
+ instead of cerr.
+
+2005-06-10 Friday 18:14 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.14): Improve comment.
+
+2005-06-10 Friday 18:05 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Row.defs.hh (grids.3): Declare Congruence_System a friend
+ when EXTRA_ROW_DEBUG.
+
+2005-06-10 Friday 18:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SWI/Makefile.am (grids.2): Revert last change.
+
+2005-06-09 Thursday 12:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.17): In method construct convert
+ rays to lines.
+
+2005-06-08 Wednesday 16:58 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * interfaces/Prolog/SWI/Makefile.am (grids.1): Link against pl in
+ rule ppl_pl$(EXEEXT).
+
+2005-06-07 Tuesday 12:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.defs.hh (grids.19): Make most of the constructors
+ explicit.
+
+2005-06-01 Wednesday 17:07 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.31): In add_generators add rays as
+ lines, for now.
+
+2005-06-01 Wednesday 13:11 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.12): Improve a comment.
+
+2005-05-27 Friday 21:02 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.10): Revert last change.
+
+2005-05-27 Friday 20:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.9): Improve a comment.
+
+2005-05-27 Friday 20:53 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.defs.hh (grids.11): Make zero_dim_false and
+ zero_dim_integrality public.
+
+2005-05-26 Thursday 20:50 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/join2.cc (grids.2): Add test2 which joins with both
+ grids universe.
+
+2005-05-26 Thursday 20:50 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.28): Rename adjust_space_dimension to
+ increase_space_dimension.
+
+2005-05-26 Thursday 20:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addcongruence1.cc (grids.2): Add test2, which adds to
+ an empty grid.
+
+2005-05-26 Thursday 17:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.5): Add test7, which adds a
+ generator to a universe grid.
+
+2005-05-26 Thursday 17:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (grids.20): Improve a variable name, and a
+ comment.
+
+2005-05-26 Thursday 16:58 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addspacedims1.cc (grids.6): Improve comment.
+
+2005-05-25 Wednesday 21:18 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.11): Add test addcongruence1.
+
+2005-05-25 Wednesday 20:47 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addcongruence1.cc (grids.1): Initial revision.
+
+2005-05-25 Wednesday 20:46 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.4): Add test6, which tests
+ add_generator_and_minimize.
+
+2005-05-25 Wednesday 19:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.3): Add tests 2 to 5.
+
+2005-05-25 Wednesday 14:48 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.8): Start from the universe when
+ constructing grids from congruences.
+
+2005-05-25 Wednesday 14:46 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_minimize.cc (grids.10): Take out tracing.
+
+2005-05-24 Tuesday 18:13 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.21): Output "true" from operator<< if
+ the grid is universe.
+
+2005-05-24 Tuesday 17:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.10): Add test addgenerator1.
+
+2005-05-24 Tuesday 16:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addgenerator1.cc (grids.1): Initial revision.
+
+2005-05-24 Tuesday 16:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/mapspacedims1.cc (grids.2): Add test5.
+
+2005-05-23 Monday 15:51 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.9): Add test mapspacedims1.
+
+2005-05-20 Friday 09:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/mapspacedims1.cc (grids.1): Initial revision.
+
+2005-05-20 Friday 09:11 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid.inlines.hh (grids.7): Enable and implement method
+ map_space_dimensions.
+
+2005-05-19 Thursday 09:35 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.8): Add test concatenate1.
+
+2005-05-15 Sunday 10:34 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/concatenate1.cc (grids.1): Initial revision.
+
+2005-05-15 Sunday 10:33 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/removespacedims1.cc (grids.2): Take out trace dumping.
+
+2005-05-15 Sunday 10:32 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addspacedims1.cc (grids.3): Shorten comments.
+
+2005-05-15 Sunday 10:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.15): Add loading of the minimize flag
+ to ascii_load.
+
+2005-05-15 Sunday 10:16 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_chdims.cc (grids.5): Enable and implement
+ concatenate_assign.
+
+2005-05-15 Sunday 10:13 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.7): Add test removespacedims1.
+
+2005-05-12 Thursday 18:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/removespacedims1.cc (grids.1): Initial revision.
+
+2005-05-12 Thursday 18:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.12): Clean comments and take out
+ tracing in normalize_divisors.
+
+2005-05-12 Thursday 18:09 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_chdims.cc (grids.4): Enable and implement
+ add_space_dimensions.
+
+2005-05-12 Thursday 18:07 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.defs.hh (grids.8): Take doxygen \p's out of maths
+ environments.
+
+2005-05-12 Thursday 14:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.defs.hh (grids.7): Escape %'s in maths
+ environments.
+
+2005-05-12 Thursday 14:13 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Makefile.am (grids.3): Add Congruence, Congruence_System and
+ Grid files to DOC_FILES.
+
+2005-05-12 Thursday 13:15 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.6): Add test removespacedims2.
+
+2005-05-11 Wednesday 20:17 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/removespacedims2.cc (grids.1): Initial revision.
+
+2005-05-11 Wednesday 20:16 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.11): Enable
+ remove_pending_to_obtain_generators.
+
+2005-05-11 Wednesday 20:15 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.5): Add tests isuniverse1 and
+ addspacedims2.
+
+2005-05-11 Wednesday 17:16 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: addspacedims2.cc, isuniverse1.cc (grids.[1,1]):
+ Initial revision.
+
+2005-05-11 Wednesday 17:07 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.13): Enable and finish off is_universe.
+
+2005-05-11 Wednesday 17:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.4): Add tests addspacedims1,
+ intersection1, intersection2, join1 and join2.
+
+2005-05-09 Monday 12:39 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/addspacedims1.cc (grids.1): Initial revision.
+
+2005-05-09 Monday 12:36 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.6): Add test13 (an empty grid
+ constructed with congruences).
+
+2005-05-09 Monday 12:32 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.10): Add test19 (a generator system
+ with only a line).
+
+2005-05-09 Monday 12:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/print.hh (grids.2): Declare nout and vnout static.
+
+2005-05-09 Monday 12:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Makefile.am (grids.2): Add Grid_chdims.cc to
+ libppl_la_SOURCES.
+
+2005-05-09 Monday 12:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.10): Take out some tracing. Update
+ comments left from Polyhedron.
+
+2005-05-09 Monday 12:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.9): Correct method name typo.
+
+2005-05-06 Friday 11:39 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_nonpublic.cc (grids.9): Normalise moduli before
+ simplifying in construct. Correct some comments.
+
+2005-05-06 Friday 11:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_minimize.cc (grids.9): Reorder method definitions. Add
+ some temporary comments.
+
+2005-05-06 Friday 11:22 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.3): Add grid3_SOURCES and add grid3
+ to TESTS.
+
+2005-05-05 Thursday 10:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid3.cc (grids.1): Initial revision.
+
+2005-05-05 Thursday 10:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_minimize.cc (grids.8): Take out tracing, add a comment.
+
+2005-05-05 Thursday 10:34 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/: grid1.cc, grid2.cc (grids.[9,5]): Convert comments
+ to C++ style.
+
+2005-05-04 Wednesday 15:04 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_simplify.cc (grids.10): Turn off tracing.
+
+2005-05-03 Tuesday 15:01 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.inlines.hh (grids.3): Take old comment out
+ of resize_no_copy.
+
+2005-04-26 Tuesday 20:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/: Generator.defs.hh, Generator.inlines.hh (grids.[2,1]): Add
+ is_virtual.
+
+2005-04-26 Tuesday 20:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.defs.hh (grids.3): Correct comment.
+
+2005-04-26 Tuesday 20:26 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_conversion.cc (grids.3): Rename the trace stream ctrace.
+
+2005-04-25 Monday 18:42 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/GMP_Integer.defs.hh (grids.2): Improve comment.
+
+2005-04-25 Monday 13:03 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.2): Add general test cong_test4.
+
+2005-04-21 Thursday 12:30 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.2): Add grid2_SOURCES, and add
+ grid2 to TESTS.
+
+2005-04-21 Thursday 12:29 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid2.cc (grids.1): Initial revision.
+
+2005-04-21 Thursday 12:28 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.5): Add test14 which uses larger
+ numbers than the existing tests.
+
+2005-04-19 Tuesday 14:22 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Linear_Row.cc (grids.1): Note the virtual row in
+ Flags::ascii_dump.
+
+2005-04-19 Tuesday 14:15 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/grid1.cc (grids.3): Take out tracing. Enable
+ comparison to known grid in test1.
+
+2005-04-15 Friday 18:51 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * tests/ppl_test.hh (grids.4): ASCII dump `a'.
+
+2005-04-15 Friday 18:49 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Grid/Makefile.am (grids.1): Initial revision.
+
+2005-04-15 Friday 15:23 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.inlines.hh (grids.3): Take out tracing.
+
+2005-04-15 Friday 15:23 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence.defs.hh (grids.4): Take out inclusion of test
+ file.
+
+2005-04-15 Friday 12:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.cc (grids.1): Add virtual_rows to loading
+ and dumping.
+
+2005-04-15 Friday 10:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * demos/ppl_lcdd/examples/README (1.3): Make "example" plural.
+
+2005-03-31 Thursday 12:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * debian/: libppl-pwl.dirs (1.1), libppl-pwl.docs (1.1),
+ libppl-pwl.install (1.1): Initial revision.
+
+2005-03-31 Thursday 12:02 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * configure.ac (1.160): Add Debian copyright files to
+ AC_CONFIG_FILES. Clean some whitespace.
+
+2005-03-31 Thursday 11:58 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl-pwl.links (1.2): Use libppl-pwl.docs instead of a
+ symlink.
+
+2005-03-31 Thursday 11:56 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl.copyright (1.2): Move to libppl.copyright.in.
+
+2005-03-31 Thursday 11:55 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl.copyright.in (1.1): Initial revision (moved here
+ from libppl.copyright).
+
+2005-03-31 Thursday 11:54 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * doc/README.doc (1.4): Revert accidental previous commit.
+
+2005-03-29 Tuesday 16:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl-dev.doc-base.user (1.1): Initial revision.
+
+2005-03-29 Tuesday 11:45 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl-dev.doc-base (1.2): Make the fields in the first
+ section contiguous. Update HTML directory name.
+
+2005-03-29 Tuesday 11:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * STANDARDS (grids.2): Take out the paragraph about the check_dump
+ function.
+
+2005-03-22 Tuesday 13:00 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Grid_public.cc (grids.2): Define the copy constructor.
+
+2005-03-22 Tuesday 12:53 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Congruence_System.cc (grids.2): Use Congruence::ascii_load.
+
+2005-03-22 Tuesday 12:52 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/: Congruence.cc, Congruence.defs.hh (grids.[2,2]): Add method
+ ascii_load.
+
+2005-03-21 Monday 20:12 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * doc/devref.doxyconf-html.in (grids.1): Add Grid, Congruence and
+ Congruence_System files to INPUT.
+
+2005-03-21 Monday 19:59 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Row.defs.hh (1.93): Take out dot following \brief.
+
+2005-03-21 Monday 19:52 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/Generator_System.defs.hh (grids.1): Declare Grid friendship.
+
+2005-03-21 Monday 19:34 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Generator.defs.hh (grids.1): Declare Grid and
+ Congruence_System as friends.
+
+2005-03-21 Monday 19:33 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * src/Constraint.defs.hh (grids.1): Declare Congruence a friend.
+
+2005-03-21 Monday 19:32 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * src/: GMP_Integer.defs.hh, GMP_Integer.inlines.hh (grids.[1,1]):
+ Add gcdext_assign.
+
+2005-03-21 Monday 19:27 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * tests/Makefile.am (grids.1): Add Grid to SUBDIRS.
+
+2005-03-21 Monday 19:21 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * configure.ac (grids.1): Add tests/Grid/Makefile to
+ AC_CONFIG_FILES.
+
+2005-03-21 Monday 19:09 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl.docs (1.2): TODO is currently for internal use.
+
+2005-03-09 Wednesday 12:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/copyright (1.2): Move to libppl.copyright.
+
+2005-03-09 Wednesday 12:24 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 11:46 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * debian/libppl.install (1.2): Only install the main library
+ (others now installed in interface packages).
+
+2005-03-09 Wednesday 11:45 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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:43 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 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 <mattm at comp.leeds.ac.uk>
+
+ * src/: Generator.defs.hh (1.103), Linear_System.cc (1.18): Correct
+ comment typo.
+
+2005-02-24 Thursday 19:05 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * 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>
+
+ * 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..56b077d
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,236 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+ 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 only 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. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. 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.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. 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.
+
+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=c89 CFLAGS=-O2 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 must use a version of `make' that
+supports the `VPATH' variable, such as 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 `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have 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.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will 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.
+
+ 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'.
+
+Optional Features
+=================
+
+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.
+
+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 `--target=TYPE' option 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). Here is a another example:
+
+ /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--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.
+
+`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..9d7560e
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,42 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared --enable-watchdog
+
+dist_noinst_SCRIPTS = \
+configure
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+EXTRA_DIST = \
+ppl.lsm.in \
+ppl.spec.in \
+BUGS CREDITS README.configure STANDARDS
+
+ at SET_MAKE@
+
+SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian
diff --git a/Makefile.in b/Makefile.in
new file mode 100644
index 0000000..0bfb79b
--- /dev/null
+++ b/Makefile.in
@@ -0,0 +1,767 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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@
+DIST_COMMON = README $(am__configure_deps) $(dist_noinst_HEADERS) \
+ $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/config.h.in \
+ $(srcdir)/ppl.lsm.in $(srcdir)/ppl.spec.in \
+ $(top_srcdir)/configure COPYING ChangeLog INSTALL NEWS TODO \
+ compile config.guess config.rpath config.sub depcomp \
+ install-sh ltmain.sh missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES = ppl.lsm ppl.spec
+SCRIPTS = $(dist_noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+HEADERS = $(dist_noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+
+# Tell aclocal where to find `.m4' files.
+ACLOCAL_AMFLAGS = -I m4
+DISTCHECK_CONFIGURE_FLAGS = \
+--enable-shared --enable-watchdog
+
+dist_noinst_SCRIPTS = \
+configure
+
+dist_noinst_HEADERS = \
+instchk.hh
+
+EXTRA_DIST = \
+ppl.lsm.in \
+ppl.spec.in \
+BUGS CREDITS README.configure STANDARDS
+
+SUBDIRS = utils src Watchdog tests interfaces demos doc m4 debian
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ 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)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+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)
+ 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 $@
+ppl.spec: $(top_builddir)/config.status $(srcdir)/ppl.spec.in
+ cd $(top_builddir) && $(SHELL) ./config.status $@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ $(mkdir_p) $(distdir)/. $(distdir)/debian $(distdir)/doc $(distdir)/interfaces/C $(distdir)/m4 $(distdir)/src
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -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 $(SHELL) $(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__remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__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) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(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
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 $(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
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-libtool clean-recursive \
+ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+ dist-shar dist-tarZ dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-recursive distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am uninstall-info-am
+
+
+ at SET_MAKE@
+# 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..83d1966
--- /dev/null
+++ b/NEWS
@@ -0,0 +1,1116 @@
+
+Parma Polyhedra Library NEWS -- history of user-visible changes
+===============================================================
+
+
+--------------------------------------------------------------------------
+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 templatic 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_Coeffient_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 templatic 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 "lazyness" 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.
+ D�termination Automatique de Relations Lin�aires
+ V�rifi�es par les Variables d'un Programme.
+ Th�se de 3�me cicle d'informatique,
+ Universit� scientifique et m�dicale 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..f4a9509
--- /dev/null
+++ b/README
@@ -0,0 +1,1052 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+See below for the copying conditions.
+
+
+Parma Polyhedra Library (Release 0.9)
+=====================================
+
+This is the release 0.9 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;
+
+ + convex polyhedra defined by systems of bounded differences with
+ 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 of the above;
+
+ + linear programming problems, solved with an implementation of the
+ primal simplex algorithm using exact arithmetic.
+
+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://www.cs.unipr.it/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 0.9 source distribution
+(27 directories, 924 files):
+
+ppl-0.9
+|-- BUGS
+|-- COPYING
+|-- CREDITS
+|-- ChangeLog
+|-- INSTALL
+|-- Makefile.am
+|-- Makefile.in
+|-- NEWS
+|-- README
+|-- README.configure
+|-- STANDARDS
+|-- TODO
+|-- Watchdog
+| |-- BUGS
+| |-- COPYING
+| |-- CREDITS
+| |-- ChangeLog
+| |-- INSTALL
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- NEWS
+| |-- README
+| |-- aclocal.m4
+| |-- compile
+| |-- config.guess
+| |-- config.h.in
+| |-- config.sub
+| |-- configure
+| |-- configure.ac
+| |-- depcomp
+| |-- install-sh
+| |-- ltmain.sh
+| |-- missing
+| |-- mkinstalldirs
+| |-- src
+| | |-- 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.hh.dist
+| | `-- pwl_header.hh
+| `-- utils
+| |-- Makefile.am
+| |-- Makefile.in
+| `-- build_header.in
+|-- aclocal.m4
+|-- compile
+|-- config.guess
+|-- config.h.in
+|-- config.rpath
+|-- config.sub
+|-- configure
+|-- configure.ac
+|-- debian
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- README
+| |-- changelog
+| |-- compat
+| |-- control
+| |-- libppl-c.dirs
+| |-- libppl-c.install
+| |-- libppl-c.links
+| |-- libppl-dev.dirs
+| |-- libppl-dev.doc-base
+| |-- libppl-dev.doc-base.user
+| |-- libppl-dev.docs
+| |-- libppl-dev.install
+| |-- libppl-dev.links
+| |-- libppl-pwl.copyright.in
+| |-- libppl-pwl.dirs
+| |-- libppl-pwl.docs
+| |-- libppl-pwl.install
+| |-- libppl.copyright.in
+| |-- libppl.dirs
+| |-- libppl.docs
+| |-- libppl.install
+| `-- rules
+|-- 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.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
+| | |-- ex1.mps
+| | |-- kb2.mps
+| | |-- mip.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
+| `-- ppl_lpsol.c
+|-- depcomp
+|-- doc
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- README.doc
+| |-- definitions.dox
+| |-- devref.doxyconf-html
+| |-- devref.doxyconf-html.in
+| |-- devref.doxyconf-latex
+| |-- 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
+| |-- ppl-config.1
+| |-- ppl-user-0.9-html.tar.gz
+| |-- ppl-user-0.9.pdf
+| |-- ppl-user-0.9.ps.gz
+| |-- ppl.sty
+| |-- ppl_lcdd.1
+| |-- ppl_lpsol.1
+| |-- user.doxyconf-html
+| |-- user.doxyconf-html.in
+| |-- user.doxyconf-latex
+| |-- user.doxyconf-latex.in
+| `-- user.tex
+|-- install-sh
+|-- instchk.hh
+|-- interfaces
+| |-- C
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ppl_c.cc
+| | |-- ppl_c.h
+| | `-- ppl_c.h.in
+| |-- Makefile.am
+| |-- Makefile.in
+| `-- Prolog
+| |-- Ciao
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ciao_clpq.pl
+| | |-- ciao_clpq2.pl
+| | |-- ciao_pl_check.pl
+| | |-- ppl_ciao.cc
+| | `-- ppl_ciao.pl
+| |-- GNU
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- README
+| | |-- gnu_pl_check.pl
+| | |-- gp_clpq.pl
+| | |-- ppl_gprolog.pl
+| | `-- ppl_gprolog_sd.cc
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- Prolog_interface.dox
+| |-- SICStus
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ppl_sicstus.pl
+| | |-- ppl_sicstus_sd.cc
+| | |-- sicstus_cfli.cc
+| | |-- sicstus_cfli.h
+| | |-- sicstus_cfli.ic
+| | |-- sp_clpq.pl
+| | `-- sp_pl_check.pl
+| |-- SWI
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- pl_clpq.cc
+| | |-- pl_clpq.pl
+| | |-- ppl_pl.cc
+| | |-- ppl_swiprolog.cc
+| | |-- ppl_swiprolog.pl
+| | `-- swi_pl_check.pl
+| |-- XSB
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- 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
+| | |-- ppl_xsb.H
+| | |-- ppl_xsb.cc
+| | |-- xsb_clpq.P
+| | |-- xsb_clpq2.P
+| | `-- xsb_pl_check.P
+| |-- YAP
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- ppl_yap.cc
+| | |-- ppl_yap.pl
+| | |-- yap_clpq.pl
+| | |-- yap_clpq2.pl
+| | `-- yap_pl_check.pl
+| |-- exceptions.hh
+| |-- ppl_prolog.icc
+| |-- 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
+| | |-- fib.clpq
+| | |-- mc91.clpq
+| | |-- pl_check.pl
+| | |-- schedule.clpq
+| | |-- script_clpq
+| | |-- script_clpq2
+| | |-- script_clpq2_int8
+| | |-- smm.clpq
+| | |-- sumto.clpq
+| | `-- tak.clpq
+| `-- track_allocation.hh
+|-- ltmain.sh
+|-- m4
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- 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_flexible_arrays.m4
+| |-- ac_cxx_float_binary_format.m4
+| |-- ac_cxx_long_double_binary_format.m4
+| |-- ac_text_md5sum.m4
+| |-- lib-ld.m4
+| |-- lib-link.m4
+| |-- lib-prefix.m4
+| `-- ppl.m4
+|-- missing
+|-- mkinstalldirs
+|-- ppl.lsm.in
+|-- ppl.spec.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
+| |-- Bounding_Box.cc
+| |-- Bounding_Box.defs.hh
+| |-- Bounding_Box.inlines.hh
+| |-- Bounding_Box.types.hh
+| |-- COPYING.cc.dist
+| |-- CREDITS.cc.dist
+| |-- C_Polyhedron.cc
+| |-- C_Polyhedron.defs.hh
+| |-- C_Polyhedron.inlines.hh
+| |-- C_Polyhedron.types.hh
+| |-- Checked_Number.cc
+| |-- Checked_Number.defs.hh
+| |-- Checked_Number.inlines.hh
+| |-- Checked_Number.types.hh
+| |-- Coefficient.cc
+| |-- Coefficient.defs.hh
+| |-- Coefficient.inlines.hh
+| |-- Coefficient.types.hh
+| |-- Coefficient_traits_template.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
+| |-- 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.types.hh
+| |-- DB_Row.defs.hh
+| |-- DB_Row.inlines.hh
+| |-- DB_Row.types.hh
+| |-- Determinate.defs.hh
+| |-- Determinate.inlines.hh
+| |-- Determinate.types.hh
+| |-- Float.cc
+| |-- Float.defs.hh
+| |-- Float.inlines.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
+| |-- Init.cc
+| |-- Init.defs.hh
+| |-- Init.types.hh
+| |-- Interval.cc
+| |-- Interval.defs.hh
+| |-- Interval.inlines.hh
+| |-- Interval.types.hh
+| |-- LP_Problem.cc
+| |-- LP_Problem.defs.hh
+| |-- LP_Problem.inlines.hh
+| |-- LP_Problem.types.hh
+| |-- Limits.hh
+| |-- Linear_Expression.cc
+| |-- Linear_Expression.defs.hh
+| |-- Linear_Expression.inlines.hh
+| |-- Linear_Expression.types.hh
+| |-- Linear_Row.cc
+| |-- Linear_Row.defs.hh
+| |-- Linear_Row.inlines.hh
+| |-- Linear_Row.types.hh
+| |-- Linear_System.cc
+| |-- Linear_System.defs.hh
+| |-- Linear_System.inlines.hh
+| |-- Linear_System.types.hh
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- Matrix.cc
+| |-- Matrix.defs.hh
+| |-- Matrix.inlines.hh
+| |-- Matrix.types.hh
+| |-- NNC_Polyhedron.cc
+| |-- NNC_Polyhedron.defs.hh
+| |-- NNC_Polyhedron.inlines.hh
+| |-- NNC_Polyhedron.types.hh
+| |-- Numeric_Format.defs.hh
+| |-- Ph_Status.cc
+| |-- Ph_Status.idefs.hh
+| |-- Ph_Status.inlines.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
+| |-- Polyhedra_Powerset.cc
+| |-- Polyhedra_Powerset.defs.hh
+| |-- Polyhedra_Powerset.inlines.hh
+| |-- Polyhedra_Powerset.templates.hh
+| |-- Polyhedra_Powerset.types.hh
+| |-- Polyhedron.defs.hh
+| |-- Polyhedron.inlines.hh
+| |-- Polyhedron.templates.hh
+| |-- Polyhedron.types.hh
+| |-- Polyhedron_chdims.cc
+| |-- Polyhedron_nonpublic.cc
+| |-- Polyhedron_public.cc
+| |-- 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
+| |-- Result.defs.hh
+| |-- Result.inlines.hh
+| |-- Rounding_Dir.defs.hh
+| |-- Rounding_Dir.inlines.hh
+| |-- Row.cc
+| |-- Row.defs.hh
+| |-- Row.inlines.hh
+| |-- Row.types.hh
+| |-- Saturation_Matrix.cc
+| |-- Saturation_Matrix.defs.hh
+| |-- Saturation_Matrix.inlines.hh
+| |-- Saturation_Matrix.types.hh
+| |-- Saturation_Row.cc
+| |-- Saturation_Row.defs.hh
+| |-- Saturation_Row.inlines.hh
+| |-- Saturation_Row.types.hh
+| |-- Scalar_Products.cc
+| |-- Scalar_Products.defs.hh
+| |-- Scalar_Products.inlines.hh
+| |-- Scalar_Products.types.hh
+| |-- Topology.hh
+| |-- Variable.cc
+| |-- Variable.defs.hh
+| |-- Variable.inlines.hh
+| |-- Variable.types.hh
+| |-- Widening_Function.defs.hh
+| |-- Widening_Function.inlines.hh
+| |-- Widening_Function.types.hh
+| |-- algorithms.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
+| |-- conversion.cc
+| |-- fpu-c99.inlines.hh
+| |-- 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
+| |-- max_space_dimension.hh
+| |-- minimize.cc
+| |-- mp_numeric_limits.hh
+| |-- namespaces.hh
+| |-- ppl-config.cc
+| |-- ppl-config.cc.in
+| |-- ppl.hh.dist
+| |-- ppl_header.hh
+| |-- simplify.cc
+| |-- swapping_sort.icc
+| |-- version.cc
+| `-- version.hh.in
+|-- tests
+| |-- BBox.cc
+| |-- BBox.hh
+| |-- BD_Shape
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- addconstraints1.cc
+| | |-- addspacedims1.cc
+| | |-- affinedimension1.cc
+| | |-- affineimage1.cc
+| | |-- affineimage2.cc
+| | |-- affinepreimage1.cc
+| | |-- affinepreimage2.cc
+| | |-- ascii_dump_load1.cc
+| | |-- bdsdifference1.cc
+| | |-- bdshull1.cc
+| | |-- bgp99extrapolation1.cc
+| | |-- bhmz05widening1.cc
+| | |-- bhz03widening1.cc
+| | |-- cc76extrapolation1.cc
+| | |-- cc76narrowing1.cc
+| | |-- closure1.cc
+| | |-- concatenate1.cc
+| | |-- constraints1.cc
+| | |-- contains1.cc
+| | |-- empty1.cc
+| | |-- equality1.cc
+| | |-- fromgensys1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- generalizedaffinepreimage2.cc
+| | |-- geomcovers1.cc
+| | |-- h79widening1.cc
+| | |-- intersection1.cc
+| | |-- limitedbhmz05extrapolation1.cc
+| | |-- limitedcc76extrapolation1.cc
+| | |-- limitedh79extrapolation1.cc
+| | |-- mapspacedims1.cc
+| | |-- maxspacedim.cc
+| | |-- minconstraints1.cc
+| | |-- relations1.cc
+| | |-- relations2.cc
+| | |-- relations3.cc
+| | |-- removespacedims1.cc
+| | |-- run_tests
+| | |-- timeelapse1.cc
+| | |-- universe1.cc
+| | `-- writebdshape1.cc
+| |-- 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
+| | |-- asciidumpload1.cc
+| | |-- bhz03widening1.cc
+| | |-- bounded1.cc
+| | |-- boundingbox1.cc
+| | |-- boundingbox2.cc
+| | |-- bounds1.cc
+| | |-- certificate1.cc
+| | |-- concatenate1.cc
+| | |-- congruence1.cc
+| | |-- congruences1.cc
+| | |-- congruencesystem1.cc
+| | |-- contains1.cc
+| | |-- copyconstruct1.cc
+| | |-- coveringbox1.cc
+| | |-- coveringbox2.cc
+| | |-- discrete1.cc
+| | |-- disjoint1.cc
+| | |-- equals1.cc
+| | |-- expandspacedim1.cc
+| | |-- foldspacedims1.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- generalizedaffinepreimage2.cc
+| | |-- generator1.cc
+| | |-- generators1.cc
+| | |-- grid1.cc
+| | |-- grid2.cc
+| | |-- grid3.cc
+| | |-- griddifference1.cc
+| | |-- intersection1.cc
+| | |-- isempty1.cc
+| | |-- isuniverse1.cc
+| | |-- join1.cc
+| | |-- join2.cc
+| | |-- limitedextrapolation1.cc
+| | |-- mapspacedims1.cc
+| | |-- maxmin1.cc
+| | |-- membytes1.cc
+| | |-- mincongruences1.cc
+| | |-- mingenerators1.cc
+| | |-- outputoperator1.cc
+| | |-- relations1.cc
+| | |-- relations2.cc
+| | |-- removespacedims1.cc
+| | |-- timeelapse1.cc
+| | |-- topclosed1.cc
+| | |-- topclosure1.cc
+| | |-- widening1.cc
+| | `-- writecongruencesystem.cc
+| |-- Makefile.am
+| |-- Makefile.in
+| |-- Partial_Function.cc
+| |-- Partial_Function.defs.hh
+| |-- Partial_Function.inlines.hh
+| |-- Partial_Function.types.hh
+| |-- Polyhedron
+| | |-- Makefile.am
+| | |-- Makefile.in
+| | |-- README
+| | |-- 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
+| | |-- bhrz03widening1.cc
+| | |-- bhrz03widening2.cc
+| | |-- bhrz03widening3.cc
+| | |-- bhz03widening1.cc
+| | |-- bounded1.cc
+| | |-- boundedaffineimage1.cc
+| | |-- boundedaffinepreimage1.cc
+| | |-- boundedbhrz03extrapolation1.cc
+| | |-- boundedh79extrapolation1.cc
+| | |-- boundingbox1.cc
+| | |-- boundingbox2.cc
+| | |-- boundingbox3.cc
+| | |-- bounds1.cc
+| | |-- bug2.cc
+| | |-- cnncconversion1.cc
+| | |-- concatenate1.cc
+| | |-- congruences1.cc
+| | |-- constraints1.cc
+| | |-- contains1.cc
+| | |-- contains2.cc
+| | |-- disjoint1.cc
+| | |-- disjoint2.cc
+| | |-- dualhypercubes.cc
+| | |-- empty1.cc
+| | |-- equals1.cc
+| | |-- exceptions1.cc
+| | |-- exceptions2.cc
+| | |-- exceptions3.cc
+| | |-- expandspacedim1.cc
+| | |-- expandspacedim2.cc
+| | |-- foldspacedims1.cc
+| | |-- foldspacedims2.cc
+| | |-- generalizedaffineimage1.cc
+| | |-- generalizedaffineimage2.cc
+| | |-- generalizedaffinepreimage1.cc
+| | |-- generalizedaffinepreimage2.cc
+| | |-- generators1.cc
+| | |-- geomcovers1.cc
+| | |-- h79widening1.cc
+| | |-- h79widening2.cc
+| | |-- intersection1.cc
+| | |-- limitedbhrz03extrapolation1.cc
+| | |-- limitedh79extrapolation1.cc
+| | |-- linearpartition1.cc
+| | |-- linearsystem1.cc
+| | |-- linexpression1.cc
+| | |-- lpproblem1.cc
+| | |-- mapspacedims1.cc
+| | |-- matrix1.cc
+| | |-- max_min1.cc
+| | |-- maxspacedim1.cc
+| | |-- mc91.cc
+| | |-- membytes1.cc
+| | |-- membytes2.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
+| | |-- polypowerset1.cc
+| | |-- powerset1.cc
+| | |-- randphull1.cc
+| | |-- randphull2.cc
+| | |-- relations1.cc
+| | |-- relations2.cc
+| | |-- relations3.cc
+| | |-- removespacedims1.cc
+| | |-- removespacedims2.cc
+| | |-- smm1.cc
+| | |-- timeelapse1.cc
+| | |-- timeelapse2.cc
+| | |-- topclosed1.cc
+| | |-- topclosure1.cc
+| | |-- universe1.cc
+| | |-- universe2.cc
+| | |-- watchdog1.cc
+| | |-- writeconsys1.cc
+| | |-- writegensys1.cc
+| | |-- writepolyhedron1.cc
+| | |-- writepolyhedron2.cc
+| | |-- writerelation1.cc
+| | `-- writevariable1.cc
+| |-- Random_Number_Generator.defs.hh
+| |-- Random_Number_Generator.inlines.hh
+| |-- Random_Number_Generator.types.hh
+| |-- files.cc
+| |-- files.hh
+| |-- ppl_test.cc
+| |-- ppl_test.hh
+| |-- print.cc
+| `-- print.hh
+`-- utils
+ |-- Makefile.am
+ |-- Makefile.in
+ |-- build_header.in
+ |-- text2cxxarray.in
+ |-- timings.cc
+ `-- timings.hh
+
+--------
+
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of 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 called `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 2 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 called `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://www.cs.unipr.it/ppl/ .
diff --git a/README.configure b/README.configure
new file mode 100644
index 0000000..744cc4f
--- /dev/null
+++ b/README.configure
@@ -0,0 +1,217 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+See below for the copying conditions.
+
+
+Configuration of the Parma Polyhedra Library
+============================================
+
+In an ideal situation (i.e., on a more or less standard Un*x
+environment, with the right compilers, 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 adjust the build and installation process for customizing
+the PPL installation. 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.
+
+
+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.
+
+Since the binary distributions of GMP most likely 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, the only reliable solution to points
+(1), (2) and (3) above is to visit GMP's home page at
+
+ http://www.swox.com/gmp/
+
+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=/usr/local --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-libgmpxx-prefix=<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
+runtime (setting the environment variable `LD_LIBRARY_PATH' to
+"<GMPprefix>/lib:$LD_LIBRARY_PATH" is the most commonly used solution).
+
+
+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
+
+Let us take the occasion to stress, once again, the fact that you
+_must_ use the same C++ compiler to compile the C++ interface of GMP,
+the PPL and your application, if you use the C++ interface of the PPL.
+
+Here is an example with the Intel C/C++ compiler version 8.1. Assuming
+you have configured GMP with a command like
+
+ CC=icc CXX=icpc /path/to/gmp-4.1.4/configure --enable-cxx \
+ --prefix=/opt/intel_cc_80
+
+you can configure the PPL with a command like
+
+ /path/to/ppl-x.y/configure --with-cxx=icpc --with-cc=icc \
+ --with-cxxflags="-w2 -wd161,177,193,279,383,444,981,1188,1418" \
+ --with-libgmpxx-prefix=/opt/intel_cc_80
+
+Notice that the `--with-cxxflags' option is absolutely non-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.3. First configure GMP with a command like
+
+ CXX=como /path/to/gmp-4.1.4/configure --enable-cxx \
+ --disable-shared --prefix=/usr/local/lib/como433/local
+
+Then you can configure the PPL with a command like
+
+ /path/to/ppl/configure --with-cc="como --c" --with-cxx=como \
+ --with-cxxflags="--remarks --strict --long_long \
+ --display_error_number --diag_suppress 193,236,340,401,679" \
+ --disable-shared --with-libgmpxx-prefix=/usr/local/lib/como433/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.3 does not support shared libraries.
+
+
+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. Adding
+
+ --enable-optimization=speed
+
+to the command line is thus recommended (in later releases we will
+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 really know what you
+are doing, you may be interested in knowing 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
+
+--------
+
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of 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 called `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 2 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 are called `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://www.cs.unipr.it/ppl/ .
diff --git a/STANDARDS b/STANDARDS
new file mode 100644
index 0000000..6e9c002
--- /dev/null
+++ b/STANDARDS
@@ -0,0 +1,489 @@
+
+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.
+
+
+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).
+
+
+Length of source lines
+----------------------
+
+Avoid, when possible, source lines longer than 78 characters.
+
+
+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)
+
+
+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)
+
+
+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)
+
+
+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());
+
+
+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 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 templatic 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 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 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.
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..0254a33
--- /dev/null
+++ b/TODO
@@ -0,0 +1,68 @@
+
+Enhancements for PPL 0.10
+=========================
+
+- Develop a C and Prolog interfaces for all the supported domains.
+- Incorporate the domain of intervals.
+- Reduce the number of FIXMEs to no more than 20.
+- Complete the manual pages for ppl-config, ppl_lpsol and ppl_lcdd.
+- Write a manual page for ppl (3).
+- Ensure that the Grid tests cover all the code.
+- Provide a single, generic implementation to replace all our status
+ classes.
+- Clearly explain, in the documentation, how (not) to use
+ set_GMP_memory_allocation_functions(). More generally, explain how
+ to have memory-guarded computations.
+- Reconsider the handling of temporary coefficients.
+- Provide a generic implementation for the `widening with tokens'.
+- Transform LP_Problem into an incremental solver and add to it support
+ for abandoning costly computations.
+- Add a widening for grids using only generator representations.
+
+
+Enhancements for PPL 0.10 or later versions
+==========================================
+
+- Implement void Polyhedron::envelope_assign(const Polyhedron& y).
+- Implement the extrapolation operators defined in HenzingerH95
+ and HenzingerPW01.
+- See whether, using the techniques described in
+ ftp://ftp.ifor.math.ethz.ch/pub/fukuda/reports/polyunion001120.ps.gz
+ we can implement bool poly_hull_assign_if_exact(PH& p, const PH& q),
+ temporarily in algorithms.hh, more efficiently.
+- Provide optimized implementations of Polyhedron::expand_dimension()
+ Polyhedron::fold_dimensions().
+- Experiment with different compilation flags, such as GCC's
+ `-fno-threadsafe-statics'.
+- Reimplement the ask-and-tell generic construction.
+- Suppose we are only interested in integral solutions (as is the
+ case, e.g., in most termination analyses). Then cutting-plane methods
+ (Gomory, Chv�tal, ...) allow to shrink polyhedra still not losing any
+ integral solution.
+ See http://www.cs.unipr.it/ppl/Documentation/bibliography#NemhauserW88
+
+
+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.
+- We are being rather careless about the creation of temporaries
+ as far as the classes Linear_Expression, Constraint and Generator
+ are concerned.
+
+
+Debian packaging
+================
+
+- Add an interface package for each Prolog as a suitable version of
+ that Prolog appears in Debian. Control entries for these are in
+ control.prologs.
+- Find out if /usr/lib/pkgconfig entries are required in any packages.
+- libppl-dev is very large. Consider moving the docs to libppl-doc
+ and the other files into libppl.
+- Verify the Build-Depends and Build-Depends-Indep settings, as per
+ the Debian Developers Reference section 5.10.1 point 1.
+- Consider renaming libppl-pwl to libpwl.
diff --git a/Watchdog/BUGS b/Watchdog/BUGS
new file mode 100644
index 0000000..4e96fe8
--- /dev/null
+++ b/Watchdog/BUGS
@@ -0,0 +1,2 @@
+
+Please report any bug you find to bagnara at cs.unipr.it.
diff --git a/Watchdog/COPYING b/Watchdog/COPYING
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/Watchdog/COPYING
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+ 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
+convey 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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
diff --git a/Watchdog/CREDITS b/Watchdog/CREDITS
new file mode 100644
index 0000000..be59266
--- /dev/null
+++ b/Watchdog/CREDITS
@@ -0,0 +1,12 @@
+
+Authors
+=======
+
+The Parma Watchdog Library and its (non-existent) documentation have
+been designed, written, debugged and improved by Roberto Bagnara [1]
+<bagnara at cs.unipr.it>.
+
+
+--------
+
+ [1] http://www.cs.unipr.it/~bagnara/
diff --git a/Watchdog/ChangeLog b/Watchdog/ChangeLog
new file mode 100644
index 0000000..278f82e
--- /dev/null
+++ b/Watchdog/ChangeLog
@@ -0,0 +1,1024 @@
+2006-03-12 Release Manager
+
+ * PPL 0.9 Released.
+
+2006-03-10 Friday 16:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.14): Updated.
+
+2006-03-05 Sunday 17:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.20), config.sub (1.19): Updated.
+
+2006-02-18 Saturday 07:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.7): 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-11 Saturday 11:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/: .cvsignore (1.2), Makefile.am (1.6): We now directly create
+ `pwl.hh': `pwl_install.hh' does not exist any longer.
+
+2006-02-11 Saturday 11:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/.cvsignore (1.2): Ignore more built files and directories.
+
+2006-01-25 Wednesday 21:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.in (grids.4): Makefile.in is automatically
+ generated: it should not be under CVS.
+
+2006-01-25 Wednesday 19:31 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * CREDITS, ChangeLog, NEWS, README (grids.[1,3,2,3]): Eighth and
+ last merge from the main trunk.
+
+2006-01-20 Friday 09:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_8-branch.2): Mark ChangeLog.
+
+2006-01-20 Friday 09:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_8-branch.1): Updated.
+
+2006-01-17 Tuesday 15:51 Patricia M. Hill <hill at comp.leeds.ac.uk>
+
+ * CREDITS (1.2): "inexistent" replaced by "non-existent".
+
+2006-01-17 Tuesday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.13): Updated.
+
+2006-01-16 Monday 22:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.14): Updated.
+
+2006-01-16 Monday 14:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.8): Release date decided.
+
+2006-01-16 Monday 02:10 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * ChangeLog, Makefile.am, NEWS, README, config.guess, config.sub,
+ configure.ac, install-sh, ltmain.sh,
+ src/Doubly_Linked_Object.defs.hh,
+ src/Doubly_Linked_Object.inlines.hh,
+ src/Doubly_Linked_Object.types.hh, src/EList.defs.hh,
+ src/EList.inlines.hh, src/EList.types.hh,
+ src/EList_Iterator.defs.hh, src/EList_Iterator.inlines.hh,
+ src/EList_Iterator.types.hh, src/Handler.defs.hh,
+ src/Handler.inlines.hh, src/Handler.types.hh, src/Makefile.am,
+ src/Makefile.in, src/Pending_Element.cc,
+ src/Pending_Element.defs.hh, src/Pending_Element.inlines.hh,
+ src/Pending_Element.types.hh, src/Pending_List.cc,
+ src/Pending_List.defs.hh, src/Pending_List.inlines.hh,
+ src/Pending_List.types.hh, src/Time.cc, src/Time.defs.hh,
+ src/Time.inlines.hh, src/Time.types.hh, src/Watchdog.cc,
+ src/Watchdog.defs.hh, src/Watchdog.inlines.hh,
+ src/Watchdog.types.hh, src/pwl_header.hh, utils/Makefile.am,
+ utils/build_header.in
+ (grids.[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]):
+ Seventh (last but one?) merge of the main trunk to the grids
+ branch.
+
+2006-01-14 Saturday 15:48 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * NEWS (1.7): Add detail to the 0.5 Time entry.
+
+2006-01-14 Saturday 15:37 Matthew Mundell <mattm at comp.leeds.ac.uk>
+
+ * NEWS (1.6): Update 0.8 entries from ChangeLog.
+
+2006-01-10 Tuesday 18:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.25), src/Makefile.am (1.5), utils/Makefile.am
+ (1.6): Avoid providing default information that Automake does
+ figure out by itself.
+
+2006-01-09 Monday 22:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.19), config.sub (1.18): Updated.
+
+2006-01-09 Monday 21:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.13): Updated.
+
+2006-01-06 Friday 21:00 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * ChangeLog, Makefile.am, README, config.guess, config.sub,
+ configure.ac, install-sh, ltmain.sh,
+ src/Doubly_Linked_Object.defs.hh,
+ src/Doubly_Linked_Object.inlines.hh,
+ src/Doubly_Linked_Object.types.hh, src/EList.defs.hh,
+ src/EList.inlines.hh, src/EList.types.hh,
+ src/EList_Iterator.defs.hh, src/EList_Iterator.inlines.hh,
+ src/EList_Iterator.types.hh, src/Handler.defs.hh,
+ src/Handler.inlines.hh, src/Handler.types.hh, src/Makefile.am,
+ src/Pending_Element.cc, src/Pending_Element.defs.hh,
+ src/Pending_Element.inlines.hh, src/Pending_Element.types.hh,
+ src/Pending_List.cc, src/Pending_List.defs.hh,
+ src/Pending_List.inlines.hh, src/Pending_List.types.hh,
+ src/Time.cc, src/Time.defs.hh, src/Time.inlines.hh,
+ src/Time.types.hh, src/Watchdog.cc, src/Watchdog.defs.hh,
+ src/Watchdog.inlines.hh, src/Watchdog.types.hh,
+ src/pwl_header.hh, utils/Makefile.am, utils/build_header.in
+ (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]):
+ First merge from the main trunk.
+
+2006-01-01 Sunday 22:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * src/: EList.defs.hh (1.3), Pending_List.defs.hh (1.3),
+ Time.defs.hh (1.3): Do adopt the new format for multiline brief
+ doxygen documentation.
+
+2006-01-01 Sunday 09:27 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.24), README (1.12), configure.ac (1.33),
+ src/Doubly_Linked_Object.defs.hh (1.2),
+ src/Doubly_Linked_Object.inlines.hh (1.2),
+ src/Doubly_Linked_Object.types.hh (1.2), src/EList.defs.hh (1.2),
+ src/EList.inlines.hh (1.2), src/EList.types.hh (1.2),
+ src/EList_Iterator.defs.hh (1.2), src/EList_Iterator.inlines.hh
+ (1.2), src/EList_Iterator.types.hh (1.2), src/Handler.defs.hh
+ (1.2), src/Handler.inlines.hh (1.2), src/Handler.types.hh (1.2),
+ src/Makefile.am (1.4), src/Pending_Element.cc (1.2),
+ src/Pending_Element.defs.hh (1.2), src/Pending_Element.inlines.hh
+ (1.2), src/Pending_Element.types.hh (1.2), src/Pending_List.cc
+ (1.2), src/Pending_List.defs.hh (1.2),
+ src/Pending_List.inlines.hh (1.2), src/Pending_List.types.hh
+ (1.2), src/Time.cc (1.2), src/Time.defs.hh (1.2),
+ src/Time.inlines.hh (1.2), src/Time.types.hh (1.2),
+ src/Watchdog.cc (1.2), src/Watchdog.defs.hh (1.2),
+ src/Watchdog.inlines.hh (1.2), src/Watchdog.types.hh (1.2),
+ src/pwl_header.hh (1.2), utils/Makefile.am (1.5),
+ utils/build_header.in (1.3): Copyright years extended.
+
+2005-12-19 Monday 07:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.18), config.sub (1.17), install-sh (1.13),
+ ltmain.sh (1.16): Updated from Libtool 1.5.22.
+
+2005-12-05 Monday 22:01 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.12): Updated.
+
+2005-10-11 Tuesday 10:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess, src/Makefile.am, src/Makefile.in, utils/Makefile.am
+ (grids.[3,2,2,3]): Fifth merge from main trunk.
+
+2005-10-02 Sunday 14:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.3): Definition of BUILT_SOURCES revised.
+
+2005-10-02 Sunday 11:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.17): Updated.
+
+2005-09-28 Wednesday 22:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * src/Makefile.am (1.2): 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>
+
+ * 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 <mattm at comp.leeds.ac.uk>
+
+ * .cvsignore, ChangeLog, 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, 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,
+ configure.ac, pwl_header.hh, utils/Makefile.am,
+ utils/build_header, utils/build_header.in
+ (grids.[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]):
+ Fourth merge from the main trunk.
+
+2005-09-28 Wednesday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * utils/Makefile.am (1.4): Make sure the scripts in the `utils'
+ subdirectory are made also at distribution time, even if they are
+ not distributed themselves.
+
+2005-09-23 Friday 22:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.5): Updated.
+
+2005-09-23 Friday 21:55 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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>
+
+ * 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>
+
+ * utils/: Makefile.am (1.3), build_header.in (1.2): Generation of
+ utility scripts fixed.
+
+2005-09-23 Friday 14:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.22), configure.ac (1.30), utils/Makefile.am (1.2),
+ utils/build_header (1.2), utils/build_header.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>
+
+ * configure.ac (1.29): Check for Perl.
+
+2005-09-19 Monday 14:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.11): Updated.
+
+2005-09-08 Thursday 01:26 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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-02 Friday 18:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING, Doubly_Linked_Object.defs.hh,
+ Doubly_Linked_Object.inlines.hh, EList.defs.hh, EList.inlines.hh,
+ EList_Iterator.defs.hh, EList_Iterator.inlines.hh,
+ Handler.defs.hh, Handler.inlines.hh, Makefile.am,
+ Pending_Element.cc, Pending_Element.defs.hh,
+ Pending_Element.inlines.hh, Pending_List.cc,
+ Pending_List.defs.hh, Pending_List.inlines.hh, README, Time.cc,
+ Time.defs.hh, Time.inlines.hh, Watchdog.cc, Watchdog.defs.hh,
+ Watchdog.inlines.hh, compile, config.guess, config.sub,
+ configure.ac, depcomp, install-sh, ltmain.sh, missing,
+ mkinstalldirs, pwl_header.bottom, pwl_header.hh,
+ pwl_header.middle, pwl_header.top, utils/.cvsignore,
+ utils/Makefile.am, utils/build_header
+ (grids.[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]):
+ Second merge from main trunk.
+
+2005-09-01 Thursday 14:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * install-sh (1.12), ltmain.sh (1.15): Updated from Libtool 1.5.20.
+
+2005-08-28 Sunday 10:05 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * missing (1.8): Broken comments restored.
+
+2005-08-27 Saturday 21:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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.20), configure.ac (1.27), pwl_header.bottom (1.3),
+ pwl_header.hh (1.1), pwl_header.middle (1.4), pwl_header.top
+ (1.8), utils/.cvsignore (1.1), utils/Makefile.am (1.1),
+ 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-22 Monday 00:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.16), config.sub (1.16): Updated.
+
+2005-08-22 Monday 00:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING (1.3), Doubly_Linked_Object.defs.hh (1.3),
+ Doubly_Linked_Object.inlines.hh (1.3), EList.defs.hh (1.5),
+ EList.inlines.hh (1.4), EList_Iterator.defs.hh (1.3),
+ EList_Iterator.inlines.hh (1.4), Handler.defs.hh (1.5),
+ Handler.inlines.hh (1.4), Makefile.am (1.19), Pending_Element.cc
+ (1.3), Pending_Element.defs.hh (1.3), Pending_Element.inlines.hh
+ (1.3), Pending_List.cc (1.3), Pending_List.defs.hh (1.3),
+ Pending_List.inlines.hh (1.3), README (1.11), Time.cc (1.3),
+ Time.defs.hh (1.3), Time.inlines.hh (1.4), Watchdog.cc (1.20),
+ Watchdog.defs.hh (1.16), Watchdog.inlines.hh (1.13), compile
+ (1.6), config.guess (1.15), config.sub (1.15), configure.ac
+ (1.26), depcomp (1.9), ltmain.sh (1.14), missing (1.7),
+ pwl_header.top (1.7): Address of the Free Software Foundation
+ updated.
+
+2005-07-11 Monday 08:32 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile (1.5), config.guess (1.14), config.sub (1.14), depcomp
+ (1.8), missing (1.6), mkinstalldirs (1.5): Updated from Automake
+ 1.9.6.
+
+2005-07-06 Wednesday 09:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Handler.defs.hh, Handler.inlines.hh, Time.inlines.hh,
+ config.guess, config.sub, install-sh, ltmain.sh
+ (grids.[1,1,1,1,1,1,1]): First merge from main trunk.
+
+2005-05-25 Wednesday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.13), config.sub (1.13), install-sh (1.11),
+ 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.12), config.sub (1.12), ltmain.sh (1.12): Updated
+ from Libtool 1.5.16.
+
+2005-04-11 Monday 00:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Time.inlines.hh (1.3): Fixed a bug in Time::operator+=(const
+ Time&).
+
+2005-02-27 Sunday 16:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Handler.defs.hh (1.4), Handler.inlines.hh (1.3): Class Handler
+ was missing a virtual destructor: added.
+
+2005-02-13 Sunday 08:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.4), compile (1.4), config.guess (1.11), config.sub
+ (1.11), depcomp (1.7), missing (1.5), mkinstalldirs (1.4):
+ Updated from Automake 1.9.5.
+
+2005-02-12 Saturday 15:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.11): Updated from Libtool 1.5.14.
+
+2005-02-08 Tuesday 20:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.sub (1.10), install-sh (1.10): Updated.
+
+2005-02-08 Tuesday 20:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.10): Updated from Libtool 1.5.12.
+
+2005-01-01 Saturday 00:45 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Doubly_Linked_Object.defs.hh (1.2),
+ Doubly_Linked_Object.inlines.hh (1.2),
+ Doubly_Linked_Object.types.hh (1.2), EList.defs.hh (1.4),
+ EList.inlines.hh (1.3), EList.types.hh (1.2),
+ EList_Iterator.defs.hh (1.2), EList_Iterator.inlines.hh (1.3),
+ EList_Iterator.types.hh (1.2), Handler.defs.hh (1.3),
+ Handler.inlines.hh (1.2), Handler.types.hh (1.2), Makefile.am
+ (1.18), Pending_Element.cc (1.2), Pending_Element.defs.hh (1.2),
+ Pending_Element.inlines.hh (1.2), Pending_Element.types.hh (1.2),
+ Pending_List.cc (1.2), Pending_List.defs.hh (1.2),
+ Pending_List.inlines.hh (1.2), Pending_List.types.hh (1.2),
+ README (1.10), Time.cc (1.2), Time.defs.hh (1.2), Time.inlines.hh
+ (1.2), Time.types.hh (1.2), Watchdog.cc (1.19), Watchdog.defs.hh
+ (1.15), Watchdog.inlines.hh (1.12), Watchdog.types.hh (1.6),
+ configure.ac (1.25), pwl_header.top (1.6): Copyright years
+ extended.
+
+2004-12-25 Saturday 23:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, Makefile.am, NEWS, README, config.guess, config.sub,
+ configure.ac, install-sh, pwl_filter_doxygen.sed,
+ pwl_filter_install.sed, pwl_header.bottom, pwl_header.middle,
+ pwl_header.top (altnum.[2,5,2,2,4,3,3,4,1,1,1,1,1]): Seventh
+ merge from main trunk.
+
+2004-12-24 Friday 16:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_7-branch.1): Mark ChangeLog.
+
+2004-12-24 Friday 15:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.10): Updated.
+
+2004-12-24 Friday 15:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.9): Updated.
+
+2004-12-24 Friday 12:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.17): No longer mention erased files.
+
+2004-12-24 Friday 11:37 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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>
+
+ * 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>
+
+ * configure.ac (1.24): Require Autoconf 2.59.
+
+2004-12-24 Friday 11:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.8): Version number bumped.
+
+2004-12-24 Friday 11:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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 09:00 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.15), configure.ac (1.23): Enable the creation of
+ DLLs under Cygwin.
+
+2004-12-19 Sunday 12:04 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.22): Version number bumped.
+
+2004-12-19 Sunday 11:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (1.5): The tentative release date for PPL 0.7 is December
+ 24, 2004.
+
+2004-12-19 Sunday 07:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.9): Updated.
+
+2004-12-19 Sunday 07:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.10), config.sub (1.9): Updated.
+
+2004-12-19 Sunday 07:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * install-sh (1.9): Updated from Automake 1.9.4.
+
+2004-12-11 Saturday 22:34 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * EList_Iterator.inlines.hh, Handler.defs.hh, Makefile.am,
+ Watchdog.defs.hh (altnum.[2,2,4,2]): Sixth merge from main trunk.
+
+2004-12-11 Saturday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * EList_Iterator.inlines.hh (1.2), Handler.defs.hh (1.2),
+ Makefile.am (1.14), Watchdog.defs.hh (1.14): Try to avoid very
+ long lines.
+
+2004-11-27 Saturday 17:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL, Makefile.am, compile, config.guess, configure.ac,
+ install-sh (altnum.[1,3,2,3,2,3]): Fifth number from main
+ repository.
+
+2004-11-20 Saturday 08:10 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.21): Define the PROFILING symbol when compiling
+ for profiling.
+
+2004-11-01 Monday 15:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * INSTALL (1.3), compile (1.3), config.guess (1.9), install-sh
+ (1.8): Updated from Automake 1.9.3.
+
+2004-10-29 Friday 17:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.13): Always specify the condition which is closed
+ by an Automake's `end',
+
+2004-10-01 Friday 19:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile, config.guess, config.sub, install-sh, ltmain.sh, missing
+ (altnum.[1,2,2,2,2,1]): Third merge from main trunk.
+
+2004-09-20 Monday 09:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile (1.2), install-sh (1.7), missing (1.4): Updated from
+ Automake 1.9.2.
+
+2004-09-19 Sunday 22:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am, Watchdog.cc (altnum.[2,2]): Second merge from main
+ trunk.
+
+2004-09-19 Sunday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.8), config.sub (1.8): Updated.
+
+2004-09-19 Sunday 18:29 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.9): Updated from Libtool 1.5.10.
+
+2004-09-16 Thursday 09:47 Enea Zaffanella <zaffanella at cs.unipr.it>
+
+ * Watchdog.cc (1.18): 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-02 Thursday 22:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.12): Prepared for PPL 0.7.
+
+2004-08-21 Saturday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.11): Match every `endif' with the corresponding
+ `if' condition.
+
+2004-08-20 Friday 19:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_6-branch.3): Mark ChangeLog.
+
+2004-08-20 Friday 17:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_6-branch.2): Updated.
+
+2004-08-20 Friday 15:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * NEWS (ppl-0_6-branch.1): Updated for the release of PPL 0.6.1.
+
+2004-08-19 Thursday 17:43 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, 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, NEWS, 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, README, Time.cc,
+ Time.defs.hh, Time.inlines.hh, Time.types.hh, Watchdog.cc,
+ Watchdog.defs.hh, Watchdog.inlines.hh, config.guess, config.sub,
+ configure.ac, depcomp, install-sh, ltmain.sh
+ (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]):
+ First merge from main trunk.
+
+2004-08-18 Wednesday 22:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (ppl-0_6-branch.1), ChangeLog (1.8), configure.ac
+ (1.20): Version number bumped.
+
+2004-08-18 Wednesday 18:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_6-branch.1): Mark ChangeLog.
+
+2004-08-16 Monday 18:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * README (1.7): Updated.
+
+2004-08-16 Monday 09:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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.7): Updated.
+
+2004-08-13 Friday 18:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.10): Version info updated for the libtool
+ libraries.
+
+2004-08-08 Sunday 19:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.9), Watchdog.cc (1.17), Watchdog.defs.hh (1.13),
+ Watchdog.inlines.hh (1.11): Watchdog library completely
+ reorganized. Deadlock bug fixed in the process.
+
+2004-08-08 Sunday 19:30 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Handler.defs.hh (1.1), Handler.inlines.hh (1.1), Handler.types.hh
+ (1.1): Classes for handlers of the watchdog events.
+
+2004-08-07 Saturday 19:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.8): Updated from Libtool 1.5.8.
+
+2004-08-07 Saturday 08:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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>
+
+ * 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>
+
+ * 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>
+
+ * 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>
+
+ * 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>
+
+ * EList.defs.hh (1.2): Class comment revised.
+
+2004-08-06 Friday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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>
+
+ * 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-04 Wednesday 22:28 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.6), install-sh (1.6): Updated from Automake 1.9.
+
+2004-08-04 Wednesday 20:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.7), config.sub (1.7): Updated.
+
+2004-07-08 Thursday 16:50 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.cc (1.16): Spacing fixed.
+
+2004-05-09 Sunday 17:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.cc (1.15): Anachronisms removed.
+
+2004-04-25 Sunday 22:13 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.5), install-sh (1.5), mkinstalldirs (1.3): Updated
+ from Automake 1.8.4.
+
+2004-04-06 Tuesday 21:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.6), config.sub (1.6), ltmain.sh (1.7): Updated
+ from libtool-1.5.4.
+
+2004-01-28 Wednesday 09:08 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.8), README (1.6), Watchdog.cc (1.14),
+ Watchdog.defs.hh (1.12), Watchdog.inlines.hh (1.10),
+ Watchdog.types.hh (1.5), configure.ac (1.19), pwl_header.top
+ (1.4): Update copyright years.
+
+2004-01-27 Tuesday 17:39 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * compile (1.1): Added from Automake 1.8.2.
+
+2004-01-25 Sunday 22:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.4), install-sh (1.4), missing (1.3), mkinstalldirs
+ (1.2): Update from Automake.
+
+2004-01-25 Sunday 22:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.5), config.sub (1.5): Updated from config.
+
+2004-01-25 Sunday 22:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.6): Updated from Libtool 1.5.2.
+
+2003-12-05 Friday 11:24 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.cc (1.13): Do not use the ITIMER_PROF timer when
+ profiling.
+
+2003-11-04 Tuesday 17:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.4), config.sub (1.4): Updated.
+
+2003-10-03 Friday 12:22 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.4): Ignore config.h.in.
+
+2003-10-03 Friday 09:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.h.in (1.4): These should not be in the repository, since
+ they are automatically generated.
+
+2003-09-10 Wednesday 18:41 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * config.guess (1.3), config.sub (1.3), depcomp (1.3), install-sh
+ (1.3), missing (1.2): Updated.
+
+2003-08-06 Wednesday 08:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.18): Allow for `mild', -O1 optimization.
+
+2003-07-05 Saturday 17:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.cc (1.12): Delete statement uncommented.
+
+2003-04-27 Sunday 21:53 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog, NEWS, README, configure.ac (ppl-0_5-branch.[2,1,1,1]):
+ Synchronize with the main trunk.
+
+2003-04-27 Sunday 21:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_5-branch.1): Mark ChangeLog.
+
+2003-04-27 Sunday 21:31 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.6): Updated.
+
+2003-04-27 Sunday 21:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.17): Version number bumped.
+
+2003-04-27 Sunday 21:18 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.5): Updated.
+
+2003-04-27 Sunday 21:16 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (1.4), NEWS (1.3), README (1.5): Updated for release
+ 0.2.
+
+2003-04-17 Thursday 22:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.cc (1.11): Prefer anonymous namespaces to static
+ declarations.
+
+2003-04-15 Tuesday 13:38 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.5): Updated.
+
+2003-04-11 Friday 08:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.4): Updated.
+
+2003-04-07 Monday 16:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ltmain.sh (1.3): Updated.
+
+2003-03-03 Monday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * depcomp (1.2), install-sh (1.2): Updated.
+
+2003-03-03 Monday 21:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.16): Require Autoconf 2.57 or following and
+ Automake 1.7.3 or following.
+
+2003-03-03 Monday 18:35 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * COPYING (1.2), ChangeLog (1.3), INSTALL (1.2), NEWS (1.2),
+ config.guess (1.2), config.sub (1.2), ltmain.sh (1.2): Updated.
+
+2003-03-03 Monday 18:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.7): Update version info.
+
+2003-02-07 Friday 10:56 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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.inlines.hh (1.9): Throw std::invalid_argument if a
+ Watchdog constructor is called with a non-positive number of time
+ units.
+
+2003-01-26 Sunday 22:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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-12 Sunday 08:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.defs.hh (1.11): Spurious, illegal qualification removed.
+
+2003-01-10 Friday 09:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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-09 Thursday 10:11 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.15): Building the Parma Watchdog Library is now
+ enabled by default.
+
+2003-01-01 Wednesday 02:48 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.6), README (1.4), Watchdog.cc (1.7),
+ Watchdog.defs.hh (1.9), Watchdog.inlines.hh (1.7),
+ Watchdog.types.hh (1.3), configure.ac (1.14), pwl_header.top
+ (1.3): Update copyright years.
+
+2002-11-05 Tuesday 11:49 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.cc (1.6), Watchdog.defs.hh (1.8): Standard conformance
+ fixes.
+
+2002-11-05 Tuesday 10:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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.12): Avoid using obsolete macros.
+
+2002-11-03 Sunday 11:06 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * pwl_header.middle (1.2): Include sys/time.h, if available.
+
+2002-11-03 Sunday 09:42 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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>
+
+ * 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 16:46 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.10): Buggy conditional fixed.
+
+2002-10-19 Saturday 00:40 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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-04 Friday 12:21 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_4-branch.3): Mark ChangeLog.
+
+2002-08-17 Saturday 13:44 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.defs.hh, Watchdog.inlines.hh, Watchdog.types.hh,
+ pwl_header.top (alt_nnc.[1,1,1,1]): Merge changes from the trunk
+ between tags `merge_to_alt_nnc' and `second_merge_to_alt_nnc'.
+
+2002-08-16 Friday 10:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.defs.hh (1.6), Watchdog.inlines.hh (1.5),
+ Watchdog.types.hh (1.2), pwl_header.top (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-07-30 Tuesday 11:14 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_4-branch.2): Mark ChangeLog.
+
+2002-07-02 Tuesday 21:52 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.9): Shared libraries are again turned off by
+ default.
+
+2002-07-01 Monday 18:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * ChangeLog (ppl-0_4-branch.1): Mark ChangeLog.
+
+2002-06-30 Sunday 20:15 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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>
+
+ * 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.8): Invocations to AC_PROG_* macros repositioned.
+
+2002-06-30 Sunday 15:17 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.defs.hh (1.4), Watchdog.inlines.hh (1.3): Use methods
+ instead of friends for binary operators over Time.
+
+2002-06-25 Tuesday 15:03 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.3): For those building in the sources' directory.
+
+2002-06-24 Monday 12:23 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * configure.ac (1.7): Fixed typo in a comment.
+
+2002-06-17 Monday 08:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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-15 Saturday 14:47 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.5): dist-hook goes into the unconditional section.
+
+2002-06-09 Sunday 16:36 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Makefile.am (1.4), configure.ac (1.6): Consistent spelling for
+ Autoconf and Automake.
+
+2002-06-09 Sunday 16:33 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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.4): Be more friendly to compilers different from
+ GCC.
+
+2002-05-28 Tuesday 13:07 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.2): For those building in the sources' tree.
+
+2002-05-28 Tuesday 12:58 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * Watchdog.cc (1.4), Watchdog.defs.hh (1.2), Watchdog.inlines.hh
+ (1.2): Better implementation using templates.
+
+2002-05-27 Monday 15:57 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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-24 Friday 07:25 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * 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-22 Wednesday 11:02 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ * .cvsignore (1.1), BUGS (1.1), COPYING (1.1), CREDITS (1.1),
+ ChangeLog (1.1), INSTALL (1.1), Makefile.am (1.1), NEWS (1.1),
+ README (1.1), Timeout.hh (1.1), Watchdog.cc (1.1), Watchdog.hh
+ (1.1), config.h.in (1.1), 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.
+
diff --git a/Watchdog/INSTALL b/Watchdog/INSTALL
new file mode 100644
index 0000000..56b077d
--- /dev/null
+++ b/Watchdog/INSTALL
@@ -0,0 +1,236 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
+Software Foundation, Inc.
+
+This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+These are generic installation instructions.
+
+ 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 only 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. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes awhile. 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.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. 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.
+
+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=c89 CFLAGS=-O2 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 must use a version of `make' that
+supports the `VPATH' variable, such as 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 `..'.
+
+ If you have to use a `make' that does not support the `VPATH'
+variable, you have 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.
+
+Installation Names
+==================
+
+By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PREFIX'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PREFIX', the package will
+use PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files will 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.
+
+ 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'.
+
+Optional Features
+=================
+
+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.
+
+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 `--target=TYPE' option 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). Here is a another example:
+
+ /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
+configuration-related scripts to be executed by `/bin/bash'.
+
+`configure' Invocation
+======================
+
+`configure' recognizes the following options to control how it operates.
+
+`--help'
+`-h'
+ Print a summary of the options to `configure', and exit.
+
+`--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.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
diff --git a/Watchdog/Makefile.am b/Watchdog/Makefile.am
new file mode 100644
index 0000000..56ff427
--- /dev/null
+++ b/Watchdog/Makefile.am
@@ -0,0 +1,30 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can 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.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+SUBDIRS = utils src
+
+dist_noinst_SCRIPTS = \
+configure
+
+EXTRA_DIST = \
+BUGS \
+CREDITS
diff --git a/Watchdog/Makefile.in b/Watchdog/Makefile.in
new file mode 100644
index 0000000..c07c4ce
--- /dev/null
+++ b/Watchdog/Makefile.in
@@ -0,0 +1,654 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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 Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can 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.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = .
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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@
+DIST_COMMON = README $(am__configure_deps) $(dist_noinst_SCRIPTS) \
+ $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/config.h.in $(top_srcdir)/configure COPYING \
+ ChangeLog INSTALL NEWS compile config.guess config.sub depcomp \
+ install-sh ltmain.sh missing mkinstalldirs
+subdir = .
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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 configure.status.lineno
+mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
+CONFIG_HEADER = config.h
+CONFIG_CLEAN_FILES =
+SCRIPTS = $(dist_noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+ { test ! -d $(distdir) \
+ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
+ && rm -fr $(distdir); }; }
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+datadir = @datadir@
+debug_flag = @debug_flag@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+SUBDIRS = utils src
+dist_noinst_SCRIPTS = \
+configure
+
+EXTRA_DIST = \
+BUGS \
+CREDITS
+
+all: config.h
+ $(MAKE) $(AM_MAKEFLAGS) all-recursive
+
+.SUFFIXES:
+am--refresh:
+ @:
+$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
+ @for dep in $?; do \
+ case '$(am__configure_deps)' in \
+ *$$dep*) \
+ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign '; \
+ cd $(srcdir) && $(AUTOMAKE) --foreign \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+ 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)
+ cd $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4): $(am__aclocal_m4_deps)
+ cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+
+config.h: stamp-h1
+ @if test ! -f $@; then \
+ rm -f stamp-h1; \
+ $(MAKE) stamp-h1; \
+ else :; fi
+
+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)
+ cd $(top_srcdir) && $(AUTOHEADER)
+ rm -f stamp-h1
+ touch $@
+
+distclean-hdr:
+ -rm -f config.h stamp-h1
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+ $(am__remove_distdir)
+ mkdir $(distdir)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+ -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -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 $(SHELL) $(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__remove_distdir)
+dist-bzip2: distdir
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ $(am__remove_distdir)
+
+dist-tarZ: distdir
+ tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+ $(am__remove_distdir)
+
+dist-shar: distdir
+ shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
+ $(am__remove_distdir)
+dist-zip: distdir
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__remove_distdir)
+
+dist dist-all: distdir
+ tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
+ tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
+ -rm -f $(distdir).zip
+ zip -rq $(distdir).zip $(distdir)
+ $(am__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) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
+ *.tar.bz2*) \
+ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
+ *.tar.Z*) \
+ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+ *.shar.gz*) \
+ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
+ *.zip*) \
+ unzip $(distdir).zip ;;\
+ esac
+ chmod -R a-w $(distdir); chmod a+w $(distdir)
+ mkdir $(distdir)/_build
+ mkdir $(distdir)/_inst
+ chmod a-w $(distdir)
+ dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+ && cd $(distdir)/_build \
+ && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ $(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
+ $(am__remove_distdir)
+ @(echo "$(distdir) archives ready for distribution: "; \
+ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+ sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
+distuninstallcheck:
+ @cd $(distuninstallcheck_dir) \
+ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
+ || { 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) 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 $(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
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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: uninstall-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
+ check-am clean clean-generic clean-libtool clean-recursive \
+ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
+ dist-shar dist-tarZ dist-zip distcheck distclean \
+ distclean-generic distclean-hdr distclean-libtool \
+ distclean-recursive distclean-tags distcleancheck distdir \
+ distuninstallcheck dvi dvi-am html html-am info info-am \
+ install install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ installdirs-am maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am uninstall-info-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/Watchdog/NEWS b/Watchdog/NEWS
new file mode 100644
index 0000000..ff70afd
--- /dev/null
+++ b/Watchdog/NEWS
@@ -0,0 +1,65 @@
+
+Parma Watchdog Library NEWS -- history of user-visible changes
+==============================================================
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.5 (released on January 20, 2006)
+--------------------------------------------------------------------------
+
+o Portability has been improved.
+
+o The configuration option --enable-optimization now accepts a value
+ of `zero'.
+
+
+Bugfixes
+========
+
+o Fixed a bug in Time::operator+=(const Time&) where the resulting
+ number of microseconds was being erroneously set to the resulting
+ number of seconds.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.4 (released on December 24, 2004)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o Fixed a bug that prevented profiling from functioning properly.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.3 (released on August 18, 2004)
+--------------------------------------------------------------------------
+
+Bugfixes
+========
+
+o Fixed a deadlock bug.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.2 (released on April 28, 2003)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o Added implicit and automatic initialization and finalization of the
+ library. Explicit initialization and finalization is no longer
+ necessary nor possible.
+
+o Portability improvements.
+
+
+--------------------------------------------------------------------------
+NEWS for version 0.1 (released on July 1, 2002)
+--------------------------------------------------------------------------
+
+New Features
+============
+
+o The library has been released under the GNU General Public License.
diff --git a/Watchdog/README b/Watchdog/README
new file mode 100644
index 0000000..16a7817
--- /dev/null
+++ b/Watchdog/README
@@ -0,0 +1,94 @@
+
+This is the release 0.5 of the Parma Watchdog Library:
+a C++ library for software timeouts.
+
+To be continued...
+
+See http://www.cs.unipr.it/Software/ for more information on the PWL.
+See the file COPYING for licensing information.
+See the file INSTALL for build and installation 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 and organizations that
+contributed to the PWL.
+
+Here is the contents of the PWL 0.5 source distribution
+(2 directories, 56 files):
+
+Watchdog
+|-- BUGS
+|-- COPYING
+|-- CREDITS
+|-- ChangeLog
+|-- INSTALL
+|-- Makefile.am
+|-- Makefile.in
+|-- NEWS
+|-- README
+|-- aclocal.m4
+|-- compile
+|-- config.guess
+|-- config.h.in
+|-- config.sub
+|-- configure
+|-- configure.ac
+|-- depcomp
+|-- install-sh
+|-- ltmain.sh
+|-- missing
+|-- mkinstalldirs
+|-- src
+| |-- 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.hh.dist
+| `-- pwl_header.hh
+`-- utils
+ |-- Makefile.am
+ |-- Makefile.in
+ `-- build_header.in
+
+--------
+
+Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+The Parma Watchdog Library is free software; you can 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
diff --git a/Watchdog/aclocal.m4 b/Watchdog/aclocal.m4
new file mode 100644
index 0000000..4723f85
--- /dev/null
+++ b/Watchdog/aclocal.m4
@@ -0,0 +1,7227 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 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.
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 48 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+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
+
+# 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 to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+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 \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])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_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+AC_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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$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.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$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 conftest*
+])# _LT_LINKER_BOILERPLATE
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# 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.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 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
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# 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
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_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 __oline__ "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-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|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-*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-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ 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_TRY_LINK([],[],[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
+ ;;
+sparc*-*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*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ printf "$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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# 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*)
+ # 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;
+ ;;
+
+ 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
+ ;;
+
+ 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
+ ;;
+ *)
+ # 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.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ 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`
+ ;;
+ 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
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_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 <<EOF
+[#line __oline__ "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
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=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;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}]
+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_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_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*)
+ 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="-dld"],
+ [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="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ 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_AC_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_AC_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
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:__oline__: $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:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_AC_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 ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_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
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_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
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_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_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; 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
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[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"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[[123]]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+ [include additional configurations @<:@automatic@:>@])],
+ [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ AC_MSG_WARN([output file `$ofile' does not exist])
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+ else
+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+ "") ;;
+ *) AC_MSG_ERROR([invalid tag name: $tagname])
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ AC_MSG_ERROR([tag name \"$tagname\" already exists])
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_LIBTOOL_LANG_CXX_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ AC_LIBTOOL_LANG_F77_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ AC_LIBTOOL_LANG_GCJ_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+ AC_LIBTOOL_LANG_RC_CONFIG
+ ;;
+
+ *)
+ AC_MSG_ERROR([Unsupported tag name: $tagname])
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ AC_MSG_ERROR([unable to update list of available tagged configurations.])
+ fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 DLLs
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]AC_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=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+# set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]AC_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=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]AC_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=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_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="ifelse([$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 <<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
+
+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
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_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
+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+ [AC_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])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])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])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+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
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[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
+ 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
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise 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
+aix4* | aix5*)
+ 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'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu | 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
+ ;;
+
+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]) 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
+ ;;
+
+interix3*)
+ # 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 Linux ELF.
+linux*)
+ 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=unknown
+ ;;
+
+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
+ ;;
+
+solaris*)
+ 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
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+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
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible 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
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-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_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# it is assumed to be `libltdl'. LIBLTDL will be prefixed with
+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
+# (note the single quotes!). If your package is not flat and you're not
+# using automake, define top_builddir and top_srcdir appropriately in
+# the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# and an installed libltdl is not found, it is assumed to be `libltdl'.
+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and top_srcdir
+# appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+ fi
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ------------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+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
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# -------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[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_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF
+
+# 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
+ ;;
+
+aix4* | aix5*)
+ 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])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_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_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++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ AC_PROG_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_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_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_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_AC_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 "\-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_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ 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
+ 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]].*|aix5*)
+ 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_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ 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
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_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
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_AC_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 echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_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_AC_SYS_LIBPATH_AIX
+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_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_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes ; then
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_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'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "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~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ freebsd[[12]]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ freebsd-elf*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ _LT_AC_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) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ interix3*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_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_AC_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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ linux*)
+ 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_AC_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_AC_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; echo $list'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+ _LT_AC_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_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc*)
+ # 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_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ _LT_AC_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'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_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=`echo $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; echo $list'
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ _LT_AC_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_AC_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_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd='echo'
+ ;;
+ osf3*)
+ 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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_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" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_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 "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ 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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_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 "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker. We must also pass each convience library through
+ # to the system linker between allextract/defaultextract.
+ # The C++ compiler will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ output_verbose_link_cmd='echo'
+
+ # 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_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_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_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -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 \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_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 \"\-L\""
+ fi
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ fi
+ ;;
+ esac
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_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.
+ # 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.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+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
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([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.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+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...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+EOF
+])
+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
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $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
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p 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_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_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_AC_TAGVAR(postdeps, $1)"; then
+ _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$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_AC_TAGVAR(predep_objects, $1)"; then
+ _LT_AC_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+ _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_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
+
+# PORTME: override above test on systems where it is broken
+ifelse([$1],[CXX],
+[case $host_os in
+interix3*)
+ # 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_AC_TAGVAR(predep_objects,$1)=
+ _LT_AC_TAGVAR(postdep_objects,$1)=
+ _LT_AC_TAGVAR(postdeps,$1)=
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # 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.
+ _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
+ ;;
+ esac
+ ;;
+esac
+])
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_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_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_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"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+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
+ ;;
+aix4* | aix5*)
+ 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_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_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"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# -------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# 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_AC_SYS_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"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then 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
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ _LT_AC_TAGVAR(compiler, $1) \
+ _LT_AC_TAGVAR(CC, $1) \
+ _LT_AC_TAGVAR(LD, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+ _LT_AC_TAGVAR(old_archive_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+ _LT_AC_TAGVAR(predep_objects, $1) \
+ _LT_AC_TAGVAR(postdep_objects, $1) \
+ _LT_AC_TAGVAR(predeps, $1) \
+ _LT_AC_TAGVAR(postdeps, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+ _LT_AC_TAGVAR(archive_cmds, $1) \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(postinstall_cmds, $1) \
+ _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+ _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+ _LT_AC_TAGVAR(no_undefined_flag, $1) \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+ _LT_AC_TAGVAR(hardcode_automatic, $1) \
+ _LT_AC_TAGVAR(module_cmds, $1) \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+ _LT_AC_TAGVAR(exclude_expsyms, $1) \
+ _LT_AC_TAGVAR(include_expsyms, $1); do
+
+ case $var in
+ _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(module_cmds, $1) | \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\[$]0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+ ;;
+ esac
+
+ifelse([$1], [],
+ [cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ AC_MSG_NOTICE([creating $ofile])],
+ [cfgfile="$ofile"])
+
+ cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# 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.
+
+# 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//"
+
+# 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
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# 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=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+ case $host_os in
+ aix3*)
+ cat <<\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
+EOF
+ ;;
+ esac
+
+ # 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)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+])
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# 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]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \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\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDGIRSTW]]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ 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
+
+# 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
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, 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.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+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 <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_AC_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_save_LIBS"
+ CFLAGS="$lt_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 -f 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
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # 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_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ interix3*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # 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*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_AC_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
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler.
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ interix3*)
+ # 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_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ ccc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ unicos*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+ $lt_tmp_static_flag,
+ [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_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_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+],[
+ runpath_var=
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)=
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+ _LT_AC_TAGVAR(module_cmds, $1)=
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_AC_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_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ _LT_CC_BASENAME([$compiler])
+ 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
+
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = 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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_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_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [[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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=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 can't use
+ # them.
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_AC_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'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_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_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ interix3*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_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_AC_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_AC_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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ _LT_AC_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 -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $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_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_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_AC_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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
+ runpath_var=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ _LT_AC_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_AC_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_AC_TAGVAR(hardcode_direct, $1)=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
+ 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_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]].*|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
+
+ 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_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ 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
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_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
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_AC_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 echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_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_AC_SYS_LIBPATH_AIX
+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_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*)
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ # see comment about different semantics on the GNU ld section
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ bsdi[[45]]*)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ 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.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ freebsd1*)
+ _LT_AC_TAGVAR(ld_shlibs, $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_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_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_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_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~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_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'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
+ *)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_AC_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_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $rm conftest*
+ printf "$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_AC_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+ ;;
+ esac
+ fi
+ ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+# 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. #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+AC_DEFUN([LT_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
+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_MSG_RESULT([$SED])
+])
+
+# Copyright (C) 2002, 2003, 2005 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.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 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, 2000, 2001, 2003, 2004, 2005
+# 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.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+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, 2000, 2001, 2002, 2003, 2004, 2005
+# 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.
+
+# serial 8
+
+# 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", "GCJ", or "OBJC".
+# 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
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# 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.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; 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.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /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"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# 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.
+
+# serial 12
+
+# 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.
+
+# 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.58])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
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+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],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])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)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# 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)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# 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_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 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
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 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.
+
+# serial 2
+
+# 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, 2002, 2003, 2005 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.
+
+# serial 3
+
+# 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 done
+.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
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+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, 1999, 2000, 2001, 2003, 2005
+# 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.
+
+# serial 4
+
+# 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 supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005 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_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='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.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 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.
+
+# serial 3
+
+# _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],
+[AC_FOREACH([_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])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# 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.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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 (
+ 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
+ rm -f conftest.file
+ 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
+
+ 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)])
+
+# Copyright (C) 2001, 2003, 2005 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="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 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.
+
+# serial 2
+
+# _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.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+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])
+ 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
+
diff --git a/Watchdog/compile b/Watchdog/compile
new file mode 100755
index 0000000..cd27e88
--- /dev/null
+++ b/Watchdog/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 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, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# 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>.
+
+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 $?
+ ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+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 -e 's|^.*/||' -e '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
+ mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ 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-end: "$"
+# End:
diff --git a/Watchdog/config.guess b/Watchdog/config.guess
new file mode 100755
index 0000000..ec46d18
--- /dev/null
+++ b/Watchdog/config.guess
@@ -0,0 +1,1498 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2006-02-27'
+
+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# 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 Per Bothner <per at bothner.com>.
+# Please send patches to <config-patches at gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+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
+
+# 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 tupples: *-*-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 ;;
+ *) 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 __ELF__ >/dev/null
+ 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 ;;
+ *: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 powerppc-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'`
+ exit ;;
+ 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 ;;
+ 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:SunOS:5.*:*)
+ echo i386-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:*:[45])
+ 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 __LP64__ >/dev/null
+ 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:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:MSYS_NT-*:*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[345]*)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T:Interix*:[345]*)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-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-gnu`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/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ 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 ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*)
+ 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 i386.
+ echo i386-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; } ;;
+ 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.0*:*)
+ 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 ;;
+ 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 ;;
+ 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
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ 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 ;;
+ 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 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+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://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+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/Watchdog/config.h.in b/Watchdog/config.h.in
new file mode 100644
index 0000000..428cd43
--- /dev/null
+++ b/Watchdog/config.h.in
@@ -0,0 +1,70 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define to 1 if you have the `setitimer' function. */
+#undef HAVE_SETITIMER
+
+/* 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/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 you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Assertions are disabled when this is defined */
+#undef NDEBUG
+
+/* Name of package */
+#undef PACKAGE
+
+/* 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 version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#undef TIME_WITH_SYS_TIME
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to empty if `const' does not conform to ANSI C. */
+#undef const
diff --git a/Watchdog/config.sub b/Watchdog/config.sub
new file mode 100755
index 0000000..ab2c16c
--- /dev/null
+++ b/Watchdog/config.sub
@@ -0,0 +1,1609 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2006-02-27'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# 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.
+
+
+# Please send patches to <config-patches at gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# 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.
+
+# 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+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-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ 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)
+ os=
+ basic_machine=$1
+ ;;
+ -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*)
+ 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 \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-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-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # 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
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ 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
+ ;;
+ cr16c)
+ basic_machine=cr16c-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
+ ;;
+ 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'm not sure what "Sysv32" means. Should this be sysv3.2?
+ 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
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ 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-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ 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
+ ;;
+ 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
+ ;;
+ 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) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) 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)
+ 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
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ 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
+ ;;
+ 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
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ 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
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-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[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.
+ -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* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -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* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -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*)
+ # 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
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -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
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ 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
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ 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
+ ;;
+ -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/Watchdog/configure b/Watchdog/configure
new file mode 100755
index 0000000..d14003f
--- /dev/null
+++ b/Watchdog/configure
@@ -0,0 +1,22264 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for the Parma Watchdog Library 0.4.
+#
+# Report bugs to <bagnara at cs.unipr.it>.
+#
+# Copyright (C) 2003 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 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+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; 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
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ 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
+
+ ;;
+ 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
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # 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 sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# 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
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='the Parma Watchdog Library'
+PACKAGE_TARNAME='watchdog'
+PACKAGE_VERSION='0.4'
+PACKAGE_STRING='the Parma Watchdog Library 0.4'
+PACKAGE_BUGREPORT='bagnara at cs.unipr.it'
+
+ac_unique_file="src/Watchdog.cc"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INS [...]
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# 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.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+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
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -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 | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$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 ;;
+
+ -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 ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ 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 ;;
+
+ -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=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 ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ 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'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+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
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ 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
+
+
+# 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 its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ 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
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_F77_set=${F77+set}
+ac_env_F77_value=$F77
+ac_cv_env_F77_set=${F77+set}
+ac_cv_env_F77_value=$F77
+ac_env_FFLAGS_set=${FFLAGS+set}
+ac_env_FFLAGS_value=$FFLAGS
+ac_cv_env_FFLAGS_set=${FFLAGS+set}
+ac_cv_env_FFLAGS_value=$FFLAGS
+
+#
+# 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 Watchdog Library 0.4 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 \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+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]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --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]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_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 Watchdog Library 0.4:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --enable-debugging compile with debugging information
+ --enable-profiling compile for profiling
+ --enable-coverage compile for test coverage
+ --enable-assertions check run-time assertions
+ --enable-optimization enable compiler optimizations
+ --enable-arch=arch optimize for architecture arch
+ --enable-watchdog build also the Parma Watchdog Library
+ --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-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-tags[=TAGS]
+ include additional configurations [automatic]
+
+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>
+ CPPFLAGS 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
+ F77 Fortran 77 compiler command
+ FFLAGS Fortran 77 compiler flags
+
+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 <bagnara at cs.unipr.it>.
+_ACEOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style 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
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+the Parma Watchdog Library configure 0.4
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 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 0
+fi
+exec 5>config.log
+cat >&5 <<_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 Watchdog Library $as_me 0.4, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+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`
+hostinfo = `(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=.
+ echo "PATH: $as_dir"
+done
+
+} >&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_sep=
+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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$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
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >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
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ 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.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+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 `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+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
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`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.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Minimum autoconf version required.
+
+
+# Make sure the sources are there.
+
+
+# Use Automake.
+am__api_version="1.9"
+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
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# 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.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+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. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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 (
+ 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
+ rm -f conftest.file
+ 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".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+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 $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='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.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+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='watchdog'
+ VERSION='0.4'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# 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"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+# Generate a configuration header file.
+ ac_config_headers="$ac_config_headers config.h"
+
+
+# C compiler
+
+
+# Check whether --with-cc or --without-cc was given.
+if test "${with_cc+set}" = set; then
+ withval="$with_cc"
+ CC=$with_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
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-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='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+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
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_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"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+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
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out 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.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$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
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 -std1 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 -std1. */
+int osf4_cc_array ['\x00' == 0 ? 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
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f 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
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset x;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *ccp;
+ char **p;
+ /* 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";
+ ccp = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++ccp;
+ p = (char**) ccp;
+ ccp = (char const *const *) p;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 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 saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+
+# C++ compiler
+
+
+# Check whether --with-cxx or --without-cxx was given.
+if test "${with_cxx+set}" = set; then
+ withval="$with_cxx"
+ CXX=$with_cxx
+fi;
+
+ac_ext=cc
+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 programs.
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_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"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+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
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$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
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 -std1 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 -std1. */
+int osf4_cc_array ['\x00' == 0 ? 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
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_ext=cc
+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
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+ac_ext=cc
+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 -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cxx_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$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
+for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+ac_ext=cc
+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
+
+depcc="$CXX" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+ac_ext=cc
+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
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+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
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# 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.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+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. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+
+# Check for Perl.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+ echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+
+
+if test x"$PERL" != xno; then
+ HAVE_PERL_TRUE=
+ HAVE_PERL_FALSE='#'
+else
+ HAVE_PERL_TRUE='#'
+ HAVE_PERL_FALSE=
+fi
+
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
+echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6
+# Check whether --enable-debugging or --disable-debugging was given.
+if test "${enable_debugging+set}" = set; then
+ enableval="$enable_debugging"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ OPT_FLAGS="-g"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
+echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6
+# Check whether --enable-profiling or --disable-profiling was given.
+if test "${enable_profiling+set}" = set; then
+ enableval="$enable_profiling"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
+echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6
+# Check whether --enable-coverage or --disable-coverage was given.
+if test "${enable_coverage+set}" = set; then
+ enableval="$enable_coverage"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
+echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6
+# Check whether --enable-assertions or --disable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+ enableval="$enable_assertions"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+cat >>confdefs.h <<\_ACEOF
+#define NDEBUG 1
+_ACEOF
+
+ debug_flag="-DNDEBUG=1"
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} --enable-assertions, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+arch=no
+enableval=standard
+echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
+echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6
+# Check whether --enable-optimization or --disable-optimization was given.
+if test "${enable_optimization+set}" = set; then
+ enableval="$enable_optimization"
+
+fi;
+case "${enableval}" in
+sspeed)
+ echo "$as_me:$LINENO: result: sspeed" >&5
+echo "${ECHO_T}sspeed" >&6
+ OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+ arch=yes
+ ;;
+speed)
+ echo "$as_me:$LINENO: result: speed" >&5
+echo "${ECHO_T}speed" >&6
+ OPT_FLAGS="$OPT_FLAGS -O3"
+ arch=yes
+ ;;
+size)
+ echo "$as_me:$LINENO: result: size" >&5
+echo "${ECHO_T}size" >&6
+ OPT_FLAGS="$OPT_FLAGS -Os"
+ arch=yes
+ ;;
+standard | yes)
+ echo "$as_me:$LINENO: result: standard" >&5
+echo "${ECHO_T}standard" >&6
+ OPT_FLAGS="$OPT_FLAGS -O2"
+ ;;
+mild)
+ echo "$as_me:$LINENO: result: mild" >&5
+echo "${ECHO_T}mild" >&6
+ OPT_FLAGS="$OPT_FLAGS -O1"
+ ;;
+zero)
+ echo "$as_me:$LINENO: result: zero" >&5
+echo "${ECHO_T}zero" >&6
+ OPT_FLAGS="$OPT_FLAGS -O0"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=$arch
+echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
+echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6
+# Check whether --enable-arch or --disable-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)
+ echo "$as_me:$LINENO: result: $m" >&5
+echo "${ECHO_T}$m" >&6
+ OPT_FLAGS="$OPT_FLAGS -march=$m"
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+ ;;
+ esac
+ ;;
+no)
+ echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+ ;;
+*)
+ echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+ OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+ ;;
+esac
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+# Allow additions to C and C++ compilation flags
+
+
+# Check whether --with-cflags or --without-cflags was given.
+if test "${with_cflags+set}" = set; then
+ withval="$with_cflags"
+ CFLAGS="$CFLAGS $with_cflags"
+fi;
+
+
+# Check whether --with-cxxflags or --without-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then
+ withval="$with_cxxflags"
+ CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi;
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
+echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6
+# Check whether --enable-watchdog or --disable-watchdog was given.
+if test "${enable_watchdog+set}" = set; then
+ enableval="$enable_watchdog"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} --enable-watchdog, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+build_watchdog_library=$enableval
+
+
+if test x"$build_watchdog_library" = xyes; then
+ BUILD_WATCHDOG_LIBRARY_TRUE=
+ BUILD_WATCHDOG_LIBRARY_FALSE='#'
+else
+ BUILD_WATCHDOG_LIBRARY_TRUE='#'
+ BUILD_WATCHDOG_LIBRARY_FALSE=
+fi
+
+
+if test x"$build_watchdog_library" = xyes
+then
+ # Checks for header files.
+
+echo "$as_me:$LINENO: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_time=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_time=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TIME_WITH_SYS_TIME 1
+_ACEOF
+
+fi
+
+
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.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))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+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=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+for ac_header in sys/time.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ---------------------------------- ##
+## Report this to bagnara at cs.unipr.it ##
+## ---------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+ # Checks for library fuctions.
+ # The following invocations of AC_LANG_PUSH(C) and AC_LANG_POP(C)
+ # are to work around a bug in AC_CHECK_FUNCS. For more information,
+ # http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html
+ 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_func in setitimer
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define $ac_func innocuous_$ac_func
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); 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 $ac_func
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+/* 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_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+char (*f) () = $ac_func;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != $ac_func;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_var=no"
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+_ACEOF
+
+else
+ { { echo "$as_me:$LINENO: error: CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&5
+echo "$as_me: error: CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+done
+
+ ac_ext=cc
+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
+
+fi
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+
+
+
+
+# Check whether --enable-shared or --disable-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 or --disable-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 --enable-fast-install or --disable-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;
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
+if test "${lt_cv_path_SED+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # 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
+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
+
+fi
+
+SED=$lt_cv_path_SED
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
+
+# Check whether --with-gnu-ld or --without-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.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&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
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$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
+ 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
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6
+NM="$lt_cv_path_NM"
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+aix4* | aix5*)
+ 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'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu | 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
+ ;;
+
+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]) 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
+ ;;
+
+interix3*)
+ # 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 Linux ELF.
+linux*)
+ 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=unknown
+ ;;
+
+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
+ ;;
+
+solaris*)
+ 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
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+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 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 whether --enable-libtool-lock or --disable-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:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 6381 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ 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-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ 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"
+ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ lt_cv_cc_needs_belf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+lt_cv_cc_needs_belf=no
+fi
+rm -f 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
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$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
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_DLLTOOL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ echo "$as_me:$LINENO: result: $DLLTOOL" >&5
+echo "${ECHO_T}$DLLTOOL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="false"
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
+echo "${ECHO_T}$ac_ct_DLLTOOL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ DLLTOOL=$ac_ct_DLLTOOL
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+ echo "$as_me:$LINENO: result: $AS" >&5
+echo "${ECHO_T}$AS" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+ ac_ct_AS=$AS
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_AS"; then
+ ac_cv_prog_ac_ct_AS="$ac_ct_AS" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AS="as"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="false"
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+ echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
+echo "${ECHO_T}$ac_ct_AS" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AS=$ac_ct_AS
+else
+ AS="$ac_cv_prog_AS"
+fi
+
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ echo "$as_me:$LINENO: result: $OBJDUMP" >&5
+echo "${ECHO_T}$OBJDUMP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_OBJDUMP" && ac_cv_prog_ac_ct_OBJDUMP="false"
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
+echo "${ECHO_T}$ac_ct_OBJDUMP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ OBJDUMP=$ac_ct_OBJDUMP
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+ ;;
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+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
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ---------------------------------- ##
+## Report this to bagnara at cs.unipr.it ##
+## ---------------------------------- ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+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=cc
+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
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+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
+
+fi
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$F77"; then
+ ac_cv_prog_F77="$F77" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+ echo "$as_me:$LINENO: result: $F77" >&5
+echo "${ECHO_T}$F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$F77" && break
+ done
+fi
+if test -z "$F77"; then
+ ac_ct_F77=$F77
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_F77"; then
+ ac_cv_prog_ac_ct_F77="$ac_ct_F77" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_F77="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+ echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+echo "${ECHO_T}$ac_ct_F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_F77" && break
+done
+
+ F77=$ac_ct_F77
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:7519:" \
+ "checking for Fortran 77 compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file. (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+#ifndef __GNUC__
+ choke me
+#endif
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_f77_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_f77_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_f77_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
+if test "$ac_test_FFLAGS" = set; then
+ FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-g -O2"
+ else
+ FFLAGS="-g"
+ fi
+else
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-O2"
+ else
+ FFLAGS=
+ fi
+fi
+
+G77=`test $ac_compiler_gnu = yes && echo yes`
+ac_ext=cc
+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
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+
+# find the maximum length of command line arguments
+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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*)
+ # 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;
+ ;;
+
+ 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
+ ;;
+
+ 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
+ ;;
+ *)
+ # 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.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ 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`
+ ;;
+ esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+ echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+else
+ echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \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\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDEGRST]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDGIRSTW]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ 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
+
+# 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
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, 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.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { (eval echo "$as_me:$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=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && 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 <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_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 -f 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
+ echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+ echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+if test "${lt_cv_objdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6
+objdir=$lt_cv_objdir
+
+
+
+
+
+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
+
+# 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 to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AR=$ac_ct_AR
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+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 \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<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
+
+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
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<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
+
+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
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+enable_dlopen=yes
+enable_win32_dll=yes
+
+# Check whether --enable-libtool-lock or --disable-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
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+ withval="$with_pic"
+ pic_mode="$withval"
+else
+ pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+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;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:8582: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:8586: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$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=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ 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*)
+ # 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'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ interix3*)
+ # 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
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ 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
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic='-qnocommon'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # 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'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ 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
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:8850: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:8854: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+
+if test x"$lt_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
+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
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works=yes
+ fi
+ else
+ lt_prog_compiler_static_works=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+
+if test x"$lt_prog_compiler_static_works" = xyes; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:8954: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:8958: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$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
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag=
+ enable_shared_with_static_runtimes=no
+ archive_cmds=
+ archive_expsym_cmds=
+ old_archive_From_new_cmds=
+ old_archive_from_expsyms_cmds=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ thread_safe_flag_spec=
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_flag_spec_ld=
+ hardcode_libdir_separator=
+ hardcode_direct=no
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ link_all_deplibs=unknown
+ hardcode_automatic=no
+ module_cmds=
+ module_expsym_cmds=
+ always_export_symbols=no
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # 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_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ 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
+ # 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>/dev/null` in
+ *\ [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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ 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
+
+ # 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 can't use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ 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*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ 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/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ 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
+ ;;
+
+ interix3*)
+ 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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ 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; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # 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; $echo \"$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' ;;
+ esac
+ archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; 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 -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ 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 $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'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ 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
+ ;;
+
+ 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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$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 $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
+
+ 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
+ ;;
+
+ 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
+ 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
+ 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")) && (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].*|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
+
+ 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_libdir_separator=':'
+ link_all_deplibs=yes
+
+ 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
+ hardcode_direct=yes
+ 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
+
+ # 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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 echo "${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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ 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*)
+ 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
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ 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=' '
+ 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 `echo "$deplibs" | $SED -e '\''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'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec=''
+ link_all_deplibs=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs=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* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds='$CC -shared -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 -fPIC ${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 -a "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared -fPIC ${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
+ 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 -a "$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 ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared -fPIC ${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'
+ ;;
+ *)
+ archive_cmds='$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
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld='+b $libdir'
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ 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
+ ;;
+
+ openbsd*)
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ 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
+ ;;
+
+ 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" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ 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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${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='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -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; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds='$CC -shared ${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 ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ 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'
+ 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 linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ 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*)
+ 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='`test -z "$SCOABSPATH" && echo ${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,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 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:$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=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc=no
+ else
+ archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var" || \
+ test "X$hardcode_automatic" = "Xyes" ; then
+
+ # We can hardcode non-existant 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_AC_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
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+if test "$hardcode_action" = relink; 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
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&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"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}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"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+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*)
+ 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
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; 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
+
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); 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 shl_load
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+/* 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_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); 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 dlopen
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+/* 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_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+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"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<EOF
+#line 11299 "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
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=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;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && 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
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$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\"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<EOF
+#line 11399 "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
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=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;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && 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
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$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
+
+
+# Report which library types will actually be built
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler \
+ CC \
+ LD \
+ lt_prog_compiler_wl \
+ lt_prog_compiler_pic \
+ lt_prog_compiler_static \
+ lt_prog_compiler_no_builtin_flag \
+ export_dynamic_flag_spec \
+ thread_safe_flag_spec \
+ whole_archive_flag_spec \
+ enable_shared_with_static_runtimes \
+ old_archive_cmds \
+ old_archive_from_new_cmds \
+ predep_objects \
+ postdep_objects \
+ predeps \
+ postdeps \
+ compiler_lib_search_path \
+ archive_cmds \
+ archive_expsym_cmds \
+ postinstall_cmds \
+ postuninstall_cmds \
+ old_archive_from_expsyms_cmds \
+ allow_undefined_flag \
+ no_undefined_flag \
+ export_symbols_cmds \
+ hardcode_libdir_flag_spec \
+ hardcode_libdir_flag_spec_ld \
+ hardcode_libdir_separator \
+ hardcode_automatic \
+ module_cmds \
+ module_expsym_cmds \
+ lt_cv_prog_compiler_c_o \
+ exclude_expsyms \
+ include_expsyms; do
+
+ case $var in
+ old_archive_cmds | \
+ old_archive_from_new_cmds | \
+ archive_cmds | \
+ archive_expsym_cmds | \
+ module_cmds | \
+ module_expsym_cmds | \
+ old_archive_from_expsyms_cmds | \
+ export_symbols_cmds | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+ cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# 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.
+
+# 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//"
+
+# 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
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# 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
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# 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
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# 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 and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+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
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# 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 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
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# 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
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_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
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+ case $host_os in
+ aix3*)
+ cat <<\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
+EOF
+ ;;
+ esac
+
+ # 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)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+
+# Check whether --with-tags or --without-tags was given.
+if test "${with_tags+set}" = set; then
+ withval="$with_tags"
+ tagnames="$withval"
+fi;
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+ else
+ { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+ "") ;;
+ *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ 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=cc
+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=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# 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=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+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++"}
+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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# We don't want -fno-exception wen 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 or --without-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.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&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
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -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 "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+ld_shlibs_CXX=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ 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
+ 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].*|aix5*)
+ 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_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+
+ 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
+ hardcode_direct_CXX=yes
+ 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
+
+ # 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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 echo "${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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ 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*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ 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
+ ;;
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ whole_archive_flag_spec_CXX=''
+ link_all_deplibs_CXX=yes
+
+ if test "$GXX" = yes ; then
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ 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'
+ fi
+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "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~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ 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
+ ;;
+ freebsd[12]*)
+ # 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* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+ gnu*)
+ ;;
+ 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) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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*)
+ hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
+ ;;
+ *)
+ 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_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; echo $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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${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
+ ;;
+ interix3*)
+ 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" && echo -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 -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${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=:
+ ;;
+ linux*)
+ 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; echo $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*)
+ # 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*)
+ # Portland Group C++ compiler
+ 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'
+
+ 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; $echo \"$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=`echo $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; echo $list'
+ ;;
+ 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::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ ld_shlibs_CXX=no
+ ;;
+ openbsd*)
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ 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='echo'
+ ;;
+ osf3*)
+ 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
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ 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" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ 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.
+ #
+ # 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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ 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 "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ 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.
+ old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ 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" && echo -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'
+ 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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ 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 "\-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*)
+ # 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 C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker. We must also pass each convience library through
+ # to the system linker between allextract/defaultextract.
+ # The C++ compiler will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='echo'
+
+ # 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 -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 -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 \"\-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 \"\-L\""
+ fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+ 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.
+ # 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.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ 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='`test -z "$SCOABSPATH" && echo ${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,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $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
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p 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
+ ;;
+
+ *.$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
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix3*)
+ # 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=
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # 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.
+ postdeps_CXX='-lCstd -lCrun'
+ ;;
+ esac
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ # 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*)
+ # 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'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # 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'
+ ;;
+ 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=
+ ;;
+ interix3*)
+ # 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 IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # 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_AC_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
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_CXX='-qnocommon'
+ lt_prog_compiler_wl_CXX='-Wl,'
+ ;;
+ esac
+ ;;
+ 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* | kfreebsd*-gnu | 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*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC*)
+ # 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'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ 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*)
+ # 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
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ 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
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:13739: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:13743: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+
+if test x"$lt_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
+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
+
+#
+# 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\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_CXX=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6
+
+if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:13843: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:13847: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$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
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # 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
+ 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")) && (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*)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+#
+# 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 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:$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=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_CXX=no
+ else
+ 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*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&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-existant 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_AC_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
+echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6
+
+if test "$hardcode_action_CXX" = relink; 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
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_CXX \
+ CC_CXX \
+ LD_CXX \
+ lt_prog_compiler_wl_CXX \
+ lt_prog_compiler_pic_CXX \
+ lt_prog_compiler_static_CXX \
+ lt_prog_compiler_no_builtin_flag_CXX \
+ export_dynamic_flag_spec_CXX \
+ thread_safe_flag_spec_CXX \
+ whole_archive_flag_spec_CXX \
+ enable_shared_with_static_runtimes_CXX \
+ old_archive_cmds_CXX \
+ old_archive_from_new_cmds_CXX \
+ predep_objects_CXX \
+ postdep_objects_CXX \
+ predeps_CXX \
+ postdeps_CXX \
+ compiler_lib_search_path_CXX \
+ archive_cmds_CXX \
+ archive_expsym_cmds_CXX \
+ postinstall_cmds_CXX \
+ postuninstall_cmds_CXX \
+ old_archive_from_expsyms_cmds_CXX \
+ allow_undefined_flag_CXX \
+ no_undefined_flag_CXX \
+ export_symbols_cmds_CXX \
+ hardcode_libdir_flag_spec_CXX \
+ hardcode_libdir_flag_spec_ld_CXX \
+ hardcode_libdir_separator_CXX \
+ hardcode_automatic_CXX \
+ module_cmds_CXX \
+ module_expsym_cmds_CXX \
+ lt_cv_prog_compiler_c_o_CXX \
+ exclude_expsyms_CXX \
+ include_expsyms_CXX; do
+
+ case $var in
+ old_archive_cmds_CXX | \
+ old_archive_from_new_cmds_CXX | \
+ archive_cmds_CXX | \
+ archive_expsym_cmds_CXX | \
+ module_cmds_CXX | \
+ module_expsym_cmds_CXX | \
+ old_archive_from_expsyms_cmds_CXX | \
+ export_symbols_cmds_CXX | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# 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
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_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
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# 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 and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_CXX
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+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
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_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 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
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_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
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# 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
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+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
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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
+ ;;
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_static_F77='-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_F77='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # 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_F77='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_F77='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_F77='-fno-common'
+ ;;
+
+ interix3*)
+ # 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_F77=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_F77=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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_F77='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ else
+ lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_F77='-qnocommon'
+ lt_prog_compiler_wl_F77='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_F77='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_F77='-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_F77='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-fpic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_F77='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_F77='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_F77='-Qoption ld '
+ lt_prog_compiler_pic_F77='-PIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_F77='-Kconform_pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_F77='-pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_F77=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_F77"
+ # 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:15413: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:15417: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
+
+if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
+ case $lt_prog_compiler_pic_F77 in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+ esac
+else
+ lt_prog_compiler_pic_F77=
+ lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_F77=
+ ;;
+ *)
+ lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_F77=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_F77=yes
+ fi
+ else
+ lt_prog_compiler_static_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6
+
+if test x"$lt_prog_compiler_static_works_F77" = xyes; then
+ :
+else
+ lt_prog_compiler_static_F77=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_F77=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:15517: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:15521: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_F77=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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_F77=
+ enable_shared_with_static_runtimes_F77=no
+ archive_cmds_F77=
+ archive_expsym_cmds_F77=
+ old_archive_From_new_cmds_F77=
+ old_archive_from_expsyms_cmds_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ thread_safe_flag_spec_F77=
+ hardcode_libdir_flag_spec_F77=
+ hardcode_libdir_flag_spec_ld_F77=
+ hardcode_libdir_separator_F77=
+ hardcode_direct_F77=no
+ hardcode_minus_L_F77=no
+ hardcode_shlibpath_var_F77=unsupported
+ link_all_deplibs_F77=unknown
+ hardcode_automatic_F77=no
+ module_cmds_F77=
+ module_expsym_cmds_F77=
+ always_export_symbols_F77=no
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_F77=
+ # 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_F77="_GLOBAL_OFFSET_TABLE_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ 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_F77=yes
+ if test "$with_gnu_ld" = 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_F77='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_F77='${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_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_F77=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$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_F77='-L$libdir'
+ hardcode_minus_L_F77=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 can't use
+ # them.
+ ld_shlibs_F77=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_F77=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=no
+ enable_shared_with_static_runtimes_F77=yes
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_F77='$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_F77='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_F77=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${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_F77='$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_F77='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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;;
+ esac
+ archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $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_F77=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_F77=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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_F77" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=yes
+ archive_expsym_cmds_F77='$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_F77=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_F77=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
+ 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_F77='$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].*|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
+
+ 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_F77=''
+ hardcode_direct_F77=yes
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+
+ 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
+ hardcode_direct_F77=yes
+ else
+ # We have old collect2
+ hardcode_direct_F77=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_F77=yes
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_libdir_separator_F77=
+ 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
+
+ # 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_F77=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_F77='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${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_F77='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_F77="-z nodefs"
+ archive_expsym_cmds_F77="\$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.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${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_F77=' ${wl}-bernotok'
+ allow_undefined_flag_F77=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_F77='$convenience'
+ archive_cmds_need_lc_F77=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_F77="\$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*)
+ archive_cmds_F77='$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_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_F77=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_F77=-rdynamic
+ ;;
+
+ 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_F77=' '
+ allow_undefined_flag_F77=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_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_F77='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_F77=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_F77=no
+ hardcode_direct_F77=no
+ hardcode_automatic_F77=yes
+ hardcode_shlibpath_var_F77=unsupported
+ whole_archive_flag_spec_F77=''
+ link_all_deplibs_F77=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_F77=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_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_F77='$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_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_direct_F77=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$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_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared -fPIC ${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_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$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
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ ;;
+ *)
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ link_all_deplibs_F77=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ newsos6)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ allow_undefined_flag_F77=unsupported
+ archive_cmds_F77='$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_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_F77=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_F77='$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'
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_shlibpath_var_F77=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs_F77=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_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_F77='$CC -r -o $output$reload_objs'
+ hardcode_direct_F77=no
+ ;;
+ motorola)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ export_dynamic_flag_spec_F77='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_F77=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag_F77='${wl}-z,text'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$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_F77='${wl}-z,text'
+ allow_undefined_flag_F77='${wl}-z,nodefs'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+echo "${ECHO_T}$ld_shlibs_F77" >&6
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_F77=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_F77 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_F77
+ pic_flag=$lt_prog_compiler_pic_F77
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+ allow_undefined_flag_F77=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_F77=no
+ else
+ archive_cmds_need_lc_F77=yes
+ fi
+ allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+ test -n "$runpath_var_F77" || \
+ test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_F77" != 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_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+ test "$hardcode_minus_L_F77" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_F77=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_F77=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_F77=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+echo "${ECHO_T}$hardcode_action_F77" >&6
+
+if test "$hardcode_action_F77" = relink; 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
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_F77 \
+ CC_F77 \
+ LD_F77 \
+ lt_prog_compiler_wl_F77 \
+ lt_prog_compiler_pic_F77 \
+ lt_prog_compiler_static_F77 \
+ lt_prog_compiler_no_builtin_flag_F77 \
+ export_dynamic_flag_spec_F77 \
+ thread_safe_flag_spec_F77 \
+ whole_archive_flag_spec_F77 \
+ enable_shared_with_static_runtimes_F77 \
+ old_archive_cmds_F77 \
+ old_archive_from_new_cmds_F77 \
+ predep_objects_F77 \
+ postdep_objects_F77 \
+ predeps_F77 \
+ postdeps_F77 \
+ compiler_lib_search_path_F77 \
+ archive_cmds_F77 \
+ archive_expsym_cmds_F77 \
+ postinstall_cmds_F77 \
+ postuninstall_cmds_F77 \
+ old_archive_from_expsyms_cmds_F77 \
+ allow_undefined_flag_F77 \
+ no_undefined_flag_F77 \
+ export_symbols_cmds_F77 \
+ hardcode_libdir_flag_spec_F77 \
+ hardcode_libdir_flag_spec_ld_F77 \
+ hardcode_libdir_separator_F77 \
+ hardcode_automatic_F77 \
+ module_cmds_F77 \
+ module_expsym_cmds_F77 \
+ lt_cv_prog_compiler_c_o_F77 \
+ exclude_expsyms_F77 \
+ include_expsyms_F77; do
+
+ case $var in
+ old_archive_cmds_F77 | \
+ old_archive_from_new_cmds_F77 | \
+ archive_cmds_F77 | \
+ archive_expsym_cmds_F77 | \
+ module_cmds_F77 | \
+ module_expsym_cmds_F77 | \
+ old_archive_from_expsyms_cmds_F77 | \
+ export_symbols_cmds_F77 | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_F77
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# 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_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_F77"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+old_archive_cmds_GCJ=$old_archive_cmds
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:17720: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:17724: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_static_GCJ='-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_GCJ='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # 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_GCJ='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_GCJ='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_GCJ='-fno-common'
+ ;;
+
+ interix3*)
+ # 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_GCJ=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_GCJ=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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_GCJ='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ else
+ lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_GCJ='-qnocommon'
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_GCJ='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_GCJ='-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_GCJ='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-fpic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_GCJ='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld '
+ lt_prog_compiler_pic_GCJ='-PIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_GCJ='-Kconform_pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_GCJ='-pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_GCJ=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+ # 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:17988: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:17992: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
+ case $lt_prog_compiler_pic_GCJ in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+ esac
+else
+ lt_prog_compiler_pic_GCJ=
+ lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_GCJ=
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_GCJ=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_GCJ=yes
+ fi
+ else
+ lt_prog_compiler_static_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
+ :
+else
+ lt_prog_compiler_static_GCJ=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_GCJ=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:18092: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:18096: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_GCJ=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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_GCJ=
+ enable_shared_with_static_runtimes_GCJ=no
+ archive_cmds_GCJ=
+ archive_expsym_cmds_GCJ=
+ old_archive_From_new_cmds_GCJ=
+ old_archive_from_expsyms_cmds_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ thread_safe_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_ld_GCJ=
+ hardcode_libdir_separator_GCJ=
+ hardcode_direct_GCJ=no
+ hardcode_minus_L_GCJ=no
+ hardcode_shlibpath_var_GCJ=unsupported
+ link_all_deplibs_GCJ=unknown
+ hardcode_automatic_GCJ=no
+ module_cmds_GCJ=
+ module_expsym_cmds_GCJ=
+ always_export_symbols_GCJ=no
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_GCJ=
+ # 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_GCJ="_GLOBAL_OFFSET_TABLE_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ 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_GCJ=yes
+ if test "$with_gnu_ld" = 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_GCJ='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_GCJ='${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_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_GCJ=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$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_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=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 can't use
+ # them.
+ ld_shlibs_GCJ=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_GCJ=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=no
+ enable_shared_with_static_runtimes_GCJ=yes
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_GCJ='$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_GCJ='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_GCJ=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${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_GCJ='$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_GCJ='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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;;
+ esac
+ archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $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_GCJ=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_GCJ=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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_GCJ" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=yes
+ archive_expsym_cmds_GCJ='$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_GCJ=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_GCJ=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
+ 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_GCJ='$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].*|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
+
+ 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_GCJ=''
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+
+ 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
+ hardcode_direct_GCJ=yes
+ else
+ # We have old collect2
+ hardcode_direct_GCJ=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_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_libdir_separator_GCJ=
+ 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
+
+ # 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_GCJ=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_GCJ='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${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_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_GCJ="-z nodefs"
+ archive_expsym_cmds_GCJ="\$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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${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_GCJ=' ${wl}-bernotok'
+ allow_undefined_flag_GCJ=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_GCJ='$convenience'
+ archive_cmds_need_lc_GCJ=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_GCJ="\$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*)
+ archive_cmds_GCJ='$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_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_GCJ=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_GCJ=-rdynamic
+ ;;
+
+ 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_GCJ=' '
+ allow_undefined_flag_GCJ=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_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_GCJ='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_GCJ=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_GCJ=no
+ hardcode_direct_GCJ=no
+ hardcode_automatic_GCJ=yes
+ hardcode_shlibpath_var_GCJ=unsupported
+ whole_archive_flag_spec_GCJ=''
+ link_all_deplibs_GCJ=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_GCJ=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_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_GCJ='$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_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_direct_GCJ=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$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_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared -fPIC ${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_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$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
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+ *)
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ newsos6)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ allow_undefined_flag_GCJ=unsupported
+ archive_cmds_GCJ='$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_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_GCJ=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_GCJ='$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'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs_GCJ=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_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+ hardcode_direct_GCJ=no
+ ;;
+ motorola)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ export_dynamic_flag_spec_GCJ='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_GCJ=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag_GCJ='${wl}-z,text'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$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_GCJ='${wl}-z,text'
+ allow_undefined_flag_GCJ='${wl}-z,nodefs'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+echo "${ECHO_T}$ld_shlibs_GCJ" >&6
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_GCJ=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_GCJ 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_GCJ
+ pic_flag=$lt_prog_compiler_pic_GCJ
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+ allow_undefined_flag_GCJ=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_GCJ=no
+ else
+ archive_cmds_need_lc_GCJ=yes
+ fi
+ allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+ test -n "$runpath_var_GCJ" || \
+ test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_GCJ" != 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_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+ test "$hardcode_minus_L_GCJ" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_GCJ=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_GCJ=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_GCJ=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+echo "${ECHO_T}$hardcode_action_GCJ" >&6
+
+if test "$hardcode_action_GCJ" = relink; 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
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_GCJ \
+ CC_GCJ \
+ LD_GCJ \
+ lt_prog_compiler_wl_GCJ \
+ lt_prog_compiler_pic_GCJ \
+ lt_prog_compiler_static_GCJ \
+ lt_prog_compiler_no_builtin_flag_GCJ \
+ export_dynamic_flag_spec_GCJ \
+ thread_safe_flag_spec_GCJ \
+ whole_archive_flag_spec_GCJ \
+ enable_shared_with_static_runtimes_GCJ \
+ old_archive_cmds_GCJ \
+ old_archive_from_new_cmds_GCJ \
+ predep_objects_GCJ \
+ postdep_objects_GCJ \
+ predeps_GCJ \
+ postdeps_GCJ \
+ compiler_lib_search_path_GCJ \
+ archive_cmds_GCJ \
+ archive_expsym_cmds_GCJ \
+ postinstall_cmds_GCJ \
+ postuninstall_cmds_GCJ \
+ old_archive_from_expsyms_cmds_GCJ \
+ allow_undefined_flag_GCJ \
+ no_undefined_flag_GCJ \
+ export_symbols_cmds_GCJ \
+ hardcode_libdir_flag_spec_GCJ \
+ hardcode_libdir_flag_spec_ld_GCJ \
+ hardcode_libdir_separator_GCJ \
+ hardcode_automatic_GCJ \
+ module_cmds_GCJ \
+ module_expsym_cmds_GCJ \
+ lt_cv_prog_compiler_c_o_GCJ \
+ exclude_expsyms_GCJ \
+ include_expsyms_GCJ; do
+
+ case $var in
+ old_archive_cmds_GCJ | \
+ old_archive_from_new_cmds_GCJ | \
+ archive_cmds_GCJ | \
+ archive_expsym_cmds_GCJ | \
+ module_cmds_GCJ | \
+ module_expsym_cmds_GCJ | \
+ old_archive_from_expsyms_cmds_GCJ | \
+ export_symbols_cmds_GCJ | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_GCJ
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# 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_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_GCJ"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# 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.
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_RC \
+ CC_RC \
+ LD_RC \
+ lt_prog_compiler_wl_RC \
+ lt_prog_compiler_pic_RC \
+ lt_prog_compiler_static_RC \
+ lt_prog_compiler_no_builtin_flag_RC \
+ export_dynamic_flag_spec_RC \
+ thread_safe_flag_spec_RC \
+ whole_archive_flag_spec_RC \
+ enable_shared_with_static_runtimes_RC \
+ old_archive_cmds_RC \
+ old_archive_from_new_cmds_RC \
+ predep_objects_RC \
+ postdep_objects_RC \
+ predeps_RC \
+ postdeps_RC \
+ compiler_lib_search_path_RC \
+ archive_cmds_RC \
+ archive_expsym_cmds_RC \
+ postinstall_cmds_RC \
+ postuninstall_cmds_RC \
+ old_archive_from_expsyms_cmds_RC \
+ allow_undefined_flag_RC \
+ no_undefined_flag_RC \
+ export_symbols_cmds_RC \
+ hardcode_libdir_flag_spec_RC \
+ hardcode_libdir_flag_spec_ld_RC \
+ hardcode_libdir_separator_RC \
+ hardcode_automatic_RC \
+ module_cmds_RC \
+ module_expsym_cmds_RC \
+ lt_cv_prog_compiler_c_o_RC \
+ exclude_expsyms_RC \
+ include_expsyms_RC; do
+
+ case $var in
+ old_archive_cmds_RC | \
+ old_archive_from_new_cmds_RC | \
+ archive_cmds_RC | \
+ archive_expsym_cmds_RC | \
+ module_cmds_RC | \
+ module_expsym_cmds_RC | \
+ old_archive_from_expsyms_cmds_RC | \
+ export_symbols_cmds_RC | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# 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_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_RC"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+ ;;
+
+ *)
+ { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+ CFLAGS="$CFLAGS -W -Wall"
+fi
+if test x"$GXX" = xyes
+then
+ CXXFLAGS="$CXXFLAGS -W -Wall"
+fi
+
+# System-dependent adjustments.
+no_undefined=no
+
+case "${host_os}" in
+cygwin)
+ no_undefined=yes
+ ;;
+*)
+ ;;
+esac
+
+
+if test x$no_undefined = xyes; then
+ NO_UNDEFINED_TRUE=
+ NO_UNDEFINED_FALSE='#'
+else
+ NO_UNDEFINED_TRUE='#'
+ NO_UNDEFINED_FALSE=
+fi
+
+
+
+
+ ac_config_files="$ac_config_files Makefile src/Makefile utils/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, don't put newlines in cache variables' values.
+# 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.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *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 \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ 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}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ 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[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $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}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# 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+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; 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
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ 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
+
+ ;;
+ 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
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # 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 sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by the Parma Watchdog Library $as_me 0.4, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -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
+ --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 <bug-autoconf at gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+the Parma Watchdog Library config.status 0.4
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+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=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ 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
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
+ "utils/Makefile" ) CONFIG_FILES="$CONFIG_FILES utils/Makefile" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ 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 to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s, at SHELL@,$SHELL,;t t
+s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s, at exec_prefix@,$exec_prefix,;t t
+s, at prefix@,$prefix,;t t
+s, at program_transform_name@,$program_transform_name,;t t
+s, at bindir@,$bindir,;t t
+s, at sbindir@,$sbindir,;t t
+s, at libexecdir@,$libexecdir,;t t
+s, at datadir@,$datadir,;t t
+s, at sysconfdir@,$sysconfdir,;t t
+s, at sharedstatedir@,$sharedstatedir,;t t
+s, at localstatedir@,$localstatedir,;t t
+s, at libdir@,$libdir,;t t
+s, at includedir@,$includedir,;t t
+s, at oldincludedir@,$oldincludedir,;t t
+s, at infodir@,$infodir,;t t
+s, at mandir@,$mandir,;t t
+s, at build_alias@,$build_alias,;t t
+s, at host_alias@,$host_alias,;t t
+s, at target_alias@,$target_alias,;t t
+s, at DEFS@,$DEFS,;t t
+s, at ECHO_C@,$ECHO_C,;t t
+s, at ECHO_N@,$ECHO_N,;t t
+s, at ECHO_T@,$ECHO_T,;t t
+s, at LIBS@,$LIBS,;t t
+s, at INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s, at INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s, at INSTALL_DATA@,$INSTALL_DATA,;t t
+s, at CYGPATH_W@,$CYGPATH_W,;t t
+s, at PACKAGE@,$PACKAGE,;t t
+s, at VERSION@,$VERSION,;t t
+s, at ACLOCAL@,$ACLOCAL,;t t
+s, at AUTOCONF@,$AUTOCONF,;t t
+s, at AUTOMAKE@,$AUTOMAKE,;t t
+s, at AUTOHEADER@,$AUTOHEADER,;t t
+s, at MAKEINFO@,$MAKEINFO,;t t
+s, at install_sh@,$install_sh,;t t
+s, at STRIP@,$STRIP,;t t
+s, at ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s, at INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s, at mkdir_p@,$mkdir_p,;t t
+s, at AWK@,$AWK,;t t
+s, at SET_MAKE@,$SET_MAKE,;t t
+s, at am__leading_dot@,$am__leading_dot,;t t
+s, at AMTAR@,$AMTAR,;t t
+s, at am__tar@,$am__tar,;t t
+s, at am__untar@,$am__untar,;t t
+s, at CC@,$CC,;t t
+s, at CFLAGS@,$CFLAGS,;t t
+s, at LDFLAGS@,$LDFLAGS,;t t
+s, at CPPFLAGS@,$CPPFLAGS,;t t
+s, at ac_ct_CC@,$ac_ct_CC,;t t
+s, at EXEEXT@,$EXEEXT,;t t
+s, at OBJEXT@,$OBJEXT,;t t
+s, at DEPDIR@,$DEPDIR,;t t
+s, at am__include@,$am__include,;t t
+s, at am__quote@,$am__quote,;t t
+s, at AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s, at AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s, at AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s, at CCDEPMODE@,$CCDEPMODE,;t t
+s, at am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s, at am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s, at CXX@,$CXX,;t t
+s, at CXXFLAGS@,$CXXFLAGS,;t t
+s, at ac_ct_CXX@,$ac_ct_CXX,;t t
+s, at CXXDEPMODE@,$CXXDEPMODE,;t t
+s, at am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s, at am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s, at CXXCPP@,$CXXCPP,;t t
+s, at PERL@,$PERL,;t t
+s, at HAVE_PERL_TRUE@,$HAVE_PERL_TRUE,;t t
+s, at HAVE_PERL_FALSE@,$HAVE_PERL_FALSE,;t t
+s, at BUILD_WATCHDOG_LIBRARY_TRUE@,$BUILD_WATCHDOG_LIBRARY_TRUE,;t t
+s, at BUILD_WATCHDOG_LIBRARY_FALSE@,$BUILD_WATCHDOG_LIBRARY_FALSE,;t t
+s, at EGREP@,$EGREP,;t t
+s, at build@,$build,;t t
+s, at build_cpu@,$build_cpu,;t t
+s, at build_vendor@,$build_vendor,;t t
+s, at build_os@,$build_os,;t t
+s, at host@,$host,;t t
+s, at host_cpu@,$host_cpu,;t t
+s, at host_vendor@,$host_vendor,;t t
+s, at host_os@,$host_os,;t t
+s, at LN_S@,$LN_S,;t t
+s, at ECHO@,$ECHO,;t t
+s, at AR@,$AR,;t t
+s, at ac_ct_AR@,$ac_ct_AR,;t t
+s, at RANLIB@,$RANLIB,;t t
+s, at ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s, at DLLTOOL@,$DLLTOOL,;t t
+s, at ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t
+s, at AS@,$AS,;t t
+s, at ac_ct_AS@,$ac_ct_AS,;t t
+s, at OBJDUMP@,$OBJDUMP,;t t
+s, at ac_ct_OBJDUMP@,$ac_ct_OBJDUMP,;t t
+s, at CPP@,$CPP,;t t
+s, at F77@,$F77,;t t
+s, at FFLAGS@,$FFLAGS,;t t
+s, at ac_ct_F77@,$ac_ct_F77,;t t
+s, at LIBTOOL@,$LIBTOOL,;t t
+s, at NO_UNDEFINED_TRUE@,$NO_UNDEFINED_TRUE,;t t
+s, at NO_UNDEFINED_FALSE@,$NO_UNDEFINED_FALSE,;t t
+s, at debug_flag@,$debug_flag,;t t
+s, at LIBOBJS@,$LIBOBJS,;t t
+s, at LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # 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. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s, at configure_input@,$configure_input,;t t
+s, at srcdir@,$ac_srcdir,;t t
+s, at abs_srcdir@,$ac_abs_srcdir,;t t
+s, at top_srcdir@,$ac_top_srcdir,;t t
+s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s, at builddir@,$ac_builddir,;t t
+s, at abs_builddir@,$ac_abs_builddir,;t t
+s, at top_builddir@,$ac_top_builddir,;t t
+s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
+s, at INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #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.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # 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. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+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"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# 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 || { (exit 1); exit 1; }
+fi
+
diff --git a/Watchdog/configure.ac b/Watchdog/configure.ac
new file mode 100644
index 0000000..12ff75a
--- /dev/null
+++ b/Watchdog/configure.ac
@@ -0,0 +1,299 @@
+# Autoconf source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can 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.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+# 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 Watchdog Library],[0.4],[bagnara at cs.unipr.it],[watchdog])
+
+# Minimum autoconf version required.
+AC_PREREQ(2.59)
+
+# Make sure the sources are there.
+AC_CONFIG_SRCDIR(src/Watchdog.cc)
+
+# Use Automake.
+AM_INIT_AUTOMAKE([foreign dist-bzip2 dist-zip 1.7.3])
+AC_SUBST(VERSION)
+
+# Generate a configuration header file.
+AC_CONFIG_HEADER([config.h])
+
+# C compiler
+
+AC_ARG_WITH(cc,
+[ --with-cc=xxx use XXX as the C compiler],
+CC=$with_cc)
+
+AC_LANG(C)
+
+# Checks for typedefs, structures, and compiler characteristics.
+AC_C_CONST
+
+# C++ compiler
+
+AC_ARG_WITH(cxx,
+[ --with-cxx=xxx use XXX as the C++ compiler],
+CXX=$with_cxx)
+
+AC_LANG(C++)
+
+# Checks for programs.
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+# Check for Perl.
+AC_PATH_PROG([PERL], perl, no)
+AC_SUBST([PERL])
+AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno)
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+AC_MSG_CHECKING([whether to compile with debug info])
+AC_ARG_ENABLE(debugging,
+[ --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
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for profiling])
+AC_ARG_ENABLE(profiling,
+[ --enable-profiling compile for profiling])
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=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,
+[ --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"
+ ;;
+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,
+[ --enable-assertions check run-time assertions])
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ AC_DEFINE(NDEBUG, 1, [Assertions are disabled when this is defined])
+ debug_flag="-DNDEBUG=1"
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} --enable-assertions, needs yes or no])
+ ;;
+esac
+
+arch=no
+enableval=standard
+AC_MSG_CHECKING([whether to enable optimizations])
+AC_ARG_ENABLE(optimization,
+[ --enable-optimization 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,
+[ --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
+
+CFLAGS="$COMP_FLAGS $OPT_FLAGS"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+# Allow additions to C and C++ compilation flags
+
+AC_ARG_WITH(cflags,
+[ --with-cflags=xxx add XXX to the options for the C compiler],
+CFLAGS="$CFLAGS $with_cflags")
+
+AC_ARG_WITH(cxxflags,
+[ --with-cxxflags=xxx add XXX to the options for the C++ compiler],
+CXXFLAGS="$CXXFLAGS $with_cxxflags")
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the Parma Watchdog Library])
+AC_ARG_ENABLE(watchdog,
+[ --enable-watchdog build also the Parma Watchdog Library])
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} --enable-watchdog, needs yes or no])
+ ;;
+esac
+build_watchdog_library=$enableval
+AM_CONDITIONAL(BUILD_WATCHDOG_LIBRARY, test x"$build_watchdog_library" = xyes)
+
+if test x"$build_watchdog_library" = xyes
+then
+ # Checks for header files.
+ AC_HEADER_TIME
+ AC_CHECK_HEADERS([sys/time.h])
+
+ # Checks for library fuctions.
+ # The following invocations of AC_LANG_PUSH(C) and AC_LANG_POP(C)
+ # are to work around a bug in AC_CHECK_FUNCS. For more information,
+ # http://www.cs.unipr.it/pipermail/ppl-devel/2002-November/002929.html
+ AC_LANG_PUSH(C)
+ AC_CHECK_FUNCS([setitimer],
+ [],
+ AC_MSG_ERROR([CANNOT BUILD THE WATCHDOG LIBRARY
+*** THE SYSTEM DOES NOT PROVIDE THE SETITIMER FUNCTION.]))
+ AC_LANG_POP(C)
+fi
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+AC_LIBTOOL_DLOPEN
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+ CFLAGS="$CFLAGS -W -Wall"
+fi
+if test x"$GXX" = xyes
+then
+ CXXFLAGS="$CXXFLAGS -W -Wall"
+fi
+
+# System-dependent adjustments.
+no_undefined=no
+
+case "${host_os}" in
+cygwin)
+ no_undefined=yes
+ ;;
+*)
+ ;;
+esac
+AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes)
+
+AC_SUBST(debug_flag)
+
+AC_CONFIG_FILES(Makefile
+ src/Makefile
+ utils/Makefile)
+AC_OUTPUT
diff --git a/Watchdog/depcomp b/Watchdog/depcomp
new file mode 100755
index 0000000..011ebd9
--- /dev/null
+++ b/Watchdog/depcomp
@@ -0,0 +1,530 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-07-09.11
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 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, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# 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 outputing 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
+
+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"
+
+# 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
+
+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.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## 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).
+## - 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 -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## 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.
+ tr ' ' '
+' < "$tmpdepfile" |
+## 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.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then :
+ else
+ 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 ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+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.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ 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"
+ ;;
+
+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.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mecanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in 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.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#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 $1 != '--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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ 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.
+ -*|$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"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--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, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+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-end: "$"
+# End:
diff --git a/Watchdog/install-sh b/Watchdog/install-sh
new file mode 100755
index 0000000..0ae12c0
--- /dev/null
+++ b/Watchdog/install-sh
@@ -0,0 +1,401 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-11-07.23
+
+# 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. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+posix_glob=
+posix_mkdir=
+
+# Symbolic mode for testing mkdir with directories.
+# It is the same as 755, but also tests that "u+" works.
+test_mode=u=rwx,g=rx,o=rx,u+wx
+
+# Desired mode of installed file.
+mode=0755
+
+# Desired mode of newly created intermediate directories.
+# It is empty if not known yet.
+intermediate_mode=
+
+chmodcmd=$chmodprog
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+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:
+-c (ignored)
+-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.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; 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
+
+test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15
+
+for src
+do
+ # Protect names starting with `-'.
+ 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 "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # 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: $dstarg: 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
+ '')
+ posix_mkdir=false
+ if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then
+ posix_mkdir=true
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null
+ fi ;;
+ esac
+
+ if
+ $posix_mkdir && {
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, create it using the same intermediate mode that
+ # mkdir -p would use when creating intermediate directories.
+ # POSIX says that this mode is "$(umask -S),u+wx", so use that
+ # if umask -S works.
+
+ if test -n "$dir_arg"; then
+ mkdir_mode=$mode
+ else
+ case $intermediate_mode in
+ '')
+ if umask_S=`(umask -S) 2>/dev/null`; then
+ intermediate_mode=$umask_S,u+wx
+ else
+ intermediate_mode=$test_mode
+ fi ;;
+ esac
+ mkdir_mode=$intermediate_mode
+ fi
+
+ $mkdirprog -m "$mkdir_mode" -p -- "$dstdir"
+ }
+ then :
+ else
+
+ # 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
+ /*) pathcomp=/ ;;
+ -*) pathcomp=./ ;;
+ *) pathcomp= ;;
+ esac
+
+ case $posix_glob in
+ '')
+ if (set -f) 2>/dev/null; then
+ posix_glob=true
+ else
+ posix_glob=false
+ fi ;;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob && set -f
+ set fnord $dstdir
+ shift
+ $posix_glob && set +f
+ IFS=$oIFS
+
+ for d
+ do
+ test "x$d" = x && continue
+
+ pathcomp=$pathcomp$d
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # Don't fail if two instances are running concurrently.
+ test -d "$pathcomp" || exit 1
+ fi
+ pathcomp=$pathcomp/
+ done
+ obsolete_mkdir_used=true
+ 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.
+ $doit $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"; } &&
+
+ # Now 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.
+ {
+ if test -f "$dst"; then
+ $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
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ } || 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-end: "$"
+# End:
diff --git a/Watchdog/ltmain.sh b/Watchdog/ltmain.sh
new file mode 100644
index 0000000..06823e0
--- /dev/null
+++ b/Watchdog/ltmain.sh
@@ -0,0 +1,6863 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# 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.
+
+basename="s,^.*/,,g"
+
+# 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"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.22
+TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+
+# 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
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell, and then maybe $echo will work.
+ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# 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'
+# 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
+ SP2NL='tr \040 \012'
+ NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ SP2NL='tr \100 \n'
+ NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+ save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+ save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" $lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ $echo "$modename: not configured to build any kind of library" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# 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 "$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" || {
+ $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+ exit $EXIT_FAILURE
+ }
+ fi
+
+ $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# 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.
+func_win32_libid ()
+{
+ 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
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+ win32_nmres=`eval $NM -f posix -A $1 | \
+ $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_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 ()
+{
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+ # 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.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case "$@ " in
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+ # 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
+ $echo "$modename: unable to infer tagged configuration"
+ $echo "$modename: specify a tag with \`--tag'" 1>&2
+ exit $EXIT_FAILURE
+# else
+# $echo "$modename: using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+ f_ex_an_ar_dir="$1"; shift
+ f_ex_an_ar_oldlib="$1"
+
+ $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+ $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+ exit $EXIT_FAILURE
+ fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+ my_gentop="$1"; shift
+ my_oldlibs=${1+"$@"}
+ my_oldobjs=""
+ my_xlib=""
+ my_xabs=""
+ my_xdir=""
+ my_status=""
+
+ $show "${rm}r $my_gentop"
+ $run ${rm}r "$my_gentop"
+ $show "$mkdir $my_gentop"
+ $run $mkdir "$my_gentop"
+ my_status=$?
+ if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+ exit $my_status
+ fi
+
+ 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
+ my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+ my_xdir="$my_gentop/$my_xlib"
+
+ $show "${rm}r $my_xdir"
+ $run ${rm}r "$my_xdir"
+ $show "$mkdir $my_xdir"
+ $run $mkdir "$my_xdir"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+ exit $exit_status
+ fi
+ case $host in
+ *-darwin*)
+ $show "Extracting $my_xabs"
+ # Do not bother doing anything if just a dry run
+ if test -z "$run"; then
+ darwin_orig_dir=`pwd`
+ cd $my_xdir || exit $?
+ darwin_archive=$my_xabs
+ darwin_curdir=`pwd`
+ darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+ darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+ if test -n "$darwin_arches"; then
+ darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+ darwin_arch=
+ $show "$darwin_base_archive has multiple architectures $darwin_arches"
+ for darwin_arch in $darwin_arches ; do
+ 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 have a bunch of thin objects, gotta fatten them up :)
+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+ darwin_file=
+ darwin_files=
+ for darwin_file in $darwin_filelist; do
+ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+ lipo -create -output "$darwin_file" $darwin_files
+ done # $darwin_filelist
+ ${rm}r unfat-$$
+ cd "$darwin_orig_dir"
+ else
+ cd "$darwin_orig_dir"
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ fi # $darwin_arches
+ fi # $run
+ ;;
+ *)
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ ;;
+ esac
+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+ arg="$1"
+ shift
+
+ case $arg in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ execute_dlfiles)
+ execute_dlfiles="$execute_dlfiles $arg"
+ ;;
+ tag)
+ tagname="$arg"
+ preserve_args="${preserve_args}=$arg"
+
+ # Check whether tagname contains only valid characters
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ $echo "$progname: invalid tag name: $tagname" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $tagname in
+ CC)
+ # Don't test for the "default" C tag, as we know, it's there, but
+ # not specially marked.
+ ;;
+ *)
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+ taglist="$taglist $tagname"
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+ else
+ $echo "$progname: ignoring unknown tag $tagname" 1>&2
+ fi
+ ;;
+ esac
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case $arg in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+ $echo
+ $echo "Copyright (C) 2005 Free Software Foundation, Inc."
+ $echo "This is free software; see the source for copying conditions. There is NO"
+ $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ exit $?
+ ;;
+
+ --config)
+ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+ done
+ exit $?
+ ;;
+
+ --debug)
+ $echo "$progname: enabling shell trace mode"
+ set -x
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --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 $?
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --preserve-dup-deps) duplicate_deps="yes" ;;
+
+ --quiet | --silent)
+ show=:
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --tag)
+ prevopt="--tag"
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+ --tag=*)
+ set tag "$optarg" ${1+"$@"}
+ shift
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no)
+ ;;
+shared)
+ build_libtool_libs=no
+ build_old_libs=yes
+ ;;
+static)
+ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+ ;;
+esac
+
+# 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=
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+ $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+ case $nonopt in
+ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+ mode=link
+ for arg
+ do
+ case $arg in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx | *strace | *truss)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case $mode in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # 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=
+
+ 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)
+ if test -n "$libobj" ; then
+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ arg_mode=target
+ continue
+ ;;
+
+ -static | -prefer-pic | -prefer-non-pic)
+ later="$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,*)
+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ lastarg="$lastarg $arg"
+ done
+ IFS="$save_ifs"
+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+ # Add the arguments to base_compile.
+ base_compile="$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.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ case $lastarg in
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, and some SunOS ksh mistreat backslash-escaping
+ # in scan sets (worked around with variable expansion),
+ # and furthermore cannot handle '|' '&' '(' ')' in scan sets
+ # at all, so we specify them separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ base_compile="$base_compile $lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ $echo "$modename: you must specify an argument for -Xcompile"
+ exit $EXIT_FAILURE
+ ;;
+ target)
+ $echo "$modename: you must specify a target with \`-o'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *)
+ # Get the name of the library object.
+ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ xform='[cCFSifmso]'
+ case $libobj in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.ii) xform=ii ;;
+ *.class) xform=class ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.f90) xform=f90 ;;
+ *.for) xform=for ;;
+ *.java) xform=java ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case $libobj in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -static)
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+ case $qlibobj in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qlibobj="\"$qlibobj\"" ;;
+ esac
+ test "X$libobj" != "X$qlibobj" \
+ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \
+ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir=
+ else
+ xdir=$xdir/
+ fi
+ lobj=${xdir}$objdir/$objname
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # 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
+
+ $run $rm $removelist
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ 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 "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ removelist="$removelist $output_obj $lockfile"
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+ 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 $run ln "$progpath" "$lockfile" 2>/dev/null; do
+ $show "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."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+ $echo "$srcfile" > "$lockfile"
+ fi
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+ qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+ case $qsrcfile in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qsrcfile="\"$qsrcfile\"" ;;
+ esac
+
+ $run $rm "$libobj" "${libobj}T"
+
+ # Create a libtool object file (analogous to a ".la" file),
+ # but don't create it if we're doing a dry run.
+ test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+ # 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
+
+ if test ! -d "${xdir}$objdir"; then
+ $show "$mkdir ${xdir}$objdir"
+ $run $mkdir ${xdir}$objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ command="$command -o $lobj"
+ fi
+
+ $run $rm "$lobj" "$output_obj"
+
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ test -n "$output_obj" && $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ 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."
+
+ $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
+ $show "$mv $output_obj $lobj"
+ if $run $mv $output_obj $lobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the PIC object to the libtool object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+ # Allow error messages only from the first compilation.
+ if test "$suppress_opt" = yes; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ else
+ # No PIC object so indicate it doesn't exist in the libtool
+ # object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+ 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"
+ else
+ command="$base_compile $qsrcfile $pic_flag"
+ fi
+ if test "$compiler_c_o" = yes; then
+ command="$command -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$command$suppress_output"
+ $run $rm "$obj" "$output_obj"
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ 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."
+
+ $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
+ $show "$mv $output_obj $obj"
+ if $run $mv $output_obj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+ else
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+ fi
+
+ $run $mv "${libobj}T" "${libobj}"
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool link mode
+ link | relink)
+ modename="$modename: link"
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # 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=
+
+ avoid_version=no
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ non_pic_objects=
+ notinst_path= # paths that contain not-installed libtool libraries
+ 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
+
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -all-static | -static)
+ if test "X$arg" = "X-all-static"; then
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ else
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=built
+ fi
+ 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
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+ ;;
+ *) qarg=$arg ;;
+ esac
+ libtool_args="$libtool_args $qarg"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$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
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$dlprefiles $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir="$arg"
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat $save_arg`
+ do
+# moreargs="$moreargs $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ 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
+ dlfiles="$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.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$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
+ non_pic_objects="$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"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ done
+ else
+ $echo "$modename: link input file \`$save_arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $wl$qarg"
+ prev=
+ compile_command="$compile_command $wl$qarg"
+ finalize_command="$finalize_command $wl$qarg"
+ continue
+ ;;
+ xcclinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ darwin_framework|darwin_framework_skip)
+ test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ prev=
+ 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
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ 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
+ $echo "$modename: more than one -exported-symbols argument is not allowed"
+ exit $EXIT_FAILURE
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -framework|-arch|-isysroot)
+ case " $CC " in
+ *" ${arg} ${1} "* | *" ${arg} ${1} "*)
+ prev=darwin_framework_skip ;;
+ *) compiler_flags="$compiler_flags $arg"
+ prev=darwin_framework ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ 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*)
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ notinst_path="$notinst_path $dir"
+ fi
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$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*)
+ # 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
+ deplibs="$deplibs -framework System"
+ 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
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ # Tru64 UNIX uses -model [arg] to determine the layout of C++
+ # classes, name mangling, and exception handling.
+ -model)
+ compile_command="$compile_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ finalize_command="$finalize_command $arg"
+ prev=xcompiler
+ continue
+ ;;
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+ # -r[0-9][0-9]* specifies the processor on the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+ # +DA*, +DD* enable 64-bit mode on the HP compiler
+ # -q* pass through compiler args for the IBM compiler
+ # -m* pass through architecture-specific compiler args for GCC
+ # -m*, -t[45]*, -txscale* pass through architecture-specific
+ # compiler args for GCC
+ # -pg pass through profiling flag for GCC
+ # @file GCC response files
+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
+ -t[45]*|-txscale*|@*)
+
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # in order for the loader to find any dlls it needs.
+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+ 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*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ continue
+ ;;
+
+ -static)
+ # 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
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Wl,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $wl$flag"
+ linker_flags="$linker_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.$objext)
+ # A standard object.
+ objs="$objs $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ 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
+ dlfiles="$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.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$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
+ non_pic_objects="$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"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ 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.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done # argument parsing loop
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\"
+
+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$output_objdir" = "X$output"; then
+ output_objdir="$objdir"
+ else
+ output_objdir="$output_objdir/$objdir"
+ fi
+ # Create the object directory.
+ if test ! -d "$output_objdir"; then
+ $show "$mkdir $output_objdir"
+ $run $mkdir $output_objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ # Determine the type of output
+ case $output in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ case $host in
+ *cygwin* | *mingw* | *pw32*)
+ # don't eliminate duplications in $postdeps and $predeps
+ duplicate_compiler_generated_deps=yes
+ ;;
+ *)
+ duplicate_compiler_generated_deps=$duplicate_deps
+ ;;
+ 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 test "X$duplicate_deps" = "Xyes" ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ libs="$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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$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
+ case $linkmode in
+ lib)
+ passes="conv link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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
+ 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 "$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)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ compiler_flags="$compiler_flags $deplib"
+ fi
+ continue
+ ;;
+ -l*)
+ if test "$linkmode" != lib && test "$linkmode" != prog; then
+ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+ continue
+ fi
+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+ for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; 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 (${SED} -e '2q' $lib |
+ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ library_names=
+ old_library=
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ 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
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+ 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
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ 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
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ *)
+ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ valid_a_lib=no
+ case $deplibs_check_method in
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ 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 used here."
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the"
+ $echo "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ 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.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$newdlfiles $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ # 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
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$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
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ $echo "$modename: \`$lib' is not a convenience library" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ 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.
+ dlprefiles="$dlprefiles $lib $dependency_libs"
+ else
+ newdlfiles="$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
+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ $echo "$modename: warning: library \`$lib' was moved." 1>&2
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$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
+ notinst_path="$notinst_path $abs_ladir"
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ fi
+ fi # $installed = yes
+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$newdlprefiles $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ 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
+ newlib_search_path="$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*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+ 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 test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$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 -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
+ *" $dir "*) ;;
+ *" $absdir "*) ;;
+ *) temp_rpath="$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 "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$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
+ if test "$installed" = no; then
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=yes
+ fi
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on
+ # some systems (darwin)
+ if 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 "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ realname="$2"
+ shift; 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*)
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ $show "extracting exported symbol list from \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$extract_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ $show "generating import library for \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$old_archive_from_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ 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 "$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 module then we can not link against
+ # it, someone is ignoring the new warnings I added
+ if /usr/bin/file -L $add 2> /dev/null |
+ $EGREP ": [^:]* bundle" >/dev/null ; 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
+ 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; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$dir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ add_dir="$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
+ $echo "$modename: configuration error: unsupported hardcode properties"
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) compile_shlibpath="$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:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; 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:"*) ;;
+ *) finalize_shlibpath="$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
+ [\\/]*)
+ add_dir="$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*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$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"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$deplib" && dir="."
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if grep "^installed=no" $deplib > /dev/null; then
+ path="$absdir/$objdir"
+ else
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$absdir" != "$libdir"; then
+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+ fi
+ path="$absdir"
+ fi
+ depdepl=
+ case $host in
+ *-*-darwin*)
+ # we do not want to link against static libs,
+ # but need to link against shared
+ 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 "$path/$depdepl" ; then
+ depdepl="$path/$depdepl"
+ fi
+ # do not add paths which are already there
+ case " $newlib_search_path " in
+ *" $path "*) ;;
+ *) newlib_search_path="$newlib_search_path $path";;
+ esac
+ fi
+ path=""
+ ;;
+ *)
+ path="-L$path"
+ ;;
+ esac
+ ;;
+ -l*)
+ case $host in
+ *-*-darwin*)
+ # Again, we only want to link against shared libraries
+ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+ for tmp in $newlib_search_path ; do
+ if test -f "$tmp/lib$tmp_libs.dylib" ; then
+ eval depdepl="$tmp/lib$tmp_libs.dylib"
+ break
+ fi
+ done
+ path=""
+ ;;
+ *) continue ;;
+ esac
+ ;;
+ *) continue ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$path $deplibs" ;;
+ esac
+ case " $deplibs " in
+ *" $depdepl "*) ;;
+ *) deplibs="$depdepl $deplibs" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ 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 "*) ;;
+ *) lib_search_path="$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 "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$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
+ tmp_libs="$tmp_libs $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+ fi
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ objs="$objs$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ if test "$module" = no; then
+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+ exit $EXIT_FAILURE
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the non-libtool"
+ $echo "*** objects $objs is not portable!"
+ libobjs="$libobjs $objs"
+ fi
+ fi
+
+ if test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+ fi
+
+ set dummy $rpath
+ if test "$#" -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ 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
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+ fi
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ IFS="$save_ifs"
+
+ if test -n "$8"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # 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="$2"
+ number_minor="$3"
+ number_revision="$4"
+ #
+ # 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
+ darwin|linux|osf|windows)
+ current=`expr $number_major + $number_minor`
+ age="$number_minor"
+ revision="$number_revision"
+ ;;
+ freebsd-aout|freebsd-elf|sunos)
+ current="$number_major"
+ revision="$number_minor"
+ age="0"
+ ;;
+ irix|nonstopux)
+ current=`expr $number_major + $number_minor - 1`
+ age="$number_minor"
+ revision="$number_minor"
+ ;;
+ esac
+ ;;
+ no)
+ current="$2"
+ revision="$3"
+ age="$4"
+ ;;
+ 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]) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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]) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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]) ;;
+ *)
+ $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ 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
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ minor_current=`expr $current + 1`
+ verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current";
+ ;;
+
+ irix | nonstopux)
+ major=`expr $current - $age + 1`
+
+ 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
+ iface=`expr $revision - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring_prefix$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux)
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ major=.`expr $current - $age`
+ 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
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+ fi
+
+ if test "$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)
+ ;;
+ $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
+ removelist="$removelist $p"
+ ;;
+ *) ;;
+ esac
+ done
+ if test -n "$removelist"; then
+ $show "${rm}r $removelist"
+ $run ${rm}r $removelist
+ fi
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ for path in $notinst_path; do
+ lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+ deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+ dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$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 "*) ;;
+ *) dlfiles="$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 "*) ;;
+ *) dlprefiles="$dlprefiles $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$deplibs -framework System"
+ ;;
+ *-*-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
+ deplibs="$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.
+ $rm conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $rm conftest
+ $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" -ne "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$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
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$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
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ 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
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ $rm conftest
+ $LTCC $LTCFLAGS -o conftest conftest.c $i
+ # Did it work?
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$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
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$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
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method
+ file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$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
+ # 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 "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$file_magic_regex" > /dev/null; then
+ newdeplibs="$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
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test -n "$name" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$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
+ newdeplibs="$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
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+ -e '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 "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+ done
+ fi
+ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \
+ | grep . >/dev/null; then
+ $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
+ fi
+ ;;
+ 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 is the System framework
+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ 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
+
+
+ # 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 "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$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
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$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
+ 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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$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"
+ if test -n "$hardcode_libdir_flag_spec_ld"; then
+ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+ else
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$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 "$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
+ realname="$2"
+ shift; 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
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ if len=`expr "X$cmd" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ $show "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"; then
+ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+ $run eval '$mv "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ tmp_deplibs="$tmp_deplibs $test_deplib"
+ ;;
+ esac
+ done
+ deplibs="$tmp_deplibs"
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ libobjs="$libobjs $func_extract_archives_result"
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$mode" = relink; then
+ $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:" &&
+ len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise.
+ $echo "creating reloadable object files..."
+
+ # 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
+ output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ delfiles=
+ last_robj=
+ k=1
+ output=$output_objdir/$output_la-${k}.$objext
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+ if test "X$objlist" = X ||
+ { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len"; }; then
+ objlist="$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.
+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+ fi
+ last_robj=$output_objdir/$output_la-${k}.$objext
+ k=`expr $k + 1`
+ output=$output_objdir/$output_la-${k}.$objext
+ objlist=$obj
+ len=1
+ 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~
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+ if ${skipped_export-false}; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+ fi
+
+ # Set up a command to remove the reloadable object files
+ # after they are used.
+ i=0
+ while test "$i" -lt "$k"
+ do
+ i=`expr $i + 1`
+ delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+ done
+
+ $echo "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"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ 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\"
+ 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
+
+ # Append the command to remove the reloadable object files
+ # to the just-reset $cmds.
+ eval cmds=\"\$cmds~\$rm $delfiles\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(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 "$mode" = relink; then
+ $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
+ $show "${rm}r $gentop"
+ $run ${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
+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run 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 "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+ fi
+
+ case $output in
+ *.lo)
+ if test -n "$objs$old_deplibs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $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
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${obj}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ reload_conv_objs="$reload_objs $func_extract_archives_result"
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${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"
+ # $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"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+ esac
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+ fi
+
+ if test "$preload" = yes; then
+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+ test "$dlopen_self_static" = unknown; then
+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+ fi
+ fi
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ case $host in
+ *darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ if test "$tagname" = CXX ; then
+ compile_command="$compile_command ${wl}-bind_at_load"
+ finalize_command="$finalize_command ${wl}-bind_at_load"
+ fi
+ ;;
+ 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 "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $compile_deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ done
+ compile_deplibs="$new_libs"
+
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$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 "*) ;;
+ *) finalize_rpath="$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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$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 "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ fi
+
+ dlsyms=
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${outputname}S.c"
+ else
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+ fi
+ fi
+
+ if test -n "$dlsyms"; then
+ case $dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${outputname}.nm"
+
+ $show "$rm $nlist ${nlist}S ${nlist}T"
+ $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+ # Parse the name list into a source file.
+ $show "creating $output_objdir/$dlsyms"
+
+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ $show "generating symbol list for \`$output'"
+
+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for arg in $progfiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$outputname.exp"
+ $run $rm $export_symbols
+ $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ else
+ $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+ $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+ $run eval 'mv "$nlist"T "$nlist"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+ $run eval '$echo ": $name " >> "$nlist"'
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # 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/$dlsyms"'
+ else
+ $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+ case $host in
+ *cygwin* | *mingw* )
+ $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+ runtime relocations are performed -- see ld's documentation
+ on pseudo-relocs */
+struct {
+"
+ ;;
+ * )
+ $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+ ;;
+ esac
+
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ fi
+
+ pic_flag_for_symtable=
+ 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*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag";;
+ esac
+ esac
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+ # Clean up the generated files.
+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+ # Transform the symbol file into the correct name.
+ case $host in
+ *cygwin* | *mingw* )
+ if test -f "$output_objdir/${outputname}.def" ; then
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+ else
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ fi
+ ;;
+ * )
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ ;;
+ esac
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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 "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$link_command"
+ $run eval "$link_command"
+ exit_status=$?
+
+ # Delete the generated files.
+ if test -n "$dlsyms"; then
+ $show "$rm $output_objdir/${outputname}S.${objext}"
+ $run $rm "$output_objdir/${outputname}S.${objext}"
+ fi
+
+ exit $exit_status
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ 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
+ rpath="$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
+ rpath="$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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $run $rm $output
+ # Link the executable and exit
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+ 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"
+
+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+ $echo "$modename: \`$output' will be relinked during installation" 1>&2
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e '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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "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}\" || 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
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Quote $echo for shipping.
+ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+ case $progpath in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+ esac
+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ output_name=`basename $output`
+ output_path=`dirname $output`
+ 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
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ 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.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#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
+# 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 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS. */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ DEBUG("(main) argv[0] : %s\n",argv[0]);
+ DEBUG("(main) program_name : %s\n",program_name);
+ newargz = XMALLOC(char *, argc+2);
+EOF
+
+ cat >> $cwrappersource <<EOF
+ newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+ newargz[1] = find_executable(argv[0]);
+ if (newargz[1] == NULL)
+ lt_fatal("Couldn't find %s", argv[0]);
+ DEBUG("(main) found exe at : %s\n",newargz[1]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+
+ for (i=0; i<argc+1; i++)
+ {
+ DEBUG("(main) newargz[%d] : %s\n",i,newargz[i]);
+ ;
+ }
+
+EOF
+
+ case $host_os in
+ mingw*)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",(char const **)newargz);
+EOF
+ ;;
+ *)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",newargz);
+EOF
+ ;;
+ esac
+
+ cat >> $cwrappersource <<"EOF"
+ return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("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;
+
+ DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+ if ((!path) || (!*path))
+ return 0;
+
+ if ((stat (path, &st) >= 0) &&
+ (
+ /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+ ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+ ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+ ((st.st_mode & S_IXUSR) == S_IXUSR))
+ )
+ return 1;
+ else
+ return 0;
+}
+
+/* Searches for the full path of the wrapper. Returns
+ newly allocated full path name if found, NULL otherwise */
+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;
+
+ DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+ 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 ("getcwd failed");
+ 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 ("getcwd failed");
+ 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 *
+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;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+ ;;
+ esac
+ $rm $output
+ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+ $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# 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.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# 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 variable:
+ 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
+ echo=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$echo works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$echo will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ $echo >> $output "\
+ 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 >> $output "\
+
+ # 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 $EXIT_FAILURE
+ fi
+ fi
+
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $rm \"\$progdir/\$program\";
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $rm \"\$progdir/\$file\"
+ fi"
+ else
+ $echo >> $output "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $echo >> $output "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $echo >> $output "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $echo >> $output "\
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $echo >> $output "\
+ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+ exit $EXIT_FAILURE
+ 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 $EXIT_FAILURE
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ 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"
+ 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"
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $addlibs
+ oldobjs="$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
+ # 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
+ $echo "X$obj" | $Xsed -e 's%^.*/%%'
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "copying selected object files to avoid basename conflicts..."
+
+ if test -z "$gentop"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+ exit $exit_status
+ fi
+ fi
+
+ save_oldobjs=$oldobjs
+ oldobjs=
+ counter=1
+ for obj in $save_oldobjs
+ do
+ objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ case " $oldobjs " in
+ " ") oldobjs=$obj ;;
+ *[\ /]"$objbase "*)
+ while :; do
+ # Make sure we don't pick an alternate name that also
+ # overlaps.
+ newobj=lt$counter-$objbase
+ counter=`expr $counter + 1`
+ case " $oldobjs " in
+ *[\ /]"$newobj "*) ;;
+ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+ esac
+ done
+ $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+ $run ln "$obj" "$gentop/$newobj" ||
+ $run cp "$obj" "$gentop/$newobj"
+ oldobjs="$oldobjs $gentop/$newobj"
+ ;;
+ *) oldobjs="$oldobjs $obj" ;;
+ esac
+ done
+ fi
+
+ eval cmds=\"$old_archive_cmds\"
+
+ if len=`expr "X$cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ $echo "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_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
+ for obj in $save_oldobjs
+ do
+ oldobjs="$objlist $obj"
+ objlist="$objlist $obj"
+ eval test_cmds=\"$old_archive_cmds\"
+ if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$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=
+ 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
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ eval cmd=\"$cmd\"
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$generated"; then
+ $show "${rm}r$generated"
+ $run ${rm}r$generated
+ fi
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ $show "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}\" || 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
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ if test "$hardcode_automatic" = yes ; then
+ relink_command=
+ fi
+
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ 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)
+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$newdependency_libs $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+ for lib in $dlfiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlfiles="$newdlfiles $libdir/$name"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlprefiles="$newdlprefiles $libdir/$name"
+ done
+ dlprefiles="$newdlprefiles"
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlfiles="$newdlfiles $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlprefiles="$newdlprefiles $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $rm $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ esac
+ $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# 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'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_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
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # 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.
+ $echo "X$nonopt" | grep shtool > /dev/null; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg=$nonopt
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest=$arg
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f)
+ case " $install_prog " in
+ *[\\\ /]cp\ *) ;;
+ *) prev=$arg ;;
+ esac
+ ;;
+ -g | -m | -o) prev=$arg ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*)
+ ;;
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest=$arg
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test "$#" -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ library_names=
+ old_library=
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+ test "X$dir" = "X$file/" && dir=
+ dir="$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 "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.
+ if test "$inst_prefix_dir" = "$destdir"; then
+ $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ 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
+
+ $echo "$modename: warning: relinking \`$file'" 1>&2
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$srcname $destdir/$realname"
+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$striplib $destdir/$realname"
+ $run 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
+ if test "$linkname" != "$realname"; then
+ $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ fi
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ cmds=$postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ instname="$dir/$name"i
+ $show "$install_prog $instname $destdir/$name"
+ $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$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
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run 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
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ 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
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ stripped_ext=".exe"
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin*|*mingw*)
+ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+ notinst_deplibs=
+ relink_command=
+
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo 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.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$notinst_deplibs"; then
+ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo 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.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ if test "$finalize" = yes && test -z "$run"; then
+ tmpdir=`func_mktempdir`
+ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ ${rm}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ $echo "$modename: warning: cannot relink \`$file'" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file$stripped_ext" | $Xsed -e "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)
+ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+ ;;
+ esac
+ ;;
+ esac
+ $show "$install_prog$stripme $file $destfile"
+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+ test -n "$outputname" && ${rm}r "$tmpdir"
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ $show "$old_striplib $oldlib"
+ $run eval "$old_striplib $oldlib" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ cmds=$old_postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ cmds=$finish_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || admincmds="$admincmds
+ $cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ test "$show" = : && exit $EXIT_SUCCESS
+
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ $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"
+ $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit $EXIT_FAILURE
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test ! -f "$file"; then
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ dir=
+ case $file in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ 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
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ if test "${save_LC_ALL+set}" = set; then
+ LC_ALL="$save_LC_ALL"; export LC_ALL
+ fi
+ if test "${save_LANG+set}" = set; then
+ LANG="$save_LANG"; export LANG
+ fi
+
+ # 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
+ ;;
+
+ # libtool clean and uninstall mode
+ clean | uninstall)
+ modename="$modename: $mode"
+ 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) rm="$rm $arg"; rmforce=yes ;;
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ rmdirs=
+
+ origobjdir="$objdir"
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$file"; then
+ dir=.
+ objdir="$origobjdir"
+ else
+ objdir="$dir/$origobjdir"
+ fi
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ 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 (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+ case "$mode" in
+ clean)
+ case " $library_names " in
+ # " " in the beginning catches empty $dlname
+ *" $dlname "*) ;;
+ *) rmfiles="$rmfiles $objdir/$dlname" ;;
+ esac
+ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+ ;;
+ uninstall)
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ cmds=$postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ cmds=$old_postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ ;;
+ esac
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+ # Read the .lo file
+ . $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" \
+ && test "$pic_object" != none; then
+ rmfiles="$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
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ noexename=`$echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$noexename
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles || exit_status=1
+ done
+ objdir="$origobjdir"
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ $show "rmdir $dir"
+ $run rmdir $dir >/dev/null 2>&1
+ fi
+ done
+
+ exit $exit_status
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test -z "$exec_cmd"; then
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+ eval exec $exec_cmd
+ exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [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
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ --version print version information
+
+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. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool at gnu.org>."
+ exit $EXIT_SUCCESS
+ ;;
+
+clean)
+ $echo \
+"Usage: $modename [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: $modename [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
+ -prefer-pic try to building PIC objects only
+ -prefer-non-pic try to building non-PIC objects only
+ -static always build a \`.o' file suitable for static linking
+
+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: $modename [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: $modename [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: $modename [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 rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [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
+ -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
+ -static do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+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: $modename [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."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# 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
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/Watchdog/missing b/Watchdog/missing
new file mode 100755
index 0000000..d84fac8
--- /dev/null
+++ b/Watchdog/missing
@@ -0,0 +1,359 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2005-06-08.21
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally 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, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# 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
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+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
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/Watchdog/mkinstalldirs b/Watchdog/mkinstalldirs
new file mode 100755
index 0000000..259dbfc
--- /dev/null
+++ b/Watchdog/mkinstalldirs
@@ -0,0 +1,158 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2005-06-29.22
+
+# 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>.
+
+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-end: "$"
+# End:
diff --git a/Watchdog/src/Doubly_Linked_Object.defs.hh b/Watchdog/src/Doubly_Linked_Object.defs.hh
new file mode 100644
index 0000000..bac30b5
--- /dev/null
+++ b/Watchdog/src/Doubly_Linked_Object.defs.hh
@@ -0,0 +1,64 @@
+/* Doubly_Linked_Object class declaration.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Doubly_Linked_Object_defs_hh
+#define PWL_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_Watchdog_Library::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(PWL_Doubly_Linked_Object_defs_hh)
diff --git a/Watchdog/src/Doubly_Linked_Object.inlines.hh b/Watchdog/src/Doubly_Linked_Object.inlines.hh
new file mode 100644
index 0000000..8b7d52e
--- /dev/null
+++ b/Watchdog/src/Doubly_Linked_Object.inlines.hh
@@ -0,0 +1,69 @@
+/* Doubly_Linked_Object class implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Doubly_Linked_Object_inlines_hh
+#define PWL_Doubly_Linked_Object_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_inlines_hh)
diff --git a/Watchdog/src/Doubly_Linked_Object.types.hh b/Watchdog/src/Doubly_Linked_Object.types.hh
new file mode 100644
index 0000000..a3466b0
--- /dev/null
+++ b/Watchdog/src/Doubly_Linked_Object.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_Doubly_Linked_Object_types_hh
+#define PWL_Doubly_Linked_Object_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Doubly_Linked_Object;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_types_hh)
diff --git a/Watchdog/src/EList.defs.hh b/Watchdog/src/EList.defs.hh
new file mode 100644
index 0000000..1572e28
--- /dev/null
+++ b/Watchdog/src/EList.defs.hh
@@ -0,0 +1,87 @@
+/* EList class declaration.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_defs_hh
+#define PWL_EList_defs_hh 1
+
+#include "EList.types.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_Watchdog_Library::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 jyst 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(PWL_EList_defs_hh)
diff --git a/Watchdog/src/EList.inlines.hh b/Watchdog/src/EList.inlines.hh
new file mode 100644
index 0000000..828fa55
--- /dev/null
+++ b/Watchdog/src/EList.inlines.hh
@@ -0,0 +1,112 @@
+/* EList class implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_inlines_hh
+#define PWL_EList_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_inlines_hh)
diff --git a/Watchdog/src/EList.types.hh b/Watchdog/src/EList.types.hh
new file mode 100644
index 0000000..84d7300
--- /dev/null
+++ b/Watchdog/src/EList.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_EList_types_hh
+#define PWL_EList_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_types_hh)
diff --git a/Watchdog/src/EList_Iterator.defs.hh b/Watchdog/src/EList_Iterator.defs.hh
new file mode 100644
index 0000000..fd7123f
--- /dev/null
+++ b/Watchdog/src/EList_Iterator.defs.hh
@@ -0,0 +1,83 @@
+/* EList_Iterator class declaration.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_Iterator_defs_hh
+#define PWL_EList_Iterator_defs_hh 1
+
+#include "EList_Iterator.types.hh"
+#include "Doubly_Linked_Object.types.hh"
+
+namespace Parma_Watchdog_Library {
+
+//! 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 Parma_Watchdog_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Watchdog_Library::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(PWL_EList_Iterator_defs_hh)
diff --git a/Watchdog/src/EList_Iterator.inlines.hh b/Watchdog/src/EList_Iterator.inlines.hh
new file mode 100644
index 0000000..1998f11
--- /dev/null
+++ b/Watchdog/src/EList_Iterator.inlines.hh
@@ -0,0 +1,104 @@
+/* EList_Iterator class implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_EList_Iterator_inlines_hh
+#define PWL_EList_Iterator_inlines_hh 1
+
+#include "Doubly_Linked_Object.defs.hh"
+
+namespace Parma_Watchdog_Library {
+
+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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_inlines_hh)
diff --git a/Watchdog/src/EList_Iterator.types.hh b/Watchdog/src/EList_Iterator.types.hh
new file mode 100644
index 0000000..f3e3d91
--- /dev/null
+++ b/Watchdog/src/EList_Iterator.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_EList_Iterator_types_hh
+#define PWL_EList_Iterator_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_types_hh)
diff --git a/Watchdog/src/Handler.defs.hh b/Watchdog/src/Handler.defs.hh
new file mode 100644
index 0000000..fdbc555
--- /dev/null
+++ b/Watchdog/src/Handler.defs.hh
@@ -0,0 +1,90 @@
+/* Handler and derived classes' declaration.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Handler_defs_hh
+#define PWL_Handler_defs_hh 1
+
+#include "Handler.types.hh"
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Watchdog_Library::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 templatic class Handler_Flag<Flag_Base, Flag> 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_Watchdog_Library::Handler_Flag : virtual public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+ //! Does its job: installs the flag onto the holder, if a flag with
+ //! an higher priority has not already been installed.
+ 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_Watchdog_Library::Handler_Function : virtual public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Function(void (*function)());
+
+ //! Does its job: calls the embedded function.
+ void act() const;
+
+private:
+ //! Pointer to the embedded function.
+ void (*f)();
+};
+
+#include "Handler.inlines.hh"
+
+#endif // !defined(PWL_Handler_defs_hh)
diff --git a/Watchdog/src/Handler.inlines.hh b/Watchdog/src/Handler.inlines.hh
new file mode 100644
index 0000000..8ef1325
--- /dev/null
+++ b/Watchdog/src/Handler.inlines.hh
@@ -0,0 +1,57 @@
+/* Handler and derived classes' implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Handler_inlines_hh
+#define PWL_Handler_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+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 (*function)())
+ : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+ (*f)();
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_inlines_hh)
diff --git a/Watchdog/src/Handler.types.hh b/Watchdog/src/Handler.types.hh
new file mode 100644
index 0000000..fd81d28
--- /dev/null
+++ b/Watchdog/src/Handler.types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_Handler_types_hh
+#define PWL_Handler_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_types_hh)
diff --git a/Watchdog/src/Makefile.am b/Watchdog/src/Makefile.am
new file mode 100644
index 0000000..9982382
--- /dev/null
+++ b/Watchdog/src/Makefile.am
@@ -0,0 +1,143 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can 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.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+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 \
+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 \
+Watchdog.defs.hh \
+Watchdog.inlines.hh
+
+SOURCE_FILES = \
+$(INCLUDE_FILES) \
+Pending_Element.cc \
+Pending_List.cc \
+Time.cc \
+Watchdog.cc
+
+EXTRA_DIST = \
+$(SOURCE_FILES) \
+pwl_header.hh
+
+if BUILD_WATCHDOG_LIBRARY
+
+# Libtool -version-info for libpwl.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.
+#
+# PWL release (with PPL release) -version-info
+# 0.1 0.4 0:0:0
+# 0.2 0.5 1:0:0
+# 0.3 0.6 2:0:0
+# 0.4 0.7 3:0:0
+
+LIBPWL_LT_CURRENT = 3
+LIBPWL_LT_REVISION = 0
+LIBPWL_LT_AGE = 0
+
+lib_LTLIBRARIES = libpwl.la
+libpwl_la_SOURCES = $(SOURCE_FILES)
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+libpwl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPWL_LT_CURRENT):$(LIBPWL_LT_REVISION):$(LIBPWL_LT_AGE)
+
+include_HEADERS = pwl.hh
+
+nodist_noinst_HEADERS = pwl_include_files.hh
+
+pwl_include_files.hh: $(INCLUDE_FILES) Makefile
+ rm -f $@
+ for file in $(INCLUDE_FILES); \
+ do \
+ printf "#include \"%s\"\n" $$file >>$@; \
+ done
+
+if HAVE_PERL
+
+pwl.hh: $(top_builddir)/config.h pwl_header.hh pwl_include_files.hh Makefile $(top_builddir)/utils/build_header
+ $(top_builddir)/utils/build_header \
+ -I $(top_builddir) -I $(top_builddir)/src \
+ $(top_srcdir)/src/pwl_header.hh >$@
+
+else !HAVE_PERL
+
+pwl.hh: pwl.hh.dist
+ cp -f $< $@
+
+endif !HAVE_PERL
+
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS)
+
+# pwl.hh is not distributed.
+# pwl.hh.dist, which is distributed, is a copy of pwl.hh.
+dist-hook:
+ mv -f $(distdir)/pwl.hh $(distdir)/pwl.hh.dist
+
+MOSTLYCLEANFILES = $(BUILT_SOURCES)
+
+endif BUILD_WATCHDOG_LIBRARY
diff --git a/Watchdog/src/Makefile.in b/Watchdog/src/Makefile.in
new file mode 100644
index 0000000..304b698
--- /dev/null
+++ b/Watchdog/src/Makefile.in
@@ -0,0 +1,644 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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 Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can 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.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = src
+DIST_COMMON = $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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 =
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libpwl_la_LIBADD =
+am__libpwl_la_SOURCES_DIST = 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 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 Watchdog.defs.hh \
+ Watchdog.inlines.hh Pending_Element.cc Pending_List.cc Time.cc \
+ Watchdog.cc
+am__objects_1 =
+am__objects_2 = $(am__objects_1) Pending_Element.lo Pending_List.lo \
+ Time.lo Watchdog.lo
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_libpwl_la_OBJECTS = $(am__objects_2)
+libpwl_la_OBJECTS = $(am_libpwl_la_OBJECTS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_libpwl_la_rpath = -rpath $(libdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libpwl_la_SOURCES)
+DIST_SOURCES = $(am__libpwl_la_SOURCES_DIST)
+am__include_HEADERS_DIST = pwl.hh
+includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+datadir = @datadir@
+debug_flag = @debug_flag@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+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 \
+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 \
+Watchdog.defs.hh \
+Watchdog.inlines.hh
+
+SOURCE_FILES = \
+$(INCLUDE_FILES) \
+Pending_Element.cc \
+Pending_List.cc \
+Time.cc \
+Watchdog.cc
+
+EXTRA_DIST = \
+$(SOURCE_FILES) \
+pwl_header.hh
+
+
+# Libtool -version-info for libpwl.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.
+#
+# PWL release (with PPL release) -version-info
+# 0.1 0.4 0:0:0
+# 0.2 0.5 1:0:0
+# 0.3 0.6 2:0:0
+# 0.4 0.7 3:0:0
+ at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_CURRENT = 3
+ at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_REVISION = 0
+ at BUILD_WATCHDOG_LIBRARY_TRUE@LIBPWL_LT_AGE = 0
+ at BUILD_WATCHDOG_LIBRARY_TRUE@lib_LTLIBRARIES = libpwl.la
+ at BUILD_WATCHDOG_LIBRARY_TRUE@libpwl_la_SOURCES = $(SOURCE_FILES)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at BUILD_WATCHDOG_LIBRARY_TRUE@libpwl_la_LDFLAGS = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(NO_UNDEFINED_FLAG) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@-version-info $(LIBPWL_LT_CURRENT):$(LIBPWL_LT_REVISION):$(LIBPWL_LT_AGE)
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@include_HEADERS = pwl.hh
+ at BUILD_WATCHDOG_LIBRARY_TRUE@nodist_noinst_HEADERS = pwl_include_files.hh
+ at BUILD_WATCHDOG_LIBRARY_TRUE@BUILT_SOURCES = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(include_HEADERS) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@$(nodist_noinst_HEADERS)
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@MOSTLYCLEANFILES = $(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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+ 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
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libpwl.la: $(libpwl_la_OBJECTS) $(libpwl_la_DEPENDENCIES)
+ $(CXXLINK) $(am_libpwl_la_rpath) $(libpwl_la_LDFLAGS) $(libpwl_la_OBJECTS) $(libpwl_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Pending_Element.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Pending_List.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)/Watchdog.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-includeHEADERS: $(include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+uninstall-includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+distclean-tags:
+ -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+ at BUILD_WATCHDOG_LIBRARY_FALSE@dist-hook:
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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-includeHEADERS uninstall-info-am \
+ uninstall-libLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool ctags 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-exec \
+ install-exec-am install-includeHEADERS install-info \
+ install-info-am install-libLTLIBRARIES install-man \
+ 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 uninstall uninstall-am \
+ uninstall-includeHEADERS uninstall-info-am \
+ uninstall-libLTLIBRARIES
+
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@pwl_include_files.hh: $(INCLUDE_FILES) Makefile
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ rm -f $@
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ for file in $(INCLUDE_FILES); \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ do \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ printf "#include \"%s\"\n" $$file >>$@; \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ done
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE at pwl.hh: $(top_builddir)/config.h pwl_header.hh pwl_include_files.hh Makefile $(top_builddir)/utils/build_header
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@ $(top_builddir)/utils/build_header \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@ -I $(top_builddir) -I $(top_builddir)/src \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_TRUE@ $(top_srcdir)/src/pwl_header.hh >$@
+
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_FALSE at pwl.hh: pwl.hh.dist
+ at BUILD_WATCHDOG_LIBRARY_TRUE@@HAVE_PERL_FALSE@ cp -f $< $@
+
+# pwl.hh is not distributed.
+# pwl.hh.dist, which is distributed, is a copy of pwl.hh.
+ at BUILD_WATCHDOG_LIBRARY_TRUE@dist-hook:
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ mv -f $(distdir)/pwl.hh $(distdir)/pwl.hh.dist
+# 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/Watchdog/src/Pending_Element.cc b/Watchdog/src/Pending_Element.cc
new file mode 100644
index 0000000..ea026e3
--- /dev/null
+++ b/Watchdog/src/Pending_Element.cc
@@ -0,0 +1,32 @@
+/* Pending_Element class implementation (non-inline functions).
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Pending_Element.defs.hh"
+
+namespace PWL = Parma_Watchdog_Library;
+
+bool
+PWL::Pending_Element::OK() const {
+ return d.OK();
+}
diff --git a/Watchdog/src/Pending_Element.defs.hh b/Watchdog/src/Pending_Element.defs.hh
new file mode 100644
index 0000000..76b1df5
--- /dev/null
+++ b/Watchdog/src/Pending_Element.defs.hh
@@ -0,0 +1,75 @@
+/* Pending_Element class declaration.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_Element_defs_hh
+#define PWL_Pending_Element_defs_hh 1
+
+#include "Pending_Element.types.hh"
+#include "Doubly_Linked_Object.defs.hh"
+#include "Time.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.
+*/
+class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object {
+public:
+ //! Constructs an element with the given attributes.
+ Pending_Element(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Modifies \p *this so that it has the given attributes.
+ void assign(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Returns the deadline of the event.
+ const Time& 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.
+ Time 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(PWL_Pending_Element_defs_hh)
diff --git a/Watchdog/src/Pending_Element.inlines.hh b/Watchdog/src/Pending_Element.inlines.hh
new file mode 100644
index 0000000..42a1744
--- /dev/null
+++ b/Watchdog/src/Pending_Element.inlines.hh
@@ -0,0 +1,63 @@
+/* Pending_Element class implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_Element_inlines_hh
+#define PWL_Pending_Element_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_Element::Pending_Element(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag)
+ : d(deadline), p_h(&handler), p_f(&expired_flag) {
+ assert(OK());
+}
+
+inline void
+Pending_Element::assign(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag) {
+ d = deadline;
+ p_h = &handler;
+ p_f = &expired_flag;
+ assert(OK());
+}
+
+inline const Time&
+Pending_Element::deadline() const {
+ return d;
+}
+
+inline const Handler&
+Pending_Element::handler() const {
+ return *p_h;
+}
+
+inline bool&
+Pending_Element::expired_flag() const {
+ return *p_f;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_inlines_hh)
diff --git a/Watchdog/src/Pending_Element.types.hh b/Watchdog/src/Pending_Element.types.hh
new file mode 100644
index 0000000..7f8cb62
--- /dev/null
+++ b/Watchdog/src/Pending_Element.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_Pending_Element_types_hh
+#define PWL_Pending_Element_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_Element;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_types_hh)
diff --git a/Watchdog/src/Pending_List.cc b/Watchdog/src/Pending_List.cc
new file mode 100644
index 0000000..5ce8a38
--- /dev/null
+++ b/Watchdog/src/Pending_List.cc
@@ -0,0 +1,75 @@
+/* Pending_List class implementation (non-inline functions).
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Pending_List.defs.hh"
+#include <iostream>
+
+namespace PWL = Parma_Watchdog_Library;
+
+PWL::Pending_List::Iterator
+PWL::Pending_List::insert(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag) {
+ Iterator position = active_list.begin();
+ for (Iterator active_list_end = active_list.end();
+ position != active_list_end && position->deadline() < deadline;
+ ++position)
+ ;
+ Iterator ppe;
+ // Only allocate a new element if the free list is empty.
+ if (free_list.empty())
+ ppe = new Pending_Element(deadline, handler, expired_flag);
+ else {
+ ppe = free_list.begin();
+ free_list.erase(ppe);
+ ppe->assign(deadline, handler, expired_flag);
+ }
+ Iterator r = active_list.insert(position, *ppe);
+ assert(OK());
+ return r;
+}
+
+bool
+PWL::Pending_List::OK() const {
+ if (!active_list.OK())
+ return false;
+
+ if (!free_list.OK())
+ return false;
+
+ Time t(0);
+ for (EList<Pending_Element>::Const_Iterator i = active_list.begin(),
+ active_list_end = active_list.end(); i != active_list_end; ++i) {
+ const Time& d = i->deadline();
+ if (t > d) {
+#ifndef NDEBUG
+ std::cerr << "The active list is not sorted!"
+ << std::endl;
+#endif
+ return false;
+ }
+ t = d;
+ }
+ return true;
+}
diff --git a/Watchdog/src/Pending_List.defs.hh b/Watchdog/src/Pending_List.defs.hh
new file mode 100644
index 0000000..366dcb7
--- /dev/null
+++ b/Watchdog/src/Pending_List.defs.hh
@@ -0,0 +1,74 @@
+/* Pending_List class declaration.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_List_defs_hh
+#define PWL_Pending_List_defs_hh 1
+
+#include "Pending_List.types.hh"
+#include "Pending_Element.defs.hh"
+#include "EList.defs.hh"
+#include "Time.types.hh"
+#include "Handler.types.hh"
+
+//! An ordered list for recording pending watchdog events.
+class Parma_Watchdog_Library::Pending_List {
+public:
+ //! A non-const iterator to traverse the list.
+ typedef EList<Pending_Element>::Iterator Iterator;
+
+ //! Constructs an empty list.
+ Pending_List();
+
+ //! Destructor.
+ ~Pending_List();
+
+ //! Inserts a new Pending_Element object with the given attributes.
+ Iterator insert(const Time& 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> active_list;
+ EList<Pending_Element> free_list;
+};
+
+#include "Pending_List.inlines.hh"
+
+#endif // !defined(PWL_Pending_List_defs_hh)
diff --git a/Watchdog/src/Pending_List.inlines.hh b/Watchdog/src/Pending_List.inlines.hh
new file mode 100644
index 0000000..1486419
--- /dev/null
+++ b/Watchdog/src/Pending_List.inlines.hh
@@ -0,0 +1,65 @@
+/* Pending_List class implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Pending_List_inlines_hh
+#define PWL_Pending_List_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_List::Pending_List()
+ : active_list(),
+ free_list() {
+ assert(OK());
+}
+
+inline
+Pending_List::~Pending_List() {
+}
+
+inline Pending_List::Iterator
+Pending_List::begin() {
+ return active_list.begin();
+}
+
+inline Pending_List::Iterator
+Pending_List::end() {
+ return active_list.end();
+}
+
+inline bool
+Pending_List::empty() const {
+ return active_list.empty();
+}
+
+inline Pending_List::Iterator
+Pending_List::erase(Iterator position) {
+ assert(!empty());
+ Iterator next = active_list.erase(position);
+ free_list.push_back(*position);
+ assert(OK());
+ return next;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_inlines_hh)
diff --git a/Watchdog/src/Pending_List.types.hh b/Watchdog/src/Pending_List.types.hh
new file mode 100644
index 0000000..f784288
--- /dev/null
+++ b/Watchdog/src/Pending_List.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_Pending_List_types_hh
+#define PWL_Pending_List_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_List;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_types_hh)
diff --git a/Watchdog/src/Time.cc b/Watchdog/src/Time.cc
new file mode 100644
index 0000000..88fa378
--- /dev/null
+++ b/Watchdog/src/Time.cc
@@ -0,0 +1,32 @@
+/* Time class implementation (non-inline functions).
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Time.defs.hh"
+
+namespace PWL = Parma_Watchdog_Library;
+
+bool
+PWL::Time::OK() const {
+ return microsecs < 1000000;
+}
diff --git a/Watchdog/src/Time.defs.hh b/Watchdog/src/Time.defs.hh
new file mode 100644
index 0000000..ae27c8d
--- /dev/null
+++ b/Watchdog/src/Time.defs.hh
@@ -0,0 +1,111 @@
+/* Time class declaration.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Time_defs_hh
+#define PWL_Time_defs_hh 1
+
+#include "Time.types.hh"
+
+namespace Parma_Watchdog_Library {
+
+//! 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 Parma_Watchdog_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Watchdog_Library::Time {
+public:
+ //! Zero seconds.
+ Time();
+
+ //! Constructor taking a number of hundredths of a second.
+ explicit Time(unsigned long hundredths_of_a_second);
+
+ //! Constructor with seconds and microseconds.
+ Time(unsigned long s, unsigned long m);
+
+ /*! \brief
+ Returns the number of whole seconds contained in the represented
+ time interval.
+ */
+ unsigned 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.
+ */
+ unsigned 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 seconds.
+ unsigned long secs;
+
+ //! Number of microseconds.
+ unsigned long microsecs;
+};
+
+#include "Time.inlines.hh"
+
+#endif // !defined(PWL_Time_defs_hh)
diff --git a/Watchdog/src/Time.inlines.hh b/Watchdog/src/Time.inlines.hh
new file mode 100644
index 0000000..8971c0f
--- /dev/null
+++ b/Watchdog/src/Time.inlines.hh
@@ -0,0 +1,144 @@
+/* Time class implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Time_inlines_hh
+#define PWL_Time_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Watchdog_Library {
+
+inline
+Time::Time()
+ : secs(0), microsecs(0) {
+ assert(OK());
+}
+
+inline
+Time::Time(unsigned long hundredths_of_a_second)
+ : secs(hundredths_of_a_second / 100),
+ microsecs((hundredths_of_a_second % 100) * 10000) {
+ assert(OK());
+}
+
+inline
+Time::Time(unsigned long s, unsigned long m)
+ : secs(s),
+ microsecs(m) {
+ if (microsecs >= 1000000) {
+ secs += microsecs / 1000000;
+ microsecs %= 1000000;
+ }
+ assert(OK());
+}
+
+inline unsigned long
+Time::seconds() const {
+ return secs;
+}
+
+inline unsigned long
+Time::microseconds() const {
+ return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+ unsigned long r_secs = secs + y.secs;
+ unsigned long r_microsecs = microsecs + y.microsecs;
+ if (r_microsecs >= 1000000) {
+ ++r_secs;
+ r_microsecs %= 1000000;
+ }
+ 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 += 1000000;
+ }
+ if (r_secs < 0)
+ r_secs = 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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_inlines_hh)
diff --git a/Watchdog/src/Time.types.hh b/Watchdog/src/Time.types.hh
new file mode 100644
index 0000000..90698d1
--- /dev/null
+++ b/Watchdog/src/Time.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_Time_types_hh
+#define PWL_Time_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Time;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_types_hh)
diff --git a/Watchdog/src/Watchdog.cc b/Watchdog/src/Watchdog.cc
new file mode 100644
index 0000000..49cbadd
--- /dev/null
+++ b/Watchdog/src/Watchdog.cc
@@ -0,0 +1,252 @@
+/* Watchdog and associated classes' implementation (non-inline functions).
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#include <config.h>
+
+#include "Watchdog.defs.hh"
+
+#include <csignal>
+#include <iostream>
+#include <stdexcept>
+#include <cerrno>
+#include <string>
+#include <string.h>
+
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <ctime>
+#else
+# ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <ctime>
+# endif
+#endif
+
+// Cygwin only supports ITIMER_REAL.
+// Profiling does not work on programs that uses the ITIMER_PROF timer.
+#if defined(__CYGWIN__) || defined(PROFILING)
+#define THE_TIMER ITIMER_REAL
+#define THE_SIGNAL SIGALRM
+#else
+#define THE_TIMER ITIMER_PROF
+#define THE_SIGNAL SIGPROF
+#endif
+
+namespace PWL = Parma_Watchdog_Library;
+
+using std::cerr;
+using std::endl;
+
+// Pass this to getitimer.
+itimerval PWL::Watchdog::current_timer_status;
+
+// Pass this to setitimer.
+itimerval PWL::Watchdog::signal_once;
+
+// Last time value we set the timer to.
+PWL::Time PWL::Watchdog::last_time_requested;
+
+// Records the time elapsed since last fresh start.
+PWL::Time PWL::Watchdog::time_so_far;
+
+// The ordered queue of pending watchdog events.
+PWL::Pending_List PWL::Watchdog::pending;
+
+// Whether the alarm clock is running.
+volatile bool PWL::Watchdog::alarm_clock_running = false;
+
+// Whether we are changing data which are also changed by the signal handler.
+volatile bool PWL::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* ovalue) {
+ if (setitimer(which, value, ovalue) != 0)
+ throw_syscall_error("setitimer");
+}
+
+void
+my_sigaction(int signum,
+ const struct sigaction* act, struct sigaction* oldact) {
+ if (sigaction(signum, act, oldact) != 0)
+ throw_syscall_error("sigaction");
+}
+
+} // namespace
+
+void
+PWL::Watchdog::get_timer(Time& time) {
+ my_getitimer(THE_TIMER, ¤t_timer_status);
+ time = Time(current_timer_status.it_value.tv_sec,
+ current_timer_status.it_value.tv_usec);
+}
+
+void
+PWL::Watchdog::set_timer(const Time& time) {
+ if (time.seconds() == 0 && time.microseconds() == 0)
+ throw std::runtime_error("PWL 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
+PWL::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
+PWL::Watchdog::handle_timeout(int) {
+ if (in_critical_section)
+ reschedule();
+ else {
+ time_so_far += last_time_requested;
+ if (!pending.empty()) {
+ 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
+PWL::PWL_handle_timeout(int signum) {
+ PWL::Watchdog::handle_timeout(signum);
+}
+
+PWL::Pending_List::Iterator
+PWL::Watchdog::new_watchdog_event(int units,
+ const Handler& handler,
+ bool& expired_flag) {
+ assert(units > 0);
+ Pending_List::Iterator position;
+ Time deadline(units);
+ 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
+PWL::Watchdog::remove_watchdog_event(Pending_List::Iterator position) {
+ assert(!pending.empty());
+ if (position == pending.begin()) {
+ Pending_List::Iterator next = position;
+ ++next;
+ if (next != pending.end()) {
+ 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);
+}
+
+PWL::Watchdog::~Watchdog() {
+ if (!expired) {
+ in_critical_section = true;
+ remove_watchdog_event(pending_position);
+ in_critical_section = false;
+ }
+ delete &handler;
+}
+
+void
+PWL::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 = PWL_handle_timeout;
+ s.sa_mask = mask;
+ s.sa_flags = 0; // Was SA_ONESHOT: why?
+
+ my_sigaction(THE_SIGNAL, &s, 0);
+}
+
+void
+PWL::Watchdog::finalize() {
+}
+
+PWL::Time PWL::Watchdog::reschedule_time(1);
+
+unsigned int PWL::Init::count = 0;
diff --git a/Watchdog/src/Watchdog.defs.hh b/Watchdog/src/Watchdog.defs.hh
new file mode 100644
index 0000000..d8b3464
--- /dev/null
+++ b/Watchdog/src/Watchdog.defs.hh
@@ -0,0 +1,139 @@
+/* Watchdog and associated classes' declaration and inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see
+http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Watchdog_defs_hh
+#define PWL_Watchdog_defs_hh 1
+
+#include "Watchdog.types.hh"
+#include "Time.defs.hh"
+#include "Handler.types.hh"
+#include "Pending_List.defs.hh"
+#include <cassert>
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Watchdog_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PWL_handle_timeout(int signum);
+
+//! A watchdog timer.
+class Watchdog {
+public:
+ template <typename Flag_Base, typename Flag>
+ Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag);
+
+ Watchdog(int units, void (*function)());
+ ~Watchdog();
+
+
+private:
+ friend class Init;
+ static void initialize();
+ static void finalize();
+
+ bool expired;
+ const Handler& handler;
+ Pending_List::Iterator pending_position;
+
+private:
+ // Just to prevent their use.
+ Watchdog(const Watchdog&);
+ Watchdog& operator=(const Watchdog&);
+
+ // Pass this to getitimer.
+ static itimerval current_timer_status;
+
+ // Get the timer value.
+ static void get_timer(Time& time);
+
+ // Pass this to setitimer.
+ static itimerval signal_once;
+
+ // Last time value we set the timer to.
+ static Time last_time_requested;
+
+ // Set the timer value.
+ static void set_timer(const Time& time);
+
+ // Stops the timer.
+ static void stop_timer();
+
+ // Quick reschedule to avoid race conditions.
+ static void reschedule();
+
+ // Used by the above.
+ static Time reschedule_time;
+
+ // Records the time elapsed since last fresh start.
+ static Time time_so_far;
+
+ //! The ordered queue of pending watchdog events.
+ static Pending_List pending;
+
+ //! The actual signal handler.
+ static void handle_timeout(int);
+
+ // Handle the addition of a new watchdog event.
+ static Pending_List::Iterator new_watchdog_event(int units,
+ const Handler& handler,
+ bool& expired_flag);
+
+ // Handle the removal of a watchdog event.
+ void remove_watchdog_event(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 Parma_Watchdog_Library::PWL_handle_timeout(int signum);
+};
+
+class Init {
+private:
+ //! Count the number of objects created.
+ static unsigned int count;
+
+public:
+ //! Initializes the PWL.
+ Init();
+
+ //! Finalizes the PWL.
+ ~Init();
+};
+
+} // namespace Parma_Watchdog_Library
+
+#include "Watchdog.inlines.hh"
+
+namespace {
+
+Parma_Watchdog_Library::Init Parma_Watchdog_Library_initializer;
+
+} // namespace
+
+#endif // !defined(PWL_Watchdog_defs_hh)
+
diff --git a/Watchdog/src/Watchdog.inlines.hh b/Watchdog/src/Watchdog.inlines.hh
new file mode 100644
index 0000000..00b9878
--- /dev/null
+++ b/Watchdog/src/Watchdog.inlines.hh
@@ -0,0 +1,80 @@
+/* Watchdog and associated classes' implementation: inline functions.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_Watchdog_inlines_hh
+#define PWL_Watchdog_inlines_hh 1
+
+#include <stdexcept>
+
+#include "Handler.defs.hh"
+
+namespace Parma_Watchdog_Library {
+
+inline void
+Watchdog::reschedule() {
+ set_timer(reschedule_time);
+}
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag)
+ : expired(false),
+ handler(*new Handler_Flag<Flag_Base, Flag>(holder, flag)) {
+ if (units <= 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of time units");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(units, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(int units, void (*function)())
+ : expired(false), handler(*new Handler_Function(function)) {
+ if (units <= 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of time units");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(units, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Init::Init() {
+ // Only when the first Init object is constructed...
+ if (count++ == 0) {
+ // ... the library is initialized.
+ Watchdog::initialize();
+ }
+}
+
+inline
+Init::~Init() {
+ // Only when the last Init object is destroyed...
+ if (--count == 0) {
+ // ... the library is finalized.
+ Watchdog::finalize();
+ }
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Watchdog_inlines_hh)
diff --git a/Watchdog/src/Watchdog.types.hh b/Watchdog/src/Watchdog.types.hh
new file mode 100644
index 0000000..bbe1313
--- /dev/null
+++ b/Watchdog/src/Watchdog.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PWL_Watchdog_types_hh
+#define PWL_Watchdog_types_hh 1
+
+namespace Parma_Watchdog_Library {
+ class Watchdog;
+ class Flag;
+ class Init;
+}
+
+#endif // !defined(PWL_Watchdog_types_hh)
diff --git a/Watchdog/src/pwl.hh.dist b/Watchdog/src/pwl.hh.dist
new file mode 100644
index 0000000..6dc3767
--- /dev/null
+++ b/Watchdog/src/pwl.hh.dist
@@ -0,0 +1,1338 @@
+/* This is the header file of the Parma Watchdog Library.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_pwl_hh
+#define PWL_pwl_hh 1
+
+#ifdef NDEBUG
+# define PWL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+// Automatically generated from PPL source file ../config.h line 1
+/* config.h. Generated by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `setitimer' function. */
+#define HAVE_SETITIMER 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Assertions are disabled when this is defined */
+#define NDEBUG 1
+
+/* Name of package */
+#define PACKAGE "watchdog"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "bagnara at cs.unipr.it"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "the Parma Watchdog Library"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "the Parma Watchdog Library 0.4"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "watchdog"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.4"
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */
+#define TIME_WITH_SYS_TIME 1
+
+/* Version number of package */
+#define VERSION "0.4"
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.types.hh line 1
+
+#ifndef PWL_Doubly_Linked_Object_types_hh
+#define PWL_Doubly_Linked_Object_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Doubly_Linked_Object;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_types_hh)
+// Automatically generated from PPL source file ../src/EList.types.hh line 1
+
+#ifndef PWL_EList_types_hh
+#define PWL_EList_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_types_hh)
+// Automatically generated from PPL source file ../src/EList_Iterator.types.hh line 1
+
+#ifndef PWL_EList_Iterator_types_hh
+#define PWL_EList_Iterator_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+template <typename T>
+class EList_Iterator;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_types_hh)
+// Automatically generated from PPL source file ../src/Handler.types.hh line 1
+
+#ifndef PWL_Handler_types_hh
+#define PWL_Handler_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Handler;
+
+template <typename Flag_Base, typename Flag>
+class Handler_Flag;
+
+class Handler_Function;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_types_hh)
+// Automatically generated from PPL source file ../src/Pending_Element.types.hh line 1
+
+#ifndef PWL_Pending_Element_types_hh
+#define PWL_Pending_Element_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_Element;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_types_hh)
+// Automatically generated from PPL source file ../src/Pending_List.types.hh line 1
+
+#ifndef PWL_Pending_List_types_hh
+#define PWL_Pending_List_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Pending_List;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_types_hh)
+// Automatically generated from PPL source file ../src/Time.types.hh line 1
+
+#ifndef PWL_Time_types_hh
+#define PWL_Time_types_hh 1
+
+namespace Parma_Watchdog_Library {
+
+class Time;
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_types_hh)
+// Automatically generated from PPL source file ../src/Watchdog.types.hh line 1
+
+#ifndef PWL_Watchdog_types_hh
+#define PWL_Watchdog_types_hh 1
+
+namespace Parma_Watchdog_Library {
+ class Watchdog;
+ class Flag;
+ class Init;
+}
+
+#endif // !defined(PWL_Watchdog_types_hh)
+// Automatically generated from PPL source file ../src/Handler.defs.hh line 1
+/* Handler and derived classes' declaration.
+*/
+
+#ifndef PWL_Handler_defs_hh
+#define PWL_Handler_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Handler.defs.hh line 27
+
+//! Abstract base class for handlers of the watchdog events.
+class Parma_Watchdog_Library::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 templatic class Handler_Flag<Flag_Base, Flag> 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_Watchdog_Library::Handler_Flag : virtual public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Flag(const Flag_Base* volatile& holder, Flag& flag);
+
+ //! Does its job: installs the flag onto the holder, if a flag with
+ //! an higher priority has not already been installed.
+ 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_Watchdog_Library::Handler_Function : virtual public Handler {
+public:
+ //! Constructor with a given function.
+ Handler_Function(void (*function)());
+
+ //! Does its job: calls the embedded function.
+ void act() const;
+
+private:
+ //! Pointer to the embedded function.
+ void (*f)();
+};
+
+// Automatically generated from PPL source file ../src/Handler.inlines.hh line 1
+/* Handler and derived classes' implementation: inline functions.
+*/
+
+#ifndef PWL_Handler_inlines_hh
+#define PWL_Handler_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+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 (*function)())
+ : f(function) {
+}
+
+inline void
+Handler_Function::act() const {
+ (*f)();
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Handler_inlines_hh)
+// Automatically generated from PPL source file ../src/Handler.defs.hh line 89
+
+#endif // !defined(PWL_Handler_defs_hh)
+// Automatically generated from PPL source file ../src/Time.defs.hh line 1
+/* Time class declaration.
+*/
+
+#ifndef PWL_Time_defs_hh
+#define PWL_Time_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Time.defs.hh line 27
+
+namespace Parma_Watchdog_Library {
+
+//! 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 Parma_Watchdog_Library
+
+//! A class for representing and manipulating positive time intervals.
+class Parma_Watchdog_Library::Time {
+public:
+ //! Zero seconds.
+ Time();
+
+ //! Constructor taking a number of hundredths of a second.
+ explicit Time(unsigned long hundredths_of_a_second);
+
+ //! Constructor with seconds and microseconds.
+ Time(unsigned long s, unsigned long m);
+
+ /*! \brief
+ Returns the number of whole seconds contained in the represented
+ time interval.
+ */
+ unsigned 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.
+ */
+ unsigned 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 seconds.
+ unsigned long secs;
+
+ //! Number of microseconds.
+ unsigned long microsecs;
+};
+
+// Automatically generated from PPL source file ../src/Time.inlines.hh line 1
+/* Time class implementation: inline functions.
+*/
+
+#ifndef PWL_Time_inlines_hh
+#define PWL_Time_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Watchdog_Library {
+
+inline
+Time::Time()
+ : secs(0), microsecs(0) {
+ assert(OK());
+}
+
+inline
+Time::Time(unsigned long hundredths_of_a_second)
+ : secs(hundredths_of_a_second / 100),
+ microsecs((hundredths_of_a_second % 100) * 10000) {
+ assert(OK());
+}
+
+inline
+Time::Time(unsigned long s, unsigned long m)
+ : secs(s),
+ microsecs(m) {
+ if (microsecs >= 1000000) {
+ secs += microsecs / 1000000;
+ microsecs %= 1000000;
+ }
+ assert(OK());
+}
+
+inline unsigned long
+Time::seconds() const {
+ return secs;
+}
+
+inline unsigned long
+Time::microseconds() const {
+ return microsecs;
+}
+
+inline Time&
+Time::operator+=(const Time& y) {
+ unsigned long r_secs = secs + y.secs;
+ unsigned long r_microsecs = microsecs + y.microsecs;
+ if (r_microsecs >= 1000000) {
+ ++r_secs;
+ r_microsecs %= 1000000;
+ }
+ 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 += 1000000;
+ }
+ if (r_secs < 0)
+ r_secs = 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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_Time_inlines_hh)
+// Automatically generated from PPL source file ../src/Time.defs.hh line 110
+
+#endif // !defined(PWL_Time_defs_hh)
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 1
+/* Doubly_Linked_Object class declaration.
+*/
+
+#ifndef PWL_Doubly_Linked_Object_defs_hh
+#define PWL_Doubly_Linked_Object_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 29
+
+//! A (base) class for doubly linked objects.
+class Parma_Watchdog_Library::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.
+*/
+
+#ifndef PWL_Doubly_Linked_Object_inlines_hh
+#define PWL_Doubly_Linked_Object_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_Doubly_Linked_Object_inlines_hh)
+// Automatically generated from PPL source file ../src/Doubly_Linked_Object.defs.hh line 63
+
+#endif // !defined(PWL_Doubly_Linked_Object_defs_hh)
+// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 1
+/* EList_Iterator class declaration.
+*/
+
+#ifndef PWL_EList_Iterator_defs_hh
+#define PWL_EList_Iterator_defs_hh 1
+
+// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 28
+
+namespace Parma_Watchdog_Library {
+
+//! 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 Parma_Watchdog_Library
+
+//! A class providing iterators for embedded lists.
+template <typename T>
+class Parma_Watchdog_Library::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.
+*/
+
+#ifndef PWL_EList_Iterator_inlines_hh
+#define PWL_EList_Iterator_inlines_hh 1
+
+// Automatically generated from PPL source file ../src/EList_Iterator.inlines.hh line 27
+
+namespace Parma_Watchdog_Library {
+
+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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_Iterator_inlines_hh)
+// Automatically generated from PPL source file ../src/EList_Iterator.defs.hh line 82
+
+#endif // !defined(PWL_EList_Iterator_defs_hh)
+// Automatically generated from PPL source file ../src/EList.defs.hh line 1
+/* EList class declaration.
+*/
+
+#ifndef PWL_EList_defs_hh
+#define PWL_EList_defs_hh 1
+
+// Automatically generated from PPL source file ../src/EList.defs.hh line 28
+
+/*! \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_Watchdog_Library::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 jyst 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.
+*/
+
+#ifndef PWL_EList_inlines_hh
+#define PWL_EList_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+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 Parma_Watchdog_Library
+
+#endif // !defined(PWL_EList_inlines_hh)
+// Automatically generated from PPL source file ../src/EList.defs.hh line 86
+
+#endif // !defined(PWL_EList_defs_hh)
+// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 1
+/* Pending_Element class declaration.
+*/
+
+#ifndef PWL_Pending_Element_defs_hh
+#define PWL_Pending_Element_defs_hh 1
+
+// 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.
+*/
+class Parma_Watchdog_Library::Pending_Element : public Doubly_Linked_Object {
+public:
+ //! Constructs an element with the given attributes.
+ Pending_Element(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Modifies \p *this so that it has the given attributes.
+ void assign(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag);
+
+ //! Returns the deadline of the event.
+ const Time& 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.
+ Time 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.
+*/
+
+#ifndef PWL_Pending_Element_inlines_hh
+#define PWL_Pending_Element_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_Element::Pending_Element(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag)
+ : d(deadline), p_h(&handler), p_f(&expired_flag) {
+ assert(OK());
+}
+
+inline void
+Pending_Element::assign(const Time& deadline,
+ const Handler& handler,
+ bool& expired_flag) {
+ d = deadline;
+ p_h = &handler;
+ p_f = &expired_flag;
+ assert(OK());
+}
+
+inline const Time&
+Pending_Element::deadline() const {
+ return d;
+}
+
+inline const Handler&
+Pending_Element::handler() const {
+ return *p_h;
+}
+
+inline bool&
+Pending_Element::expired_flag() const {
+ return *p_f;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_Element_inlines_hh)
+// Automatically generated from PPL source file ../src/Pending_Element.defs.hh line 74
+
+#endif // !defined(PWL_Pending_Element_defs_hh)
+// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 1
+/* Pending_List class declaration.
+*/
+
+#ifndef PWL_Pending_List_defs_hh
+#define PWL_Pending_List_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 31
+
+//! An ordered list for recording pending watchdog events.
+class Parma_Watchdog_Library::Pending_List {
+public:
+ //! A non-const iterator to traverse the list.
+ typedef EList<Pending_Element>::Iterator Iterator;
+
+ //! Constructs an empty list.
+ Pending_List();
+
+ //! Destructor.
+ ~Pending_List();
+
+ //! Inserts a new Pending_Element object with the given attributes.
+ Iterator insert(const Time& 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> active_list;
+ EList<Pending_Element> free_list;
+};
+
+// Automatically generated from PPL source file ../src/Pending_List.inlines.hh line 1
+/* Pending_List class implementation: inline functions.
+*/
+
+#ifndef PWL_Pending_List_inlines_hh
+#define PWL_Pending_List_inlines_hh 1
+
+namespace Parma_Watchdog_Library {
+
+inline
+Pending_List::Pending_List()
+ : active_list(),
+ free_list() {
+ assert(OK());
+}
+
+inline
+Pending_List::~Pending_List() {
+}
+
+inline Pending_List::Iterator
+Pending_List::begin() {
+ return active_list.begin();
+}
+
+inline Pending_List::Iterator
+Pending_List::end() {
+ return active_list.end();
+}
+
+inline bool
+Pending_List::empty() const {
+ return active_list.empty();
+}
+
+inline Pending_List::Iterator
+Pending_List::erase(Iterator position) {
+ assert(!empty());
+ Iterator next = active_list.erase(position);
+ free_list.push_back(*position);
+ assert(OK());
+ return next;
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Pending_List_inlines_hh)
+// Automatically generated from PPL source file ../src/Pending_List.defs.hh line 73
+
+#endif // !defined(PWL_Pending_List_defs_hh)
+// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 1
+/* Watchdog and associated classes' declaration and inline functions.
+*/
+
+#ifndef PWL_Watchdog_defs_hh
+#define PWL_Watchdog_defs_hh 1
+
+// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 30
+#include <cassert>
+
+#ifdef HAVE_SYS_TIME_H
+# include <sys/time.h>
+#endif
+
+namespace Parma_Watchdog_Library {
+
+// Set linkage now to declare it friend later.
+extern "C" void PWL_handle_timeout(int signum);
+
+//! A watchdog timer.
+class Watchdog {
+public:
+ template <typename Flag_Base, typename Flag>
+ Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag);
+
+ Watchdog(int units, void (*function)());
+ ~Watchdog();
+
+
+private:
+ friend class Init;
+ static void initialize();
+ static void finalize();
+
+ bool expired;
+ const Handler& handler;
+ Pending_List::Iterator pending_position;
+
+private:
+ // Just to prevent their use.
+ Watchdog(const Watchdog&);
+ Watchdog& operator=(const Watchdog&);
+
+ // Pass this to getitimer.
+ static itimerval current_timer_status;
+
+ // Get the timer value.
+ static void get_timer(Time& time);
+
+ // Pass this to setitimer.
+ static itimerval signal_once;
+
+ // Last time value we set the timer to.
+ static Time last_time_requested;
+
+ // Set the timer value.
+ static void set_timer(const Time& time);
+
+ // Stops the timer.
+ static void stop_timer();
+
+ // Quick reschedule to avoid race conditions.
+ static void reschedule();
+
+ // Used by the above.
+ static Time reschedule_time;
+
+ // Records the time elapsed since last fresh start.
+ static Time time_so_far;
+
+ //! The ordered queue of pending watchdog events.
+ static Pending_List pending;
+
+ //! The actual signal handler.
+ static void handle_timeout(int);
+
+ // Handle the addition of a new watchdog event.
+ static Pending_List::Iterator new_watchdog_event(int units,
+ const Handler& handler,
+ bool& expired_flag);
+
+ // Handle the removal of a watchdog event.
+ void remove_watchdog_event(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 Parma_Watchdog_Library::PWL_handle_timeout(int signum);
+};
+
+class Init {
+private:
+ //! Count the number of objects created.
+ static unsigned int count;
+
+public:
+ //! Initializes the PWL.
+ Init();
+
+ //! Finalizes the PWL.
+ ~Init();
+};
+
+} // namespace Parma_Watchdog_Library
+
+// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 1
+/* Watchdog and associated classes' implementation: inline functions.
+*/
+
+#ifndef PWL_Watchdog_inlines_hh
+#define PWL_Watchdog_inlines_hh 1
+
+#include <stdexcept>
+
+// Automatically generated from PPL source file ../src/Watchdog.inlines.hh line 29
+
+namespace Parma_Watchdog_Library {
+
+inline void
+Watchdog::reschedule() {
+ set_timer(reschedule_time);
+}
+
+template <typename Flag_Base, typename Flag>
+Watchdog::Watchdog(int units, const Flag_Base* volatile& holder, Flag& flag)
+ : expired(false),
+ handler(*new Handler_Flag<Flag_Base, Flag>(holder, flag)) {
+ if (units <= 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of time units");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(units, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Watchdog::Watchdog(int units, void (*function)())
+ : expired(false), handler(*new Handler_Function(function)) {
+ if (units <= 0)
+ throw std::invalid_argument("Watchdog constructor called with a"
+ " non-positive number of time units");
+ in_critical_section = true;
+ pending_position = new_watchdog_event(units, handler, expired);
+ in_critical_section = false;
+}
+
+inline
+Init::Init() {
+ // Only when the first Init object is constructed...
+ if (count++ == 0) {
+ // ... the library is initialized.
+ Watchdog::initialize();
+ }
+}
+
+inline
+Init::~Init() {
+ // Only when the last Init object is destroyed...
+ if (--count == 0) {
+ // ... the library is finalized.
+ Watchdog::finalize();
+ }
+}
+
+} // namespace Parma_Watchdog_Library
+
+#endif // !defined(PWL_Watchdog_inlines_hh)
+// Automatically generated from PPL source file ../src/Watchdog.defs.hh line 131
+
+namespace {
+
+Parma_Watchdog_Library::Init Parma_Watchdog_Library_initializer;
+
+} // namespace
+
+#endif // !defined(PWL_Watchdog_defs_hh)
+
+
+#ifdef PWL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PWL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/Watchdog/src/pwl_header.hh b/Watchdog/src/pwl_header.hh
new file mode 100644
index 0000000..69eef10
--- /dev/null
+++ b/Watchdog/src/pwl_header.hh
@@ -0,0 +1,50 @@
+/* This is the header file of the Parma Watchdog Library.
+ Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Watchdog Library (PWL).
+
+The PWL is free software; you can 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.
+
+The PWL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the CS at Parma software
+site: http://www.cs.unipr.it/Software/ . */
+
+#ifndef PWL_pwl_hh
+#define PWL_pwl_hh 1
+
+#ifdef NDEBUG
+# define PWL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+#include "config.h"
+#include "pwl_include_files.hh"
+
+#ifdef PWL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PWL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/Watchdog/utils/Makefile.am b/Watchdog/utils/Makefile.am
new file mode 100644
index 0000000..6fc0edc
--- /dev/null
+++ b/Watchdog/utils/Makefile.am
@@ -0,0 +1,45 @@
+# Automake source file for the Parma Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can 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.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+dist_noinst_SCRIPTS = \
+build_header.in
+
+noinst_SCRIPTS = \
+build_header
+
+# 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 Makefile
+ $(do_subst) < $(srcdir)/build_header.in > build_header
+ chmod +x build_header
+
+CLEANFILES = $(noinst_SCRIPTS)
diff --git a/Watchdog/utils/Makefile.in b/Watchdog/utils/Makefile.in
new file mode 100644
index 0000000..89fc943
--- /dev/null
+++ b/Watchdog/utils/Makefile.in
@@ -0,0 +1,374 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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 Watchdog Library.
+# Copyright (C) 2002-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Watchdog Library (PWL).
+#
+# The PWL is free software; you can 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.
+#
+# The PWL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the CS at Parma software
+# site: http://www.cs.unipr.it/Software/ . */
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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 =
+SCRIPTS = $(dist_noinst_SCRIPTS) $(noinst_SCRIPTS)
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+RANLIB = @RANLIB@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+datadir = @datadir@
+debug_flag = @debug_flag@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+dist_noinst_SCRIPTS = \
+build_header.in
+
+noinst_SCRIPTS = \
+build_header
+
+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:
+$(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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 $(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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ dist-hook distclean distclean-generic distclean-libtool \
+ distdir dvi dvi-am html html-am info info-am install \
+ install-am install-data install-data-am install-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ uninstall uninstall-am uninstall-info-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 Makefile
+ $(do_subst) < $(srcdir)/build_header.in > build_header
+ chmod +x build_header
+# 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/Watchdog/utils/build_header.in b/Watchdog/utils/build_header.in
new file mode 100644
index 0000000..4ebe2f3
--- /dev/null
+++ b/Watchdog/utils/build_header.in
@@ -0,0 +1,102 @@
+#! @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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..dccda82
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,7241 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 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.
+
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+
+# serial 48 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+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
+
+# 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 to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+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 \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])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_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+AC_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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$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.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[ac_outfile=conftest.$ac_objext
+printf "$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 conftest*
+])# _LT_LINKER_BOILERPLATE
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# 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.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 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
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# 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
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_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 __oline__ "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-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|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-*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-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ 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_TRY_LINK([],[],[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
+ ;;
+sparc*-*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*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ printf "$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:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/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 conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# 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*)
+ # 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;
+ ;;
+
+ 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
+ ;;
+
+ 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
+ ;;
+ *)
+ # 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.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ 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`
+ ;;
+ 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
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_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 <<EOF
+[#line __oline__ "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
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=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;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}]
+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_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_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*)
+ 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="-dld"],
+ [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="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ 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_AC_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_AC_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
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:__oline__: $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:__oline__: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_AC_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 ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_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
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_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
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_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_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; 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
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[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"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_MSG_CHECKING([dynamic linker characteristics])
+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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[[123]]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_ARG_WITH([tags],
+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+ [include additional configurations @<:@automatic@:>@])],
+ [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ AC_MSG_WARN([output file `$ofile' does not exist])
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+ else
+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+ "") ;;
+ *) AC_MSG_ERROR([invalid tag name: $tagname])
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ AC_MSG_ERROR([tag name \"$tagname\" already exists])
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_LIBTOOL_LANG_CXX_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ AC_LIBTOOL_LANG_F77_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ AC_LIBTOOL_LANG_GCJ_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+ AC_LIBTOOL_LANG_RC_CONFIG
+ ;;
+
+ *)
+ AC_MSG_ERROR([Unsupported tag name: $tagname])
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ AC_MSG_ERROR([unable to update list of available tagged configurations.])
+ fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 DLLs
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]AC_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=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+# set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]AC_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=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]AC_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=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognise shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_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="ifelse([$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 <<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
+
+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
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognise a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_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
+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+ [AC_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])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])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])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+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
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[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
+ 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
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognise 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
+aix4* | aix5*)
+ 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'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu | 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
+ ;;
+
+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]) 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
+ ;;
+
+interix3*)
+ # 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 Linux ELF.
+linux*)
+ 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=unknown
+ ;;
+
+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
+ ;;
+
+solaris*)
+ 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
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+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
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible 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
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-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_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# it is assumed to be `libltdl'. LIBLTDL will be prefixed with
+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
+# (note the single quotes!). If your package is not flat and you're not
+# using automake, define top_builddir and top_srcdir appropriately in
+# the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# and an installed libltdl is not found, it is assumed to be `libltdl'.
+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and top_srcdir
+# appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+ fi
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ------------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+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
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# -------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[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_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF
+
+# 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
+ ;;
+
+aix4* | aix5*)
+ 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])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_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_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++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ AC_PROG_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_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_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_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_AC_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 "\-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_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ 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
+ 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]].*|aix5*)
+ 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_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ 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
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_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
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_AC_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 echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_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_AC_SYS_LIBPATH_AIX
+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_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_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes ; then
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_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'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "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~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ freebsd[[12]]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ freebsd-elf*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ _LT_AC_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) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ interix3*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_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_AC_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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -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_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ linux*)
+ 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_AC_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_AC_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; echo $list'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+ _LT_AC_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_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc*)
+ # 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_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ _LT_AC_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'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_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=`echo $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; echo $list'
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ _LT_AC_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_AC_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_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd='echo'
+ ;;
+ osf3*)
+ 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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_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" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_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 "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ 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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_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 "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker. We must also pass each convience library through
+ # to the system linker between allextract/defaultextract.
+ # The C++ compiler will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ output_verbose_link_cmd='echo'
+
+ # 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_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_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_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -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 \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_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 \"\-L\""
+ fi
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ fi
+ ;;
+ esac
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_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.
+ # 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.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+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
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([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.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+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...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+EOF
+])
+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
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $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
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p 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_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_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_AC_TAGVAR(postdeps, $1)"; then
+ _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$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_AC_TAGVAR(predep_objects, $1)"; then
+ _LT_AC_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+ _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_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
+
+# PORTME: override above test on systems where it is broken
+ifelse([$1],[CXX],
+[case $host_os in
+interix3*)
+ # 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_AC_TAGVAR(predep_objects,$1)=
+ _LT_AC_TAGVAR(postdep_objects,$1)=
+ _LT_AC_TAGVAR(postdeps,$1)=
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # 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.
+ _LT_AC_TAGVAR(postdeps,$1)='-lCstd -lCrun'
+ ;;
+ esac
+ ;;
+esac
+])
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_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_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_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"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+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
+ ;;
+aix4* | aix5*)
+ 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_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }\n'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_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"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# -------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# 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_AC_SYS_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"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then 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
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ _LT_AC_TAGVAR(compiler, $1) \
+ _LT_AC_TAGVAR(CC, $1) \
+ _LT_AC_TAGVAR(LD, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+ _LT_AC_TAGVAR(old_archive_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+ _LT_AC_TAGVAR(predep_objects, $1) \
+ _LT_AC_TAGVAR(postdep_objects, $1) \
+ _LT_AC_TAGVAR(predeps, $1) \
+ _LT_AC_TAGVAR(postdeps, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+ _LT_AC_TAGVAR(archive_cmds, $1) \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(postinstall_cmds, $1) \
+ _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+ _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+ _LT_AC_TAGVAR(no_undefined_flag, $1) \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+ _LT_AC_TAGVAR(hardcode_automatic, $1) \
+ _LT_AC_TAGVAR(module_cmds, $1) \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+ _LT_AC_TAGVAR(exclude_expsyms, $1) \
+ _LT_AC_TAGVAR(include_expsyms, $1); do
+
+ case $var in
+ _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(module_cmds, $1) | \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\[$]0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+ ;;
+ esac
+
+ifelse([$1], [],
+ [cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ AC_MSG_NOTICE([creating $ofile])],
+ [cfgfile="$ofile"])
+
+ cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# 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.
+
+# 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//"
+
+# 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
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# 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=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$_LT_AC_TAGVAR(fix_srcfile_path, $1)"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+ case $host_os in
+ aix3*)
+ cat <<\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
+EOF
+ ;;
+ esac
+
+ # 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)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+])
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# 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]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \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\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDGIRSTW]]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ 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
+
+# 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
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, 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.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+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 <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_AC_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_save_LIBS"
+ CFLAGS="$lt_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 -f 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
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # 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_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ interix3*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # 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*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_AC_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
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler.
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ interix3*)
+ # 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_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_AC_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_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ ccc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ unicos*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+ $lt_tmp_static_flag,
+ [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_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_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]] /s/.* \([[^ ]]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([[^ ]]*\) [[^ ]]*/\1 DATA/;/^I /d;/^[[AITW]] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+],[
+ runpath_var=
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)=
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+ _LT_AC_TAGVAR(module_cmds, $1)=
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_AC_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_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ _LT_CC_BASENAME([$compiler])
+ 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
+
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = 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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_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_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [[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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=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 can't use
+ # them.
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_AC_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'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_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_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ interix3*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_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_AC_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_AC_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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ _LT_AC_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 -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $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_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_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_AC_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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_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_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
+ runpath_var=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ _LT_AC_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_AC_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_AC_TAGVAR(hardcode_direct, $1)=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
+ 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_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]].*|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
+
+ 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_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ 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
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ else
+ # We have old collect2
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_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
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_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_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_AC_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 echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_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_AC_SYS_LIBPATH_AIX
+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_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*)
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ # see comment about different semantics on the GNU ld section
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ bsdi[[45]]*)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ 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.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ freebsd1*)
+ _LT_AC_TAGVAR(ld_shlibs, $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_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_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_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ openbsd*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_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_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_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~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_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'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' ;;
+ *)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ _LT_AC_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_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_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_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_AC_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_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $rm conftest*
+ printf "$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_AC_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+ ;;
+ esac
+ fi
+ ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+# 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. #
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+AC_DEFUN([LT_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
+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_MSG_RESULT([$SED])
+])
+
+# Copyright (C) 2002, 2003, 2005 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.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 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, 2000, 2001, 2003, 2004, 2005
+# 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.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+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, 2000, 2001, 2002, 2003, 2004, 2005
+# 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.
+
+# serial 8
+
+# 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", "GCJ", or "OBJC".
+# 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
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# 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.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; 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.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /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"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/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, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# 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.
+
+# serial 12
+
+# 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.
+
+# 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.58])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
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+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],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])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)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# 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)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# 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_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 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
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 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.
+
+# serial 2
+
+# 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, 2002, 2003, 2005 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.
+
+# serial 3
+
+# 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 done
+.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
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+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, 1999, 2000, 2001, 2003, 2005
+# 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.
+
+# serial 4
+
+# 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 supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005 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_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='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.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 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.
+
+# serial 3
+
+# _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],
+[AC_FOREACH([_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])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# 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.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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 (
+ 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
+ rm -f conftest.file
+ 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
+
+ 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)])
+
+# Copyright (C) 2001, 2003, 2005 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="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 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.
+
+# serial 2
+
+# _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.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+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])
+ 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_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_cxx_attribute_weak.m4])
+m4_include([m4/ac_cxx_double_binary_format.m4])
+m4_include([m4/ac_cxx_flexible_arrays.m4])
+m4_include([m4/ac_cxx_float_binary_format.m4])
+m4_include([m4/ac_cxx_long_double_binary_format.m4])
+m4_include([m4/ac_text_md5sum.m4])
+m4_include([m4/lib-ld.m4])
+m4_include([m4/lib-link.m4])
+m4_include([m4/lib-prefix.m4])
diff --git a/compile b/compile
new file mode 100755
index 0000000..cd27e88
--- /dev/null
+++ b/compile
@@ -0,0 +1,142 @@
+#! /bin/sh
+# Wrapper for compilers which do not understand `-c -o'.
+
+scriptversion=2005-05-14.22
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 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, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# 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>.
+
+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 $?
+ ;;
+esac
+
+ofile=
+cfile=
+eat=
+
+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 -e 's|^.*/||' -e '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
+ mv "$cofile" "$ofile"
+elif test -f "${cofile}bj"; then
+ 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-end: "$"
+# End:
diff --git a/config.guess b/config.guess
new file mode 100755
index 0000000..ec46d18
--- /dev/null
+++ b/config.guess
@@ -0,0 +1,1498 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2006-02-27'
+
+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# 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 Per Bothner <per at bothner.com>.
+# Please send patches to <config-patches at gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub. If it succeeds, it prints the system name on stdout, and
+# exits with 0. Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit build system type.
+
+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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+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
+
+# 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 tupples: *-*-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 ;;
+ *) 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 __ELF__ >/dev/null
+ 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 ;;
+ *: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 powerppc-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'`
+ exit ;;
+ 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 ;;
+ 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:SunOS:5.*:*)
+ echo i386-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:*:[45])
+ 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 __LP64__ >/dev/null
+ 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:*:*)
+ case ${UNAME_MACHINE} in
+ pc98)
+ echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ *)
+ echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+ esac
+ exit ;;
+ i*:CYGWIN*:*)
+ echo ${UNAME_MACHINE}-pc-cygwin
+ exit ;;
+ i*:MINGW*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:MSYS_NT-*:*:*)
+ echo ${UNAME_MACHINE}-pc-mingw32
+ exit ;;
+ i*:windows32*:*)
+ # uname -m includes "-pc" on this system.
+ echo ${UNAME_MACHINE}-mingw32
+ exit ;;
+ i*:PW*:*)
+ echo ${UNAME_MACHINE}-pc-pw32
+ exit ;;
+ x86:Interix*:[345]*)
+ echo i586-pc-interix${UNAME_RELEASE}
+ exit ;;
+ EM64T:Interix*:[345]*)
+ echo x86_64-unknown-interix${UNAME_RELEASE}
+ exit ;;
+ [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+ echo i${UNAME_MACHINE}-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-gnu`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/[-(].*//'`-gnu
+ exit ;;
+ i*86:Minix:*:*)
+ echo ${UNAME_MACHINE}-pc-minix
+ exit ;;
+ arm*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ cris:Linux:*:*)
+ echo cris-axis-linux-gnu
+ exit ;;
+ crisv32:Linux:*:*)
+ echo crisv32-axis-linux-gnu
+ exit ;;
+ frv:Linux:*:*)
+ echo frv-unknown-linux-gnu
+ exit ;;
+ ia64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m32r*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ m68*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ mips:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips
+ #undef mipsel
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mipsel
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ mips64:Linux:*:*)
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #undef CPU
+ #undef mips64
+ #undef mips64el
+ #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+ CPU=mips64el
+ #else
+ #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+ CPU=mips64
+ #else
+ CPU=
+ #endif
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^CPU/{
+ s: ::g
+ p
+ }'`"
+ test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+ ;;
+ or32:Linux:*:*)
+ echo or32-unknown-linux-gnu
+ exit ;;
+ ppc:Linux:*:*)
+ echo powerpc-unknown-linux-gnu
+ exit ;;
+ ppc64:Linux:*:*)
+ echo powerpc64-unknown-linux-gnu
+ 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 ld.so.1 >/dev/null
+ if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+ echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu ;;
+ PA8*) echo hppa2.0-unknown-linux-gnu ;;
+ *) echo hppa-unknown-linux-gnu ;;
+ esac
+ exit ;;
+ parisc64:Linux:*:* | hppa64:Linux:*:*)
+ echo hppa64-unknown-linux-gnu
+ exit ;;
+ s390:Linux:*:* | s390x:Linux:*:*)
+ echo ${UNAME_MACHINE}-ibm-linux
+ exit ;;
+ sh64*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sh*:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ sparc:Linux:*:* | sparc64:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-gnu
+ exit ;;
+ vax:Linux:*:*)
+ echo ${UNAME_MACHINE}-dec-linux-gnu
+ exit ;;
+ x86_64:Linux:*:*)
+ echo x86_64-unknown-linux-gnu
+ exit ;;
+ i*86:Linux:*:*)
+ # The BFD linker knows what the default object file format is, so
+ # first see if it will tell us. cd to the root directory to prevent
+ # problems with other programs or directories called `ld' in the path.
+ # Set LC_ALL=C to ensure ld outputs messages in English.
+ ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
+ | sed -ne '/supported targets:/!d
+ s/[ ][ ]*/ /g
+ s/.*supported targets: *//
+ s/ .*//
+ p'`
+ case "$ld_supported_targets" in
+ elf32-i386)
+ TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
+ ;;
+ a.out-i386-linux)
+ echo "${UNAME_MACHINE}-pc-linux-gnuaout"
+ exit ;;
+ coff-i386)
+ echo "${UNAME_MACHINE}-pc-linux-gnucoff"
+ exit ;;
+ "")
+ # Either a pre-BFD a.out linker (linux-gnuoldld) or
+ # one that does not give us useful --help.
+ echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
+ exit ;;
+ esac
+ # Determine whether the default compiler is a.out or elf
+ eval $set_cc_for_build
+ sed 's/^ //' << EOF >$dummy.c
+ #include <features.h>
+ #ifdef __ELF__
+ # ifdef __GLIBC__
+ # if __GLIBC__ >= 2
+ LIBC=gnu
+ # else
+ LIBC=gnulibc1
+ # endif
+ # else
+ LIBC=gnulibc1
+ # endif
+ #else
+ #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun)
+ LIBC=gnu
+ #else
+ LIBC=gnuaout
+ #endif
+ #endif
+ #ifdef __dietlibc__
+ LIBC=dietlibc
+ #endif
+EOF
+ eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
+ /^LIBC/{
+ s: ::g
+ p
+ }'`"
+ test x"${LIBC}" != x && {
+ echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+ exit
+ }
+ test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*)
+ 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 i386.
+ echo i386-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; } ;;
+ 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.0*:*)
+ 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 ;;
+ 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 ;;
+ 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
+ case $UNAME_PROCESSOR in
+ unknown) UNAME_PROCESSOR=powerpc ;;
+ esac
+ 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 ;;
+ 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 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+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://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
+and
+ http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
+
+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..8dc0031
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,286 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+ */
+#undef CHECKED_INTEGERS
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#undef COEFFICIENT_BITS
+
+/* The integral type used to represent coefficients. */
+#undef COEFFICIENT_TYPE
+
+/* The binary format of C++ doubles, if supported; undefined otherwise. */
+#undef CXX_DOUBLE_BINARY_FORMAT
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#undef CXX_FLOAT_BINARY_FORMAT
+
+/* The binary format of C++ long doubles, if supported; undefined otherwise.
+ */
+#undef CXX_LONG_DOUBLE_BINARY_FORMAT
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#undef CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+/* Not zero if the C++ compiler supports flexible arrays. */
+#undef CXX_SUPPORTS_FLEXIBLE_ARRAYS
+
+/* Enable more assertions when defined. */
+#undef EXTRA_ROW_DEBUG
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#undef GMP_INTEGERS
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#undef GMP_SUPPORTS_EXCEPTIONS
+
+/* 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 `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 `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 <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 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 `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 member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_ALLOC
+
+/* Define to 1 if `_mp_d' is member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_D
+
+/* Define to 1 if `_mp_size' is member of `__mpz_struct'. */
+#undef HAVE___MPZ_STRUCT__MP_SIZE
+
+/* Defined if the integral type to be used for coefficients is a native one.
+ */
+#undef NATIVE_INTEGERS
+
+/* Assertions are disabled when this is defined. */
+#undef NDEBUG
+
+/* Name of package */
+#undef PACKAGE
+
+/* 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 version of this package. */
+#undef PACKAGE_VERSION
+
+/* Not zero if the FPU can be controlled. */
+#undef PPL_CAN_CONTROL_FPU
+
+/* This contains the options with which `configure' was invoked. */
+#undef PPL_CONFIGURE_OPTIONS
+
+/* 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 a `double', as computed by sizeof. */
+#undef SIZEOF_DOUBLE
+
+/* The size of a `float', as computed by sizeof. */
+#undef SIZEOF_FLOAT
+
+/* The size of a `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of a `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of a `long double', as computed by sizeof. */
+#undef SIZEOF_LONG_DOUBLE
+
+/* The size of a `long long', as computed by sizeof. */
+#undef SIZEOF_LONG_LONG
+
+/* The size of a `mp_limb_t', as computed by sizeof. */
+#undef SIZEOF_MP_LIMB_T
+
+/* The size of a `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of a `unsigned', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* The size of a `unsigned long long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+#undef WORDS_BIGENDIAN
+
+/* 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
+
+
+/*
+ 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.
+*/
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#endif /* !defined(PPL_ppl_config_h) */
+
diff --git a/config.rpath b/config.rpath
new file mode 100755
index 0000000..65e298a
--- /dev/null
+++ b/config.rpath
@@ -0,0 +1,557 @@
+#! /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-2004 Free Software Foundation, Inc.
+# Taken from GNU libtool, 2001
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# 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.
+#
+# 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 M$VC,
+# 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 AC_LIBTOOL_PROG_COMPILER_PIC.
+
+wl=
+if test "$GCC" = yes; then
+ wl='-Wl,'
+else
+ case "$host_os" in
+ aix*)
+ wl='-Wl,'
+ ;;
+ mingw* | pw32* | os2*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ wl='-Wl,'
+ ;;
+ irix5* | irix6* | nonstopux*)
+ wl='-Wl,'
+ ;;
+ newsos6)
+ ;;
+ linux*)
+ case $CC in
+ icc* | ecc*)
+ wl='-Wl,'
+ ;;
+ ccc*)
+ wl='-Wl,'
+ ;;
+ como)
+ wl='-lopt='
+ ;;
+ esac
+ ;;
+ osf3* | osf4* | osf5*)
+ wl='-Wl,'
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ wl='-Wl,'
+ ;;
+ sunos4*)
+ wl='-Qoption ld '
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ wl='-Wl,'
+ ;;
+ sysv4*MP*)
+ ;;
+ 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
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+esac
+
+ld_shlibs=yes
+if test "$with_gnu_ld" = yes; then
+ 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
+ ;;
+ netbsd*)
+ ;;
+ solaris* | sysv5*)
+ 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
+ ;;
+ sunos4*)
+ hardcode_direct=yes
+ ;;
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ :
+ else
+ ld_shlibs=no
+ fi
+ ;;
+ esac
+ if test "$ld_shlibs" = yes; then
+ # 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'
+ 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
+ hardcode_direct=yes
+ 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
+ ;;
+ 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* | kfreebsd*-gnu)
+ 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* | hpux11*)
+ if test "$with_gnu_ld" = no; then
+ case "$host_cpu" in
+ hppa*64*)
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+ hardcode_direct=no
+ ;;
+ ia64*)
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_direct=no
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L=yes
+ ;;
+ *)
+ 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
+ ;;
+ 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*)
+ 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
+ ;;
+ 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=:
+ ;;
+ sco3.2v5*)
+ ;;
+ 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.2uw2*)
+ hardcode_direct=yes
+ hardcode_minus_L=no
+ ;;
+ sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*)
+ ;;
+ sysv5*)
+ hardcode_libdir_flag_spec=
+ ;;
+ 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.
+libname_spec='lib$name'
+case "$host_os" in
+ aix3*)
+ ;;
+ aix4* | aix5*)
+ ;;
+ amigaos*)
+ ;;
+ beos*)
+ ;;
+ bsdi[45]*)
+ ;;
+ cygwin* | mingw* | pw32*)
+ shrext=.dll
+ ;;
+ darwin* | rhapsody*)
+ shrext=.dylib
+ ;;
+ dgux*)
+ ;;
+ freebsd1*)
+ ;;
+ kfreebsd*-gnu)
+ ;;
+ freebsd*)
+ ;;
+ gnu*)
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case "$host_cpu" in
+ ia64*)
+ shrext=.so
+ ;;
+ hppa*64*)
+ shrext=.sl
+ ;;
+ *)
+ shrext=.sl
+ ;;
+ esac
+ ;;
+ irix5* | irix6* | nonstopux*)
+ 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*)
+ ;;
+ knetbsd*-gnu)
+ ;;
+ netbsd*)
+ ;;
+ newsos6)
+ ;;
+ nto-qnx*)
+ ;;
+ openbsd*)
+ ;;
+ os2*)
+ libname_spec='$name'
+ shrext=.dll
+ ;;
+ osf3* | osf4* | osf5*)
+ ;;
+ sco3.2v5*)
+ ;;
+ solaris*)
+ ;;
+ sunos4*)
+ ;;
+ sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+ ;;
+ sysv4*MP*)
+ ;;
+ uts4*)
+ ;;
+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_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"`
+
+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"
+
+# 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..ab2c16c
--- /dev/null
+++ b/config.sub
@@ -0,0 +1,1609 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+# 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
+# Inc.
+
+timestamp='2006-02-27'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine. It does not imply ALL GNU software can.
+#
+# 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 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., 51 Franklin Street - Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# 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.
+
+
+# Please send patches to <config-patches at gnu.org>. Submit a context
+# diff and a properly formatted ChangeLog entry.
+#
+# 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.
+
+# 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 (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+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-dietlibc | linux-newlib* | linux-uclibc* | \
+ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
+ storm-chaos* | os2-emx* | rtmk-nova*)
+ os=-$maybe_os
+ basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+ ;;
+ *)
+ 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)
+ os=
+ basic_machine=$1
+ ;;
+ -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*)
+ 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 \
+ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+ | am33_2.0 \
+ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
+ | bfin \
+ | c4x | clipper \
+ | d10v | d30v | dlx | dsp16xx \
+ | fr30 | frv \
+ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+ | i370 | i860 | i960 | ia64 \
+ | ip2k | iq2000 \
+ | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \
+ | mips | mipsbe | mipseb | mipsel | mipsle \
+ | mips16 \
+ | mips64 | mips64el \
+ | mips64vr | mips64vrel \
+ | mips64orion | mips64orionel \
+ | mips64vr4100 | mips64vr4100el \
+ | mips64vr4300 | mips64vr4300el \
+ | mips64vr5000 | mips64vr5000el \
+ | mips64vr5900 | mips64vr5900el \
+ | mipsisa32 | mipsisa32el \
+ | mipsisa32r2 | mipsisa32r2el \
+ | mipsisa64 | mipsisa64el \
+ | mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64sb1 | mipsisa64sb1el \
+ | mipsisa64sr71k | mipsisa64sr71kel \
+ | mipstx39 | mipstx39el \
+ | mn10200 | mn10300 \
+ | mt \
+ | msp430 \
+ | nios | nios2 \
+ | ns16k | ns32k \
+ | or32 \
+ | pdp10 | pdp11 | pj | pjl \
+ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
+ | pyramid \
+ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \
+ | sh64 | sh64le \
+ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+ | strongarm \
+ | tahoe | thumb | tic4x | tic80 | tron \
+ | v850 | v850e \
+ | we32k \
+ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \
+ | z8k)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m32c)
+ basic_machine=$basic_machine-unknown
+ ;;
+ m6811 | m68hc11 | m6812 | m68hc12)
+ # Motorola 68HC11/12.
+ basic_machine=$basic_machine-unknown
+ os=-none
+ ;;
+ m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+ ;;
+ ms1)
+ basic_machine=mt-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-* \
+ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
+ | avr-* \
+ | bfin-* | bs2000-* \
+ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
+ | clipper-* | craynv-* | cydra-* \
+ | d10v-* | d30v-* | dlx-* \
+ | elxsi-* \
+ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
+ | h8300-* | h8500-* \
+ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+ | i*86-* | i860-* | i960-* | ia64-* \
+ | ip2k-* | iq2000-* \
+ | m32r-* | m32rle-* \
+ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+ | m88110-* | m88k-* | maxq-* | mcore-* \
+ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+ | mips16-* \
+ | mips64-* | mips64el-* \
+ | mips64vr-* | mips64vrel-* \
+ | mips64orion-* | mips64orionel-* \
+ | mips64vr4100-* | mips64vr4100el-* \
+ | mips64vr4300-* | mips64vr4300el-* \
+ | mips64vr5000-* | mips64vr5000el-* \
+ | mips64vr5900-* | mips64vr5900el-* \
+ | mipsisa32-* | mipsisa32el-* \
+ | mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa64-* | mipsisa64el-* \
+ | mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64sb1-* | mipsisa64sb1el-* \
+ | mipsisa64sr71k-* | mipsisa64sr71kel-* \
+ | mipstx39-* | mipstx39el-* \
+ | mmix-* \
+ | mt-* \
+ | msp430-* \
+ | nios-* | nios2-* \
+ | none-* | np1-* | ns16k-* | ns32k-* \
+ | orion-* \
+ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
+ | pyramid-* \
+ | romp-* | rs6000-* \
+ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \
+ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+ | sparclite-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
+ | tahoe-* | thumb-* \
+ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+ | tron-* \
+ | v850-* | v850e-* | vax-* \
+ | we32k-* \
+ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \
+ | xstormy16-* | xtensa-* \
+ | ymp-* \
+ | z8k-*)
+ ;;
+ m32c-*)
+ ;;
+ # 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
+ ;;
+ aux)
+ basic_machine=m68k-apple
+ os=-aux
+ ;;
+ balance)
+ basic_machine=ns32k-sequent
+ os=-dynix
+ ;;
+ c90)
+ basic_machine=c90-cray
+ os=-unicos
+ ;;
+ 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
+ ;;
+ cr16c)
+ basic_machine=cr16c-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
+ ;;
+ 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'm not sure what "Sysv32" means. Should this be sysv3.2?
+ 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
+ ;;
+ m88k-omron*)
+ basic_machine=m88k-omron
+ ;;
+ magnum | m3230)
+ basic_machine=mips-mips
+ os=-sysv
+ ;;
+ merlin)
+ basic_machine=ns32k-utek
+ os=-sysv
+ ;;
+ mingw32)
+ basic_machine=i386-pc
+ os=-mingw32
+ ;;
+ 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-/'`
+ ;;
+ mvs)
+ basic_machine=i370-ibm
+ os=-mvs
+ ;;
+ 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
+ ;;
+ 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
+ ;;
+ 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) basic_machine=powerpc-unknown
+ ;;
+ ppc-*) 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)
+ 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
+ ;;
+ sei)
+ basic_machine=mips-sei
+ os=-seiux
+ ;;
+ sequent)
+ basic_machine=i386-sequent
+ ;;
+ sh)
+ basic_machine=sh-hitachi
+ os=-hms
+ ;;
+ 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
+ ;;
+ 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
+ ;;
+ tic54x | c54x*)
+ basic_machine=tic54x-unknown
+ os=-coff
+ ;;
+ tic55x | c55x*)
+ basic_machine=tic55x-unknown
+ os=-coff
+ ;;
+ tic6x | c6x*)
+ basic_machine=tic6x-unknown
+ os=-coff
+ ;;
+ 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
+ ;;
+ ymp)
+ basic_machine=ymp-cray
+ os=-unicos
+ ;;
+ z8k-*-coff)
+ basic_machine=z8k-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[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.
+ -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* | -sunos | -sunos[34]*\
+ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+ | -aos* \
+ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+ | -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* \
+ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+ | -mingw32* | -linux-gnu* | -linux-newlib* | -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*)
+ # 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
+ ;;
+ -kaos*)
+ os=-kaos
+ ;;
+ -zvmoe)
+ os=-zvmoe
+ ;;
+ -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
+ *-acorn)
+ os=-riscix1.2
+ ;;
+ arm*-rebel)
+ os=-linux
+ ;;
+ arm*-semi)
+ os=-aout
+ ;;
+ c4x-* | tic4x-*)
+ 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
+ # This also exists in the configure program, but was not the
+ # default.
+ # os=-sunos4
+ ;;
+ m68*-cisco)
+ os=-aout
+ ;;
+ mips*-cisco)
+ os=-elf
+ ;;
+ mips*-*)
+ 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
+ ;;
+ -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..b5d4798
--- /dev/null
+++ b/configure
@@ -0,0 +1,33025 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.59 for the Parma Polyhedra Library 0.9.
+#
+# Report bugs to <ppl-devel at cs.unipr.it>.
+#
+# Copyright (C) 2003 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 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+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; 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
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ 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
+
+ ;;
+ 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
+ { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
+ { (exit 1); exit 1; }; }
+
+ # 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 sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+
+
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "$0" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit 0
+fi
+
+# 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
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL $0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "$0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo"
+fi
+
+
+
+
+tagnames=${tagnames+${tagnames},}CXX
+
+tagnames=${tagnames+${tagnames},}F77
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+ac_config_libobj_dir=.
+cross_compiling=no
+subdirs=
+MFLAGS=
+MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+# Identity of this package.
+PACKAGE_NAME='the Parma Polyhedra Library'
+PACKAGE_TARNAME='ppl'
+PACKAGE_VERSION='0.9'
+PACKAGE_STRING='the Parma Polyhedra Library 0.9'
+PACKAGE_BUGREPORT='ppl-devel at cs.unipr.it'
+
+ac_unique_file="src/Polyhedron_public.cc"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+ac_subdirs_all="$ac_subdirs_all Watchdog"
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INS [...]
+ac_subst_files=''
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# 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.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+ac_prev=
+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
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -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 | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$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 ;;
+
+ -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 ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ 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 ;;
+
+ -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_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=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 ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ 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'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+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
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ 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
+
+
+# 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 its parent.
+ ac_confdir=`(dirname "$0") 2>/dev/null ||
+$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$0" : 'X\(//\)[^/]' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$0" |
+ 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
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null ||
+ { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2
+ { (exit 1); exit 1; }; }
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CXX_set=${CXX+set}
+ac_env_CXX_value=$CXX
+ac_cv_env_CXX_set=${CXX+set}
+ac_cv_env_CXX_value=$CXX
+ac_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_env_CXXFLAGS_value=$CXXFLAGS
+ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set}
+ac_cv_env_CXXFLAGS_value=$CXXFLAGS
+ac_env_CXXCPP_set=${CXXCPP+set}
+ac_env_CXXCPP_value=$CXXCPP
+ac_cv_env_CXXCPP_set=${CXXCPP+set}
+ac_cv_env_CXXCPP_value=$CXXCPP
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+ac_env_F77_set=${F77+set}
+ac_env_F77_value=$F77
+ac_cv_env_F77_set=${F77+set}
+ac_cv_env_F77_value=$F77
+ac_env_FFLAGS_set=${FFLAGS+set}
+ac_env_FFLAGS_value=$FFLAGS
+ac_cv_env_FFLAGS_set=${FFLAGS+set}
+ac_cv_env_FFLAGS_value=$FFLAGS
+
+#
+# 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 0.9 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 \`..']
+
+_ACEOF
+
+ cat <<_ACEOF
+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]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --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]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+_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 0.9:";;
+ esac
+ cat <<\_ACEOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --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
+ check even more run-time assertions
+ --enable-optimization enable compiler optimizations
+ --enable-arch[=ARCH]
+ optimize for architecture ARCH
+ --enable-pch use precompiled headers, if available
+ --enable-coefficients select the type of the coefficients
+ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors
+ --disable-rpath do not hardcode runtime library paths
+ --enable-watchdog build also the Parma Watchdog Library
+ --enable-interfaces enable some or all the library interfaces
+ --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-gnu-ld assume the C compiler uses GNU ld default=no
+ --with-libgmp-prefix[=DIR] search for libgmp in DIR/include and DIR/lib
+ --without-libgmp-prefix don't search for libgmp in includedir and libdir
+ --with-libgmpxx-prefix[=DIR] search for libgmpxx in DIR/include and DIR/lib
+ --without-libgmpxx-prefix don't search for libgmpxx in includedir and libdir
+ --with-gnu-ld assume the C compiler uses GNU ld [default=no]
+ --with-pic try to use only PIC/non-PIC objects [default=use
+ both]
+ --with-tags[=TAGS]
+ include additional configurations [automatic]
+
+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>
+ CPPFLAGS 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
+ F77 Fortran 77 compiler command
+ FFLAGS Fortran 77 compiler flags
+
+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
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
+ test -d $ac_dir || continue
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+ cd $ac_dir
+ # Check for guested configure; otherwise get Cygnus style 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
+ elif test -f $ac_srcdir/configure.ac ||
+ test -f $ac_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\_ACEOF
+the Parma Polyhedra Library configure 0.9
+generated by GNU Autoconf 2.59
+
+Copyright (C) 2003 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 0
+fi
+exec 5>config.log
+cat >&5 <<_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 0.9, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ $ $0 $@
+
+_ACEOF
+{
+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`
+hostinfo = `(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=.
+ echo "PATH: $as_dir"
+done
+
+} >&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_sep=
+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=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+ esac
+ case $ac_pass in
+ 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
+ 2)
+ ac_configure_args1="$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
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ # Get rid of the leading space.
+ ac_sep=" "
+ ;;
+ esac
+ done
+done
+$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
+$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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: Be sure not to use single quotes in there, as some shells,
+# such as our DU 5.0 friend, will then `close' the trap.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ {
+ echo
+
+ cat <<\_ASBOX
+## ---------------- ##
+## Cache variables. ##
+## ---------------- ##
+_ASBOX
+ echo
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+}
+ echo
+
+ cat <<\_ASBOX
+## ----------------- ##
+## Output variables. ##
+## ----------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_vars
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+
+ if test -n "$ac_subst_files"; then
+ cat <<\_ASBOX
+## ------------- ##
+## Output files. ##
+## ------------- ##
+_ASBOX
+ echo
+ for ac_var in $ac_subst_files
+ do
+ eval ac_val=$`echo $ac_var`
+ echo "$ac_var='"'"'$ac_val'"'"'"
+ done | sort
+ echo
+ fi
+
+ if test -s confdefs.h; then
+ cat <<\_ASBOX
+## ----------- ##
+## confdefs.h. ##
+## ----------- ##
+_ASBOX
+ echo
+ sed "/^$/d" confdefs.h | sort
+ echo
+ fi
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal"
+ echo "$as_me: exit $exit_status"
+ } >&5
+ rm -f core *.core &&
+ rm -rf conftest* confdefs* conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >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
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ sed 's/^/| /' "$ac_site_file" >&5
+ . "$ac_site_file"
+ 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.
+ if test -f "$cache_file"; then
+ { echo "$as_me:$LINENO: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:$LINENO: creating cache $cache_file" >&5
+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 `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; 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,)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
+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
+ { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:$LINENO: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:$LINENO: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status.
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`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.
+ *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Minimum autoconf version required.
+
+
+# Make sure the sources are there.
+
+
+# Use Automake.
+am__api_version="1.9"
+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
+ { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&5
+echo "$as_me: error: cannot find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# 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.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+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. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+echo "$as_me:$LINENO: checking whether build environment is sane" >&5
+echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# 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 (
+ 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
+ rm -f conftest.file
+ 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".
+ { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&5
+echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken
+alias in your environment" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ test "$2" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
+Check your system clock" >&5
+echo "$as_me: error: newly created file is older than distributed files!
+Check your system clock" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+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 $. echo might interpret backslashes.
+# By default was `s,x,x', remove it if useless.
+cat <<\_ACEOF >conftest.sed
+s/[\\$]/&&/g;s/;s,x,x,$//
+_ACEOF
+program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
+rm conftest.sed
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
+echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='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.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AWK+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AWK="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AWK=$ac_cv_prog_AWK
+if test -n "$AWK"; then
+ echo "$as_me:$LINENO: result: $AWK" >&5
+echo "${ECHO_T}$AWK" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$AWK" && break
+done
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
+echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
+ { (exit 1); exit 1; }; }
+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='0.9'
+
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE "$PACKAGE"
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define VERSION "$VERSION"
+_ACEOF
+
+# 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"}
+
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+
+# 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.
+
+AMTAR=${AMTAR-"${am_missing_run}tar"}
+
+am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
+
+
+
+
+
+
+
+
+# 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\""
+
+
+# Installation directories.
+docdir='${datadir}/doc/ppl'
+
+
+# Generate a configuration header file.
+ ac_config_headers="$ac_config_headers config.h"
+
+
+ISODATE=`date +%Y-%m-%d`
+
+
+# Check for host type.
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:$LINENO: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+echo "$as_me:$LINENO: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+
+
+
+
+
+
+
+
+# C compiler
+
+
+# Check whether --with-cc or --without-cc was given.
+if test "${with_cc+set}" = set; then
+ withval="$with_cc"
+ CC=$with_cc
+fi;
+
+# C++ compiler
+
+
+# Check whether --with-cxx or --without-cxx was given.
+if test "${with_cxx+set}" = set; then
+ withval="$with_cxx"
+ CXX=$with_cxx
+fi;
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to compile with debug info" >&5
+echo $ECHO_N "checking whether to compile with debug info... $ECHO_C" >&6
+# Check whether --enable-debugging or --disable-debugging was given.
+if test "${enable_debugging+set}" = set; then
+ enableval="$enable_debugging"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ OPT_FLAGS="-g"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-debugging, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for profiling" >&5
+echo $ECHO_N "checking whether to compile for profiling... $ECHO_C" >&6
+# Check whether --enable-profiling or --disable-profiling was given.
+if test "${enable_profiling+set}" = set; then
+ enableval="$enable_profiling"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=1"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-profiling, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to compile for test coverage" >&5
+echo $ECHO_N "checking whether to compile for test coverage... $ECHO_C" >&6
+# Check whether --enable-coverage or --disable-coverage was given.
+if test "${enable_coverage+set}" = set; then
+ enableval="$enable_coverage"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -fprofile-arcs -ftest-coverage"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-coverage, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to enable checking of run-time assertions" >&5
+echo $ECHO_N "checking whether to enable checking of run-time assertions... $ECHO_C" >&6
+# Check whether --enable-assertions or --disable-assertions was given.
+if test "${enable_assertions+set}" = set; then
+ enableval="$enable_assertions"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-assertions, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+enable_assertions=${enableval}
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to enable even more run-time assertions" >&5
+echo $ECHO_N "checking whether to enable even more run-time assertions... $ECHO_C" >&6
+# Check whether --enable-more-assertions or --disable-more-assertions was given.
+if test "${enable_more_assertions+set}" = set; then
+ enableval="$enable_more_assertions"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-more-assertions, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+enable_more_assertions=${enableval}
+
+if test x"$enable_more_assertions" = xyes
+then
+ enable_assertions=yes
+
+cat >>confdefs.h <<\_ACEOF
+#define EXTRA_ROW_DEBUG 1
+_ACEOF
+
+fi
+
+if test x"$enable_assertions" = xno
+then
+
+cat >>confdefs.h <<\_ACEOF
+#define NDEBUG 1
+_ACEOF
+
+ 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
+echo "$as_me:$LINENO: checking whether to enable optimizations" >&5
+echo $ECHO_N "checking whether to enable optimizations... $ECHO_C" >&6
+# Check whether --enable-optimization or --disable-optimization was given.
+if test "${enable_optimization+set}" = set; then
+ enableval="$enable_optimization"
+
+fi;
+case "${enableval}" in
+sspeed)
+ echo "$as_me:$LINENO: result: sspeed" >&5
+echo "${ECHO_T}sspeed" >&6
+ OPT_FLAGS="$OPT_FLAGS -O3 -fomit-frame-pointer"
+ arch=yes
+ ;;
+speed)
+ echo "$as_me:$LINENO: result: speed" >&5
+echo "${ECHO_T}speed" >&6
+ OPT_FLAGS="$OPT_FLAGS -O3"
+ arch=yes
+ ;;
+size)
+ echo "$as_me:$LINENO: result: size" >&5
+echo "${ECHO_T}size" >&6
+ OPT_FLAGS="$OPT_FLAGS -Os"
+ arch=yes
+ ;;
+standard | yes)
+ echo "$as_me:$LINENO: result: standard" >&5
+echo "${ECHO_T}standard" >&6
+ OPT_FLAGS="$OPT_FLAGS -O2"
+ ;;
+mild)
+ echo "$as_me:$LINENO: result: mild" >&5
+echo "${ECHO_T}mild" >&6
+ OPT_FLAGS="$OPT_FLAGS -O1"
+ ;;
+zero)
+ echo "$as_me:$LINENO: result: zero" >&5
+echo "${ECHO_T}zero" >&6
+ OPT_FLAGS="$OPT_FLAGS -O0"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-optimization, needs sspeed, speed, size, standard, mild, zero, yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+
+enableval=$arch
+echo "$as_me:$LINENO: checking for which architecture to optimize" >&5
+echo $ECHO_N "checking for which architecture to optimize... $ECHO_C" >&6
+# Check whether --enable-arch or --disable-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)
+ echo "$as_me:$LINENO: result: $m" >&5
+echo "${ECHO_T}$m" >&6
+ OPT_FLAGS="$OPT_FLAGS -march=$m"
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+ ;;
+ esac
+ ;;
+no)
+ echo "$as_me:$LINENO: result: default" >&5
+echo "${ECHO_T}default" >&6
+ ;;
+*)
+ echo "$as_me:$LINENO: result: $enableval" >&5
+echo "${ECHO_T}$enableval" >&6
+ OPT_FLAGS="$OPT_FLAGS -march=$enableval"
+ ;;
+esac
+
+enableval=no
+echo "$as_me:$LINENO: checking whether to use precompiled headers" >&5
+echo $ECHO_N "checking whether to use precompiled headers... $ECHO_C" >&6
+# Check whether --enable-pch or --disable-pch was given.
+if test "${enable_pch+set}" = set; then
+ enableval="$enable_pch"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ COMP_FLAGS="$COMP_FLAGS -Winvalid-pch"
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-pch, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-pch, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+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"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+enableval=mpz
+echo "$as_me:$LINENO: checking the type of integral values to use as coefficients" >&5
+echo $ECHO_N "checking the type of integral values to use as coefficients... $ECHO_C" >&6
+# Check whether --enable-coefficients or --disable-coefficients was given.
+if test "${enable_coefficients+set}" = set; then
+ enableval="$enable_coefficients"
+
+fi;
+case "${enableval}" in
+native-int8)
+ echo "$as_me:$LINENO: result: native 8 bits integers" >&5
+echo "${ECHO_T}native 8 bits integers" >&6
+ coefficient_kind=native
+ coefficient_bits=8
+ coefficient_mnemonic=nint8
+ ;;
+native-int16)
+ echo "$as_me:$LINENO: result: native 16 bits integers" >&5
+echo "${ECHO_T}native 16 bits integers" >&6
+ coefficient_kind=native
+ coefficient_bits=16
+ coefficient_mnemonic=nint16
+ ;;
+native-int32)
+ echo "$as_me:$LINENO: result: native 32 bits integers" >&5
+echo "${ECHO_T}native 32 bits integers" >&6
+ coefficient_kind=native
+ coefficient_bits=32
+ coefficient_mnemonic=nint32
+ ;;
+native-int64)
+ echo "$as_me:$LINENO: result: native 64 bits integers" >&5
+echo "${ECHO_T}native 64 bits integers" >&6
+ coefficient_kind=native
+ coefficient_bits=64
+ coefficient_mnemonic=nint64
+ ;;
+checked-int8)
+ echo "$as_me:$LINENO: result: checked 8 bits integers" >&5
+echo "${ECHO_T}checked 8 bits integers" >&6
+ coefficient_kind=checked
+ coefficient_bits=8
+ coefficient_mnemonic=int8
+ ;;
+checked-int16)
+ echo "$as_me:$LINENO: result: checked 16 bits integers" >&5
+echo "${ECHO_T}checked 16 bits integers" >&6
+ coefficient_kind=checked
+ coefficient_bits=16
+ coefficient_mnemonic=int16
+ ;;
+checked-int32)
+ echo "$as_me:$LINENO: result: checked 32 bits integers" >&5
+echo "${ECHO_T}checked 32 bits integers" >&6
+ coefficient_kind=checked
+ coefficient_bits=32
+ coefficient_mnemonic=int32
+ ;;
+checked-int64)
+ echo "$as_me:$LINENO: result: checked 64 bits integers" >&5
+echo "${ECHO_T}checked 64 bits integers" >&6
+ coefficient_kind=checked
+ coefficient_bits=64
+ coefficient_mnemonic=int64
+ ;;
+mpz)
+ echo "$as_me:$LINENO: result: GMP mpz" >&5
+echo "${ECHO_T}GMP mpz" >&6
+ coefficient_kind=unbounded
+ coefficient_bits=0
+ coefficient_mnemonic=mpz
+ ;;
+*)
+ { { echo "$as_me:$LINENO: 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" >&5
+echo "$as_me: 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" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+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>"
+
+cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+
+cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define NATIVE_INTEGERS 1
+_ACEOF
+
+elif test x"$coefficient_kind" = xchecked
+then
+ coefficient_type="Parma_Polyhedra_Library::Checked_Number<int${coefficient_bits}_t>"
+ cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_TYPE $coefficient_type
+_ACEOF
+
+ cat >>confdefs.h <<_ACEOF
+#define COEFFICIENT_BITS $coefficient_bits
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define CHECKED_INTEGERS 1
+_ACEOF
+
+elif test x"$coefficient_kind" = xunbounded
+then
+ cat >>confdefs.h <<\_ACEOF
+#define COEFFICIENT_TYPE mpz_class
+_ACEOF
+
+ cat >>confdefs.h <<\_ACEOF
+#define COEFFICIENT_BITS 0
+_ACEOF
+
+
+cat >>confdefs.h <<\_ACEOF
+#define GMP_INTEGERS 1
+_ACEOF
+
+fi
+
+# Allow additions to C and C++ compilation flags
+
+
+# Check whether --with-cflags or --without-cflags was given.
+if test "${with_cflags+set}" = set; then
+ withval="$with_cflags"
+ CFLAGS="$CFLAGS $with_cflags"
+fi;
+
+
+# Check whether --with-cxxflags or --without-cxxflags was given.
+if test "${with_cxxflags+set}" = set; then
+ withval="$with_cxxflags"
+ CXXFLAGS="$CXXFLAGS $with_cxxflags"
+fi;
+
+# Checks for programs.
+echo "$as_me:$LINENO: checking for egrep" >&5
+echo $ECHO_N "checking for egrep... $ECHO_C" >&6
+if test "${ac_cv_prog_egrep+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5
+echo "${ECHO_T}$ac_cv_prog_egrep" >&6
+ EGREP=$ac_cv_prog_egrep
+
+
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="gcc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="${ac_tool_prefix}cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="cc"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_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"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+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
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:$LINENO: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CC="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+
+test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&5
+echo "$as_me: error: no acceptable C compiler found in \$PATH
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out 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.
+echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
+echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+
+# Be careful to initialize this variable, since it used to be cached.
+# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile.
+ac_cv_exeext=
+# b.out is created by i960 compilers.
+for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out
+do
+ test -f "$ac_file" || continue
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj )
+ ;;
+ conftest.$ac_ext )
+ # This is the source file.
+ ;;
+ [ab].out )
+ # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* )
+ ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool,
+ # but it would be cool to find out if it's true. Does anybody
+ # maintain Libtool? --akim.
+ export ac_cv_exeext
+ break;;
+ * )
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
+See \`config.log' for more details." >&5
+echo "$as_me: error: C compiler cannot create executables
+See \`config.log' for more details." >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:$LINENO: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:$LINENO: checking for suffix of executables" >&5
+echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 | *.o | *.obj ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:$LINENO: checking for suffix of object files" >&5
+echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute suffix of object files: cannot compile
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$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
+echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* 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 -std1 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 -std1. */
+int osf4_cc_array ['\x00' == 0 ? 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
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:$LINENO: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f 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
+DEPDIR="${am__leading_dot}deps"
+
+ ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
+echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+
+
+echo "$as_me:$LINENO: result: $_am_result" >&5
+echo "${ECHO_T}$_am_result" >&6
+rm -f confinc confmf
+
+# Check whether --enable-dependency-tracking or --disable-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='\'
+fi
+
+
+if test "x$enable_dependency_tracking" != xno; then
+ AMDEP_TRUE=
+ AMDEP_FALSE='#'
+else
+ AMDEP_TRUE='#'
+ AMDEP_FALSE=
+fi
+
+
+
+
+depcc="$CC" am_compiler_list=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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
+echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+ac_ext=cc
+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 -n "$ac_tool_prefix"; then
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+ echo "$as_me:$LINENO: result: $CXX" >&5
+echo "${ECHO_T}$CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CXX" && break
+ done
+fi
+if test -z "$CXX"; then
+ ac_ct_CXX=$CXX
+ for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_CXX="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+ echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5
+echo "${ECHO_T}$ac_ct_CXX" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CXX" && break
+done
+test -n "$ac_ct_CXX" || ac_ct_CXX="g++"
+
+ CXX=$ac_ct_CXX
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:$LINENO:" \
+ "checking for C++ compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6
+if test "${ac_cv_cxx_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6
+GXX=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+CXXFLAGS="-g"
+echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5
+echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cxx_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cxx_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_cxx_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5
+echo "${ECHO_T}$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
+for ac_declaration in \
+ '' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+#include <stdlib.h>
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+continue
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+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=
+
+echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
+echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6
+if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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'.
+ 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
+ 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 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ 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
+ ;;
+ none) break ;;
+ esac
+ # 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.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} 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
+echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5
+echo "${ECHO_T}$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
+
+
+ac_ext=cc
+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
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\_ACEOF
+all:
+ @echo 'ac_maketemp="$(MAKE)"'
+_ACEOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+# 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.
+echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
+echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_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
+ ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+ break 3
+ fi
+ fi
+ done
+ done
+ ;;
+esac
+done
+
+
+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. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:$LINENO: result: $INSTALL" >&5
+echo "${ECHO_T}$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'
+
+
+# Check for Perl.
+# Extract the first word of "perl", so it can be a program name with args.
+set dummy perl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_PERL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_path_PERL" && ac_cv_path_PERL="no"
+ ;;
+esac
+fi
+PERL=$ac_cv_path_PERL
+
+if test -n "$PERL"; then
+ echo "$as_me:$LINENO: result: $PERL" >&5
+echo "${ECHO_T}$PERL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+
+
+
+if test x"$PERL" != xno; then
+ HAVE_PERL_TRUE=
+ HAVE_PERL_FALSE='#'
+else
+ HAVE_PERL_TRUE='#'
+ HAVE_PERL_FALSE=
+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
+
+
+echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset x;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *ccp;
+ char **p;
+ /* 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";
+ ccp = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++ccp;
+ p = (char**) ccp;
+ ccp = (char const *const *) p;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 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 saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_const=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\_ACEOF
+#define const
+_ACEOF
+
+fi
+
+echo "$as_me:$LINENO: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
+if test "${ac_cv_c_bigendian+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # See if sys/param.h defines the BYTE_ORDER macro.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ # It does; now see whether it defined to BIG_ENDIAN or not.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_bigendian=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_bigendian=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+# It does not; compile a test program.
+if test "$cross_compiling" = yes; then
+ # try to guess the endianness by grepping values into an object file
+ ac_cv_c_bigendian=unknown
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
+int
+main ()
+{
+ _ascii (); _ebcdic ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; 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
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+int
+main ()
+{
+ /* Are we little or big endian? From Harbison&Steele. */
+ union
+ {
+ long l;
+ char c[sizeof (long)];
+ } u;
+ u.l = 1;
+ exit (u.c[sizeof (long) - 1] == 1);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_bigendian=no
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6
+case $ac_cv_c_bigendian in
+ yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define WORDS_BIGENDIAN 1
+_ACEOF
+ ;;
+ no)
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+echo "$as_me: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+
+
+# Checks for C type sizes.
+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
+echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+echo "$as_me:$LINENO: result: $CPP" >&5
+echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+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
+
+
+echo "$as_me:$LINENO: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_header_stdc=no
+fi
+rm -f 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ctype.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))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_header_stdc=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define STDC_HEADERS 1
+_ACEOF
+
+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=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+echo "$as_me:$LINENO: checking for int" >&5
+echo $ECHO_N "checking for int... $ECHO_C" >&6
+if test "${ac_cv_type_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((int *) 0)
+ return 0;
+if (sizeof (int))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_int=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5
+echo "${ECHO_T}$ac_cv_type_int" >&6
+
+echo "$as_me:$LINENO: checking size of int" >&5
+echo $ECHO_N "checking size of int... $ECHO_C" >&6
+if test "${ac_cv_sizeof_int+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_int" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (int))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_int=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (int)); }
+unsigned long ulongval () { return (long) (sizeof (int)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (int))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (int))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_int=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (int), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_int=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5
+echo "${ECHO_T}$ac_cv_sizeof_int" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long" >&5
+echo $ECHO_N "checking for long... $ECHO_C" >&6
+if test "${ac_cv_type_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long *) 0)
+ return 0;
+if (sizeof (long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long" >&5
+echo "${ECHO_T}$ac_cv_type_long" >&6
+
+echo "$as_me:$LINENO: checking size of long" >&5
+echo $ECHO_N "checking size of long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (long)); }
+unsigned long ulongval () { return (long) (sizeof (long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long long" >&5
+echo $ECHO_N "checking for long long... $ECHO_C" >&6
+if test "${ac_cv_type_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long long *) 0)
+ return 0;
+if (sizeof (long long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_long_long" >&6
+
+echo "$as_me:$LINENO: checking size of long long" >&5
+echo $ECHO_N "checking size of long long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long_long" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (long long)); }
+unsigned long ulongval () { return (long) (sizeof (long long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned" >&5
+echo $ECHO_N "checking for unsigned... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned *) 0)
+ return 0;
+if (sizeof (unsigned))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned" >&5
+echo $ECHO_N "checking size of unsigned... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_unsigned" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (unsigned))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (unsigned))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (unsigned))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_unsigned=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_unsigned=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED $ac_cv_sizeof_unsigned
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned long" >&5
+echo $ECHO_N "checking for unsigned long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned long *) 0)
+ return 0;
+if (sizeof (unsigned long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned long" >&5
+echo $ECHO_N "checking size of unsigned long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_unsigned_long" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned long)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (unsigned long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (unsigned long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (unsigned long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_unsigned_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_unsigned_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG $ac_cv_sizeof_unsigned_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for unsigned long long" >&5
+echo $ECHO_N "checking for unsigned long long... $ECHO_C" >&6
+if test "${ac_cv_type_unsigned_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((unsigned long long *) 0)
+ return 0;
+if (sizeof (unsigned long long))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_unsigned_long_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_unsigned_long_long=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_type_unsigned_long_long" >&6
+
+echo "$as_me:$LINENO: checking size of unsigned long long" >&5
+echo $ECHO_N "checking size of unsigned long long... $ECHO_C" >&6
+if test "${ac_cv_sizeof_unsigned_long_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_unsigned_long_long" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (unsigned long long))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_unsigned_long_long=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (unsigned long long)); }
+unsigned long ulongval () { return (long) (sizeof (unsigned long long)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (unsigned long long))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (unsigned long long))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (unsigned long long))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_unsigned_long_long=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (unsigned long long), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_unsigned_long_long=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_unsigned_long_long" >&5
+echo "${ECHO_T}$ac_cv_sizeof_unsigned_long_long" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_UNSIGNED_LONG_LONG $ac_cv_sizeof_unsigned_long_long
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_size_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+
+echo "$as_me:$LINENO: checking size of size_t" >&5
+echo $ECHO_N "checking size of size_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_size_t" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (size_t))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_size_t=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (size_t)); }
+unsigned long ulongval () { return (long) (sizeof (size_t)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (size_t))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (size_t))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (size_t))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_size_t=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (size_t), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_size_t=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_size_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_size_t" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for float" >&5
+echo $ECHO_N "checking for float... $ECHO_C" >&6
+if test "${ac_cv_type_float+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((float *) 0)
+ return 0;
+if (sizeof (float))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_float=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_float=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_float" >&5
+echo "${ECHO_T}$ac_cv_type_float" >&6
+
+echo "$as_me:$LINENO: checking size of float" >&5
+echo $ECHO_N "checking size of float... $ECHO_C" >&6
+if test "${ac_cv_sizeof_float+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_float" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (float))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_float=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (float)); }
+unsigned long ulongval () { return (long) (sizeof (float)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (float))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (float))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (float))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_float=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (float), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_float=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_float" >&5
+echo "${ECHO_T}$ac_cv_sizeof_float" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_FLOAT $ac_cv_sizeof_float
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for double" >&5
+echo $ECHO_N "checking for double... $ECHO_C" >&6
+if test "${ac_cv_type_double+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((double *) 0)
+ return 0;
+if (sizeof (double))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_double=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_double=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_double" >&5
+echo "${ECHO_T}$ac_cv_type_double" >&6
+
+echo "$as_me:$LINENO: checking size of double" >&5
+echo $ECHO_N "checking size of double... $ECHO_C" >&6
+if test "${ac_cv_sizeof_double+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_double" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (double))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_double=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (double)); }
+unsigned long ulongval () { return (long) (sizeof (double)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (double))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (double))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (double))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_double=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (double), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_double=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_double" >&5
+echo "${ECHO_T}$ac_cv_sizeof_double" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_DOUBLE $ac_cv_sizeof_double
+_ACEOF
+
+
+echo "$as_me:$LINENO: checking for long double" >&5
+echo $ECHO_N "checking for long double... $ECHO_C" >&6
+if test "${ac_cv_type_long_double+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((long double *) 0)
+ return 0;
+if (sizeof (long double))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_long_double=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_long_double=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_long_double" >&5
+echo "${ECHO_T}$ac_cv_type_long_double" >&6
+
+echo "$as_me:$LINENO: checking size of long double" >&5
+echo $ECHO_N "checking size of long double... $ECHO_C" >&6
+if test "${ac_cv_sizeof_long_double+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_long_double" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (long double))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_long_double=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+long longval () { return (long) (sizeof (long double)); }
+unsigned long ulongval () { return (long) (sizeof (long double)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (long double))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (long double))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (long double))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_long_double=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (long double), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_long_double=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_double" >&5
+echo "${ECHO_T}$ac_cv_sizeof_long_double" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double
+_ACEOF
+
+
+
+# Use C++ for the remaining checks.
+ac_ext=cc
+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_ext=cc
+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=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+echo "$as_me:$LINENO: checking for the possibility to control the FPU" >&5
+echo $ECHO_N "checking for the possibility to control the FPU... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main() {
+#if i386
+#elif defined(HAVE_FENV_H)
+#elif sparc && defined( HAVE_IEEEFP_H)
+#else
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ac_cv_can_control_fpu=1
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cv_can_control_fpu=0
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext,
+
+
+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
+
+ac_ext=cc
+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
+
+
+
+# Detect the binary format used by C++ floats.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cc
+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
+
+
+echo "$as_me:$LINENO: checking the binary format of C++ floats" >&5
+echo $ECHO_N "checking the binary format of C++ floats... $ECHO_C" >&6
+ac_cxx_float_binary_format=unknown
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<float>::is_iec559
+ && (convert(0xaaacccaaUL)
+ == -3.069535185924732179074680971098132431507110595703125e-13
+ && convert(0xcccaaaccUL)
+ == -106255968)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_FLOAT_BINARY_FORMAT float_ieee754_single
+_ACEOF
+
+ ac_cxx_float_binary_format="IEEE754 Single Precision"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $ac_cxx_float_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_float_binary_format" >&6
+
+if test x"$ac_cxx_float_binary_format" = x"unknown"
+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=cc
+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=cc
+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
+
+
+echo "$as_me:$LINENO: checking the binary format of C++ doubles" >&5
+echo $ECHO_N "checking the binary format of C++ doubles... $ECHO_C" >&6
+ac_cxx_double_binary_format=unknown
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647e-103
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_DOUBLE_BINARY_FORMAT float_ieee754_double
+_ACEOF
+
+ ac_cxx_double_binary_format="IEEE754 Double Precision"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+echo "$as_me:$LINENO: result: $ac_cxx_double_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_double_binary_format" >&6
+
+if test x"$ac_cxx_double_binary_format" = x"unknown"
+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=cc
+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=cc
+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
+
+
+echo "$as_me:$LINENO: checking the binary format of C++ long doubles" >&5
+echo $ECHO_N "checking the binary format of C++ long doubles... $ECHO_C" >&6
+ac_cxx_long_double_binary_format=unknown
+
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+ == -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034971013793 [...]
+ && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+ == -3.2343499084336735697883624337582367014013792003863104780702304912017160945762080887330922093527110817635309731394394027547210062178890319023095669053441067666970505933558514051896941259661008015375938113204938505791529386797054658707886845235185418061587914083787185969361328546834255817542052425946141924658766401026284322468976745836497454676411392342071395848101018687729153124540755822652406871842792438612173516670599208782361645064732617977033939815107992280307781523996574 [...]
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+_ACEOF
+
+ ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -8.5585565388510043474134185399390263e-1644L
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -1.245145811075115522107964569349668e+986L)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_quad
+_ACEOF
+
+ ac_cxx_long_double_binary_format="IEEE754 Quad Precision"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -7.604854094366020338337599887587800202175513745285694296699118737579061822543271195468213752945697068626341230960061791319756014599393179237494607606117559455091592495531339152856677735299681614113855047309039978381765251689655330467878879653297684753038610775075912700489795099693753075187209767515639593721823446001374821995460346508811516182804821576375433157503444723668976504567458418892711612877008293336291456723718701753008252854005800263180027419214648596175836662547627167 [...]
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797 [...]
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+_ACEOF
+
+ ac_cxx_long_double_binary_format="Intel Double-Extended"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647e-103
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+cat >>confdefs.h <<\_ACEOF
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_ieee754_double
+_ACEOF
+
+ ac_cxx_long_double_binary_format="IEEE754 Double Precision"
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+
+echo "$as_me:$LINENO: result: $ac_cxx_long_double_binary_format" >&5
+echo "${ECHO_T}$ac_cxx_long_double_binary_format" >&6
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+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=cc
+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 flexible arrays.
+
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+ac_ext=cc
+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
+
+
+echo "$as_me:$LINENO: checking whether the C++ compiler supports flexible arrays" >&5
+echo $ECHO_N "checking whether the C++ compiler supports flexible arrays... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cxx_supports_flexible_arrays=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#include <new>
+#include <cstddef>
+#include <cstdlib>
+
+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;
+ exit(0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ac_cxx_supports_flexible_arrays=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cxx_supports_flexible_arrays=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+if test x"$ac_cxx_supports_flexible_arrays" = xyes
+then
+ value=1
+else
+ value=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define CXX_SUPPORTS_FLEXIBLE_ARRAYS $value
+_ACEOF
+
+
+ac_ext=cc
+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=cc
+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
+
+
+echo "$as_me:$LINENO: checking whether the C++ compiler supports __attribute__ ((weak))" >&5
+echo $ECHO_N "checking whether the C++ compiler supports __attribute__ ((weak))... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+void
+foo() __attribute__ ((weak));
+
+void
+foo() {
+}
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ac_cxx_supports_attribute_weak=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cxx_supports_attribute_weak=no
+fi
+rm -f 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 CXX_SUPPORTS_ATTRIBUTE_WEAK $value
+_ACEOF
+
+
+ac_ext=cc
+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 the availability of C library functions in C++.
+echo "$as_me:$LINENO: checking whether ffs is declared" >&5
+echo $ECHO_N "checking whether ffs is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_ffs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <strings.h>
+
+int
+main ()
+{
+#ifndef ffs
+ char *p = (char *) ffs;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_ffs=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_ffs=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_ffs" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ffs" >&6
+if test $ac_cv_have_decl_ffs = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFS 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FFS 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether getenv is declared" >&5
+echo $ECHO_N "checking whether getenv is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_getenv+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef getenv
+ char *p = (char *) getenv;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_getenv=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_getenv=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_getenv" >&5
+echo "${ECHO_T}$ac_cv_have_decl_getenv" >&6
+if test $ac_cv_have_decl_getenv = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_GETENV 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtof is declared" >&5
+echo $ECHO_N "checking whether strtof is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtof+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtof
+ char *p = (char *) strtof;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtof=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtof=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtof" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtof" >&6
+if test $ac_cv_have_decl_strtof = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtod is declared" >&5
+echo $ECHO_N "checking whether strtod is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtod+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtod
+ char *p = (char *) strtod;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtod=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtod=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtod" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtod" >&6
+if test $ac_cv_have_decl_strtod = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOD 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOD 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtold is declared" >&5
+echo $ECHO_N "checking whether strtold is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtold+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtold
+ char *p = (char *) strtold;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtold=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtold=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtold" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtold" >&6
+if test $ac_cv_have_decl_strtold = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLD 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLD 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtoll is declared" >&5
+echo $ECHO_N "checking whether strtoll is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtoll+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtoll
+ char *p = (char *) strtoll;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtoll=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtoll=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoll" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoll" >&6
+if test $ac_cv_have_decl_strtoll = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOLL 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether strtoull is declared" >&5
+echo $ECHO_N "checking whether strtoull is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_strtoull+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cstdlib>
+
+int
+main ()
+{
+#ifndef strtoull
+ char *p = (char *) strtoull;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_strtoull=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_strtoull=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_strtoull" >&5
+echo "${ECHO_T}$ac_cv_have_decl_strtoull" >&6
+if test $ac_cv_have_decl_strtoull = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_STRTOULL 0
+_ACEOF
+
+
+fi
+
+
+echo "$as_me:$LINENO: checking whether fma is declared" >&5
+echo $ECHO_N "checking whether fma is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fma+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef fma
+ char *p = (char *) fma;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fma=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fma=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fma" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fma" >&6
+if test $ac_cv_have_decl_fma = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMA 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMA 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether fmaf is declared" >&5
+echo $ECHO_N "checking whether fmaf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fmaf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef fmaf
+ char *p = (char *) fmaf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fmaf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fmaf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmaf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fmaf" >&6
+if test $ac_cv_have_decl_fmaf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether fmal is declared" >&5
+echo $ECHO_N "checking whether fmal is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_fmal+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef fmal
+ char *p = (char *) fmal;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_fmal=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_fmal=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_fmal" >&5
+echo "${ECHO_T}$ac_cv_have_decl_fmal" >&6
+if test $ac_cv_have_decl_fmal = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAL 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_FMAL 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether rintf is declared" >&5
+echo $ECHO_N "checking whether rintf is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_rintf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef rintf
+ char *p = (char *) rintf;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_rintf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_rintf=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintf" >&5
+echo "${ECHO_T}$ac_cv_have_decl_rintf" >&6
+if test $ac_cv_have_decl_rintf = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTF 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTF 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether rintl is declared" >&5
+echo $ECHO_N "checking whether rintl is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_rintl+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <cmath>
+
+int
+main ()
+{
+#ifndef rintl
+ char *p = (char *) rintl;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_rintl=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_rintl=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_rintl" >&5
+echo "${ECHO_T}$ac_cv_have_decl_rintl" >&6
+if test $ac_cv_have_decl_rintl = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTL 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RINTL 0
+_ACEOF
+
+
+fi
+
+
+
+# Checks for the availability of "fast" integral types.
+echo "$as_me:$LINENO: checking for int_fast16_t" >&5
+echo $ECHO_N "checking for int_fast16_t... $ECHO_C" >&6
+if test "${ac_cv_type_int_fast16_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((int_fast16_t *) 0)
+ return 0;
+if (sizeof (int_fast16_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_int_fast16_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int_fast16_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int_fast16_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast16_t" >&6
+if test $ac_cv_type_int_fast16_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST16_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for int_fast32_t" >&5
+echo $ECHO_N "checking for int_fast32_t... $ECHO_C" >&6
+if test "${ac_cv_type_int_fast32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((int_fast32_t *) 0)
+ return 0;
+if (sizeof (int_fast32_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_int_fast32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int_fast32_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast32_t" >&6
+if test $ac_cv_type_int_fast32_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST32_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for int_fast64_t" >&5
+echo $ECHO_N "checking for int_fast64_t... $ECHO_C" >&6
+if test "${ac_cv_type_int_fast64_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((int_fast64_t *) 0)
+ return 0;
+if (sizeof (int_fast64_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_int_fast64_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_int_fast64_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_int_fast64_t" >&5
+echo "${ECHO_T}$ac_cv_type_int_fast64_t" >&6
+if test $ac_cv_type_int_fast64_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_INT_FAST64_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for uint_fast16_t" >&5
+echo $ECHO_N "checking for uint_fast16_t... $ECHO_C" >&6
+if test "${ac_cv_type_uint_fast16_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((uint_fast16_t *) 0)
+ return 0;
+if (sizeof (uint_fast16_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_uint_fast16_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uint_fast16_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast16_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast16_t" >&6
+if test $ac_cv_type_uint_fast16_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST16_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for uint_fast32_t" >&5
+echo $ECHO_N "checking for uint_fast32_t... $ECHO_C" >&6
+if test "${ac_cv_type_uint_fast32_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((uint_fast32_t *) 0)
+ return 0;
+if (sizeof (uint_fast32_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_uint_fast32_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uint_fast32_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast32_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast32_t" >&6
+if test $ac_cv_type_uint_fast32_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST32_T 1
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking for uint_fast64_t" >&5
+echo $ECHO_N "checking for uint_fast64_t... $ECHO_C" >&6
+if test "${ac_cv_type_uint_fast64_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+int
+main ()
+{
+if ((uint_fast64_t *) 0)
+ return 0;
+if (sizeof (uint_fast64_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_uint_fast64_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_uint_fast64_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_uint_fast64_t" >&5
+echo "${ECHO_T}$ac_cv_type_uint_fast64_t" >&6
+if test $ac_cv_type_uint_fast64_t = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_UINT_FAST64_T 1
+_ACEOF
+
+
+fi
+
+
+# Must link everything with libm.
+extra_libraries="${extra_libraries} -lm"
+
+# GMP library
+
+
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-gnu-ld or --without-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;
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ echo "$as_me:$LINENO: checking for ld used by GCC" >&5
+echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&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.
+ [\\/]* | [A-Za-z]:[\\/]*)
+ re_direlt='/[^/][^/]*/\.\./'
+ # Canonicalize the path 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
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${acl_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_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="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$acl_cv_path_LD"
+if test -n "$LD"; then
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${acl_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac
+fi
+echo "$as_me:$LINENO: result: $acl_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6
+with_gnu_ld=$acl_cv_prog_gnu_ld
+
+
+
+
+ echo "$as_me:$LINENO: checking for shared library run path origin" >&5
+echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6
+if test "${acl_cv_rpath+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+
+fi
+echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5
+echo "${ECHO_T}$acl_cv_rpath" >&6
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ # Check whether --enable-rpath or --disable-rpath was given.
+if test "${enable_rpath+set}" = set; then
+ enableval="$enable_rpath"
+ :
+else
+ enable_rpath=yes
+fi;
+
+
+if test -n "$with_libgmpxx_prefix" && test -z "$with_libgmp_prefix"; then
+ with_libgmp_prefix="$with_libgmpxx_prefix"
+else
+ if test -n "$with_libgmp_prefix" && test -z "$with_libgmpxx_prefix"; then
+ with_libgmpxx_prefix="$with_libgmp_prefix"
+ fi
+fi
+
+
+
+
+
+
+ echo "$as_me:$LINENO: checking how to link with libgmp" >&5
+echo $ECHO_N "checking how to link with libgmp... $ECHO_C" >&6
+if test "${ac_cv_libgmp_libs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libgmp-prefix or --without-libgmp-prefix was given.
+if test "${with_libgmp_prefix+set}" = set; then
+ withval="$with_libgmp_prefix"
+
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+
+fi;
+ LIBGMP=
+ LTLIBGMP=
+ INCGMP=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='gmp '
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBGMP="${LIBGMP}${LIBGMP:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBGMP; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$hardcode_direct" = yes; then
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBGMP; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBGMP="${LIBGMP}${LIBGMP:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$found_so"
+ else
+ LIBGMP="${LIBGMP}${LIBGMP:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$found_a"
+ else
+ LIBGMP="${LIBGMP}${LIBGMP:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCGMP; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCGMP="${INCGMP}${INCGMP:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBGMP; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBGMP="${LIBGMP}${LIBGMP:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBGMP; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$dep"
+ LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBGMP="${LIBGMP}${LIBGMP:+ }-l$name"
+ LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBGMP="${LIBGMP}${LIBGMP:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBGMP="${LTLIBGMP}${LTLIBGMP:+ }-R$found_dir"
+ done
+ fi
+
+ ac_cv_libgmp_libs="$LIBGMP"
+ ac_cv_libgmp_ltlibs="$LTLIBGMP"
+ ac_cv_libgmp_cppflags="$INCGMP"
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_libgmp_libs" >&5
+echo "${ECHO_T}$ac_cv_libgmp_libs" >&6
+ LIBGMP="$ac_cv_libgmp_libs"
+ LTLIBGMP="$ac_cv_libgmp_ltlibs"
+ INCGMP="$ac_cv_libgmp_cppflags"
+
+ for element in $INCGMP; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+
+ HAVE_LIBGMP=yes
+
+
+
+
+
+
+
+
+
+ echo "$as_me:$LINENO: checking how to link with libgmpxx" >&5
+echo $ECHO_N "checking how to link with libgmpxx... $ECHO_C" >&6
+if test "${ac_cv_libgmpxx_libs+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+
+
+
+ use_additional=yes
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+
+# Check whether --with-libgmpxx-prefix or --without-libgmpxx-prefix was given.
+if test "${with_libgmpxx_prefix+set}" = set; then
+ withval="$with_libgmpxx_prefix"
+
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+
+fi;
+ LIBGMPXX=
+ LTLIBGMPXX=
+ INCGMPXX=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='gmpxx gmp'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }$value"
+ else
+ :
+ fi
+ else
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIBGMPXX; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+ else
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ if test "$hardcode_direct" = yes; then
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ haveit=
+ for x in $LDFLAGS $LIBGMPXX; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_so"
+ else
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$found_a"
+ else
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$found_dir -l$name"
+ fi
+ fi
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INCGMPXX; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ INCGMPXX="${INCGMPXX}${INCGMPXX:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ if test -n "$found_la"; then
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIBGMPXX; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIBGMPXX; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$dep"
+ LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }-l$name"
+ LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag"
+ else
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIBGMPXX="${LIBGMPXX}${LIBGMPXX:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ for found_dir in $ltrpathdirs; do
+ LTLIBGMPXX="${LTLIBGMPXX}${LTLIBGMPXX:+ }-R$found_dir"
+ done
+ fi
+
+ ac_cv_libgmpxx_libs="$LIBGMPXX"
+ ac_cv_libgmpxx_ltlibs="$LTLIBGMPXX"
+ ac_cv_libgmpxx_cppflags="$INCGMPXX"
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_libgmpxx_libs" >&5
+echo "${ECHO_T}$ac_cv_libgmpxx_libs" >&6
+ LIBGMPXX="$ac_cv_libgmpxx_libs"
+ LTLIBGMPXX="$ac_cv_libgmpxx_ltlibs"
+ INCGMPXX="$ac_cv_libgmpxx_cppflags"
+
+ for element in $INCGMPXX; do
+ haveit=
+ for x in $CPPFLAGS; do
+
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ eval x=\"$x\"
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
+ fi
+ done
+
+
+
+ HAVE_LIBGMPXX=yes
+
+
+
+
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $LIBGMPXX"
+ac_ext=cc
+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
+
+
+echo "$as_me:$LINENO: checking for the GMP library version 4.1.3 or above" >&5
+echo $ECHO_N "checking for the GMP library version 4.1.3 or above... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cv_have_gmp=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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)
+#error "GMP version 4.1.3 or higher is required"
+#endif
+
+int main() {
+ mpz_class n("3141592653589793238462643383279502884");
+ return 0;
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ac_cv_have_gmp=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cv_have_gmp=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+have_gmp=${ac_cv_have_gmp}
+
+if test x"$ac_cv_have_gmp" = xyes
+then
+
+echo "$as_me:$LINENO: checking for mp_limb_t" >&5
+echo $ECHO_N "checking for mp_limb_t... $ECHO_C" >&6
+if test "${ac_cv_type_mp_limb_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+if ((mp_limb_t *) 0)
+ return 0;
+if (sizeof (mp_limb_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_mp_limb_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_type_mp_limb_t=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_type_mp_limb_t" >&5
+echo "${ECHO_T}$ac_cv_type_mp_limb_t" >&6
+
+echo "$as_me:$LINENO: checking size of mp_limb_t" >&5
+echo $ECHO_N "checking size of mp_limb_t... $ECHO_C" >&6
+if test "${ac_cv_sizeof_mp_limb_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$ac_cv_type_mp_limb_t" = yes; then
+ # The cast to unsigned long 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.
+ if test "$cross_compiling" = yes; then
+ # Depending upon the size, compute the lo and hi bounds.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) >= 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=0 ac_mid=0
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr $ac_mid + 1`
+ if test $ac_lo -le $ac_mid; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) < 0)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=-1 ac_mid=-1
+ while :; do
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) >= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_lo=$ac_mid; break
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_hi=`expr '(' $ac_mid ')' - 1`
+ if test $ac_mid -le $ac_hi; then
+ ac_lo= ac_hi=
+ break
+ fi
+ ac_mid=`expr 2 '*' $ac_mid`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ done
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo= ac_hi=
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+# Binary search between lo and hi bounds.
+while test "x$ac_lo" != "x$ac_hi"; do
+ ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo`
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static int test_array [1 - 2 * !(((long) (sizeof (mp_limb_t))) <= $ac_mid)];
+test_array [0] = 0
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_hi=$ac_mid
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_lo=`expr '(' $ac_mid ')' + 1`
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+done
+case $ac_lo in
+?*) ac_cv_sizeof_mp_limb_t=$ac_lo;;
+'') { { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; } ;;
+esac
+else
+ if test "$cross_compiling" = yes; then
+ { { echo "$as_me:$LINENO: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot run test program while cross compiling
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+long longval () { return (long) (sizeof (mp_limb_t)); }
+unsigned long ulongval () { return (long) (sizeof (mp_limb_t)); }
+#include <stdio.h>
+#include <stdlib.h>
+int
+main ()
+{
+
+ FILE *f = fopen ("conftest.val", "w");
+ if (! f)
+ exit (1);
+ if (((long) (sizeof (mp_limb_t))) < 0)
+ {
+ long i = longval ();
+ if (i != ((long) (sizeof (mp_limb_t))))
+ exit (1);
+ fprintf (f, "%ld\n", i);
+ }
+ else
+ {
+ unsigned long i = ulongval ();
+ if (i != ((long) (sizeof (mp_limb_t))))
+ exit (1);
+ fprintf (f, "%lu\n", i);
+ }
+ exit (ferror (f) || fclose (f) != 0);
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_sizeof_mp_limb_t=`cat conftest.val`
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+{ { echo "$as_me:$LINENO: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&5
+echo "$as_me: error: cannot compute sizeof (mp_limb_t), 77
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.val
+else
+ ac_cv_sizeof_mp_limb_t=0
+fi
+fi
+echo "$as_me:$LINENO: result: $ac_cv_sizeof_mp_limb_t" >&5
+echo "${ECHO_T}$ac_cv_sizeof_mp_limb_t" >&6
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_MP_LIMB_T $ac_cv_sizeof_mp_limb_t
+_ACEOF
+
+
+
+echo "$as_me:$LINENO: checking whether GMP has been compiled with support for exceptions" >&5
+echo $ECHO_N "checking whether GMP has been compiled with support for exceptions... $ECHO_C" >&6
+if test "$cross_compiling" = yes; then
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cv_gmp_supports_exceptions=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ac_cv_gmp_supports_exceptions=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ac_cv_gmp_supports_exceptions=no
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext 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 GMP_SUPPORTS_EXCEPTIONS $value
+_ACEOF
+
+
+fi
+
+ac_ext=cc
+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
+
+LIBS="$ac_save_LIBS"
+
+gmp_library_option="$LTLIBGMPXX"
+
+
+if test x"$have_gmp" = xno
+then
+ { { echo "$as_me:$LINENO: 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." >&5
+echo "$as_me: 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." >&2;}
+ { (exit 1); exit 1; }; }
+else
+ if test x"$have_gmpxx" = xno
+ then
+ { { echo "$as_me:$LINENO: 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." >&5
+echo "$as_me: 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." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+echo "$as_me:$LINENO: checking for __mpz_struct._mp_alloc" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_alloc... $ECHO_C" >&6
+if test "${ac_cv_member___mpz_struct__mp_alloc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (ac_aggr._mp_alloc)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member___mpz_struct__mp_alloc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (sizeof ac_aggr._mp_alloc)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member___mpz_struct__mp_alloc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member___mpz_struct__mp_alloc=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_alloc" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_alloc" >&6
+if test $ac_cv_member___mpz_struct__mp_alloc = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_ALLOC 1
+_ACEOF
+
+
+else
+ gmp_has_changes=yes
+fi
+echo "$as_me:$LINENO: checking for __mpz_struct._mp_size" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_size... $ECHO_C" >&6
+if test "${ac_cv_member___mpz_struct__mp_size+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (ac_aggr._mp_size)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member___mpz_struct__mp_size=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (sizeof ac_aggr._mp_size)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member___mpz_struct__mp_size=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member___mpz_struct__mp_size=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_size" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_size" >&6
+if test $ac_cv_member___mpz_struct__mp_size = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE___MPZ_STRUCT__MP_SIZE 1
+_ACEOF
+
+
+else
+ gmp_has_changes=yes
+fi
+echo "$as_me:$LINENO: checking for __mpz_struct._mp_d" >&5
+echo $ECHO_N "checking for __mpz_struct._mp_d... $ECHO_C" >&6
+if test "${ac_cv_member___mpz_struct__mp_d+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (ac_aggr._mp_d)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member___mpz_struct__mp_d=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gmp.h>
+
+int
+main ()
+{
+static __mpz_struct ac_aggr;
+if (sizeof ac_aggr._mp_d)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_member___mpz_struct__mp_d=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_member___mpz_struct__mp_d=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_member___mpz_struct__mp_d" >&5
+echo "${ECHO_T}$ac_cv_member___mpz_struct__mp_d" >&6
+if test $ac_cv_member___mpz_struct__mp_d = yes; 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
+ { { echo "$as_me:$LINENO: 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." >&5
+echo "$as_me: 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." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+extra_includes="${extra_includes}${extra_includes:+ }${gmp_includes_option}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_option}"
+
+enableval=yes
+echo "$as_me:$LINENO: checking whether to build the Parma Watchdog Library" >&5
+echo $ECHO_N "checking whether to build the Parma Watchdog Library... $ECHO_C" >&6
+# Check whether --enable-watchdog or --disable-watchdog was given.
+if test "${enable_watchdog+set}" = set; then
+ enableval="$enable_watchdog"
+
+fi;
+case "${enableval}" in
+yes)
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ ;;
+no)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+*)
+ { { echo "$as_me:$LINENO: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&5
+echo "$as_me: error: bad value ${enableval} for --enable-watchdog, needs yes or no" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+esac
+build_watchdog_library=$enableval
+
+
+if test x"$build_watchdog_library" = xyes; then
+ BUILD_WATCHDOG_LIBRARY_TRUE=
+ BUILD_WATCHDOG_LIBRARY_FALSE='#'
+else
+ BUILD_WATCHDOG_LIBRARY_TRUE='#'
+ BUILD_WATCHDOG_LIBRARY_FALSE=
+fi
+
+
+# Enabled or not, the Watchdog subdirectory must be configured.
+
+
+subdirs="$subdirs Watchdog"
+
+
+# This is the list of available interfaces: lowercase and blank-separated.
+available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+
+# This is the list of interfaces that are enabled by default.
+#default_interfaces="cxx c swi_prolog"
+default_interfaces=${available_interfaces}
+
+enableval=not_specified
+echo "$as_me:$LINENO: checking which interfaces are enabled" >&5
+echo $ECHO_N "checking which interfaces are enabled... $ECHO_C" >&6
+# Check whether --enable-interfaces or --disable-interfaces was given.
+if test "${enable_interfaces+set}" = set; then
+ enableval="$enable_interfaces"
+
+fi;
+case x"${enableval}" in
+xyes | x)
+ { { echo "$as_me:$LINENO: error: --enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" >&5
+echo "$as_me: error: --enable-interfaces needs at least one argument chosen among ${available_interfaces}, none and all" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+xnone | xno)
+ for interface in ${available_interfaces}
+ do
+ eval ${interface}_interface_enabled=no
+ done
+ echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+ ;;
+xall)
+ for interface in ${available_interfaces}
+ do
+ eval ${interface}_interface_enabled=yes
+ done
+ echo "$as_me:$LINENO: result: ${available_interfaces}" >&5
+echo "${ECHO_T}${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}\ *)
+ ;;
+ *)
+ { { echo "$as_me:$LINENO: error: unknown interface ${interface}: must be one of ${available_interfaces}" >&5
+echo "$as_me: error: unknown interface ${interface}: must be one of ${available_interfaces}" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ 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
+ echo "$as_me:$LINENO: result: ${enabled_interfaces}" >&5
+echo "${ECHO_T}${enabled_interfaces}" >&6
+ ;;
+esac
+
+# Set an Automake conditional to build or not to build the C interface.
+
+
+if test x${c_interface_enabled} = xyes; then
+ BUILD_C_INTERFACE_TRUE=
+ BUILD_C_INTERFACE_FALSE='#'
+else
+ BUILD_C_INTERFACE_TRUE='#'
+ BUILD_C_INTERFACE_FALSE=
+fi
+
+
+# Checks for Prolog systems for which the interface is enabled.
+
+# 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CIAO_PROLOG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CIAO_PROLOG"; then
+ ac_cv_prog_CIAO_PROLOG="$CIAO_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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_CIAO_PROLOG="ciao"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+CIAO_PROLOG=$ac_cv_prog_CIAO_PROLOG
+if test -n "$CIAO_PROLOG"; then
+ echo "$as_me:$LINENO: result: $CIAO_PROLOG" >&5
+echo "${ECHO_T}$CIAO_PROLOG" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if test x"$CIAO_PROLOG" = xciao
+ then
+ if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
+echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking ciao_prolog.h usability" >&5
+echo $ECHO_N "checking ciao_prolog.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <ciao_prolog.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking ciao_prolog.h presence" >&5
+echo $ECHO_N "checking ciao_prolog.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ciao_prolog.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: ciao_prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: ciao_prolog.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: ciao_prolog.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: ciao_prolog.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: ciao_prolog.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: ciao_prolog.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: ciao_prolog.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: ciao_prolog.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for ciao_prolog.h" >&5
+echo $ECHO_N "checking for ciao_prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_ciao_prolog_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_ciao_prolog_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_ciao_prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_ciao_prolog_h" >&6
+
+fi
+if test $ac_cv_header_ciao_prolog_h = yes; then
+ :
+else
+ CIAO_PROLOG=""
+fi
+
+
+ fi
+fi
+
+
+if test x$CIAO_PROLOG = xciao; then
+ BUILD_CIAO_PROLOG_INTERFACE_TRUE=
+ BUILD_CIAO_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_CIAO_PROLOG_INTERFACE_TRUE='#'
+ BUILD_CIAO_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_GNU_PROLOG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_GNU_PROLOG="gprolog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+GNU_PROLOG=$ac_cv_prog_GNU_PROLOG
+if test -n "$GNU_PROLOG"; then
+ echo "$as_me:$LINENO: result: $GNU_PROLOG" >&5
+echo "${ECHO_T}$GNU_PROLOG" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if test x"$GNU_PROLOG" = xgprolog
+ then
+ if test "${ac_cv_header_gprolog_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for gprolog.h" >&5
+echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_gprolog_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking gprolog.h usability" >&5
+echo $ECHO_N "checking gprolog.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <gprolog.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking gprolog.h presence" >&5
+echo $ECHO_N "checking gprolog.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <gprolog.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: gprolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: gprolog.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: gprolog.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: gprolog.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: gprolog.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: gprolog.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: gprolog.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: gprolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: gprolog.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for gprolog.h" >&5
+echo $ECHO_N "checking for gprolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_gprolog_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_gprolog_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_gprolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_gprolog_h" >&6
+
+fi
+if test $ac_cv_header_gprolog_h = yes; then
+ :
+else
+ GNU_PROLOG=""
+fi
+
+
+ fi
+fi
+
+
+if test x$GNU_PROLOG = xgprolog; then
+ BUILD_GNU_PROLOG_INTERFACE_TRUE=
+ BUILD_GNU_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_GNU_PROLOG_INTERFACE_TRUE='#'
+ BUILD_GNU_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_sicstus_prolog+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_sicstus_prolog="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ ;;
+esac
+fi
+sicstus_prolog=$ac_cv_path_sicstus_prolog
+
+if test -n "$sicstus_prolog"; then
+ echo "$as_me:$LINENO: result: $sicstus_prolog" >&5
+echo "${ECHO_T}$sicstus_prolog" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test x$sicstus_prolog != x
+then
+ sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."))
+ SICSTUS_PROLOG_INCLUDE_OPTIONS="-I${sicstus_prolog_base}/include"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $SICSTUS_PROLOG_INCLUDE_OPTIONS"
+ ac_ext=cc
+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.
+ if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
+echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6
+if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
+echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking sicstus/sicstus.h usability" >&5
+echo $ECHO_N "checking sicstus/sicstus.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <sicstus/sicstus.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking sicstus/sicstus.h presence" >&5
+echo $ECHO_N "checking sicstus/sicstus.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <sicstus/sicstus.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: sicstus/sicstus.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for sicstus/sicstus.h" >&5
+echo $ECHO_N "checking for sicstus/sicstus.h... $ECHO_C" >&6
+if test "${ac_cv_header_sicstus_sicstus_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_sicstus_sicstus_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_sicstus_sicstus_h" >&5
+echo "${ECHO_T}$ac_cv_header_sicstus_sicstus_h" >&6
+
+fi
+if test $ac_cv_header_sicstus_sicstus_h = yes; then
+ echo "$as_me:$LINENO: checking for SICStus version 3.9.1 or later" >&5
+echo $ECHO_N "checking for SICStus version 3.9.1 or later... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* 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
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ sicstus_prolog=""
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest*
+
+else
+ sicstus_prolog=""
+fi
+
+
+ ac_ext=cc
+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$have_sicstus_prolog = xyes; then
+ BUILD_SICSTUS_PROLOG_INTERFACE_TRUE=
+ BUILD_SICSTUS_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_SICSTUS_PROLOG_INTERFACE_TRUE='#'
+ BUILD_SICSTUS_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# SWI Prolog
+if test x${swi_prolog_interface_enabled} = xyes
+then
+
+# Extract the first word of "swi-prolog", so it can be a program name with args.
+set dummy swi-prolog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+
+if test -n "$swi_prolog"; then
+ echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z $swi_prolog
+then
+ # Extract the first word of "swipl", so it can be a program name with args.
+set dummy swipl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+
+if test -n "$swi_prolog"; then
+ echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if test -z $swi_prolog
+ then
+ # Extract the first word of "pl", so it can be a program name with args.
+set dummy pl; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_swi_prolog+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_swi_prolog="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ ;;
+esac
+fi
+swi_prolog=$ac_cv_path_swi_prolog
+
+if test -n "$swi_prolog"; then
+ echo "$as_me:$LINENO: result: $swi_prolog" >&5
+echo "${ECHO_T}$swi_prolog" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ fi
+fi
+if test x$swi_prolog != x
+then
+ swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`
+ swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'`
+
+
+ SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include"
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $SWI_PROLOG_INCLUDE_OPTIONS"
+ ac_ext=cc
+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.
+ if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
+echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking SWI-Prolog.h usability" >&5
+echo $ECHO_N "checking SWI-Prolog.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <SWI-Prolog.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking SWI-Prolog.h presence" >&5
+echo $ECHO_N "checking SWI-Prolog.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <SWI-Prolog.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: SWI-Prolog.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for SWI-Prolog.h" >&5
+echo $ECHO_N "checking for SWI-Prolog.h... $ECHO_C" >&6
+if test "${ac_cv_header_SWI_Prolog_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_SWI_Prolog_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_SWI_Prolog_h" >&5
+echo "${ECHO_T}$ac_cv_header_SWI_Prolog_h" >&6
+
+fi
+if test $ac_cv_header_SWI_Prolog_h = yes; then
+ echo "$as_me:$LINENO: checking for SWI-Prolog version 5.6.0 or later" >&5
+echo $ECHO_N "checking for SWI-Prolog version 5.6.0 or later... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+#include <SWI-Prolog.h>
+
+int
+main() {
+#if !defined(PLVERSION) || PLVERSION < 50600
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+swi_prolog=""
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+ swi_prolog=""
+fi
+
+
+ ac_ext=cc
+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$swi_prolog != x
+then
+ have_swi_prolog=yes
+else
+ have_swi_prolog=no
+fi
+
+fi
+
+
+if test x$have_swi_prolog = xyes; then
+ BUILD_SWI_PROLOG_INTERFACE_TRUE=
+ BUILD_SWI_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_SWI_PROLOG_INTERFACE_TRUE='#'
+ BUILD_SWI_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_xsb_prolog+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_path_xsb_prolog="$as_dir/$ac_word$ac_exec_ext"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ ;;
+esac
+fi
+xsb_prolog=$ac_cv_path_xsb_prolog
+
+if test -n "$xsb_prolog"; then
+ echo "$as_me:$LINENO: result: $xsb_prolog" >&5
+echo "${ECHO_T}$xsb_prolog" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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$have_xsb_prolog = xyes; then
+ BUILD_XSB_PROLOG_INTERFACE_TRUE=
+ BUILD_XSB_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_XSB_PROLOG_INTERFACE_TRUE='#'
+ BUILD_XSB_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_YAP_PROLOG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$YAP_PROLOG"; then
+ ac_cv_prog_YAP_PROLOG="$YAP_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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_YAP_PROLOG="yap"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+YAP_PROLOG=$ac_cv_prog_YAP_PROLOG
+if test -n "$YAP_PROLOG"; then
+ echo "$as_me:$LINENO: result: $YAP_PROLOG" >&5
+echo "${ECHO_T}$YAP_PROLOG" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if test x"$YAP_PROLOG" = xyap
+ then
+ if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
+echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6
+if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
+echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking Yap/c_interface.h usability" >&5
+echo $ECHO_N "checking Yap/c_interface.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <Yap/c_interface.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking Yap/c_interface.h presence" >&5
+echo $ECHO_N "checking Yap/c_interface.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <Yap/c_interface.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: Yap/c_interface.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for Yap/c_interface.h" >&5
+echo $ECHO_N "checking for Yap/c_interface.h... $ECHO_C" >&6
+if test "${ac_cv_header_Yap_c_interface_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_Yap_c_interface_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_Yap_c_interface_h" >&5
+echo "${ECHO_T}$ac_cv_header_Yap_c_interface_h" >&6
+
+fi
+if test $ac_cv_header_Yap_c_interface_h = yes; then
+ :
+else
+ YAP_PROLOG=""
+fi
+
+
+ fi
+fi
+
+
+if test x$YAP_PROLOG = xyap; then
+ BUILD_YAP_PROLOG_INTERFACE_TRUE=
+ BUILD_YAP_PROLOG_INTERFACE_FALSE='#'
+else
+ BUILD_YAP_PROLOG_INTERFACE_TRUE='#'
+ BUILD_YAP_PROLOG_INTERFACE_FALSE=
+fi
+
+
+# # This is the list of interfaces that are enabled by default.
+# # Different instantiations are separated by a '@' character.
+# default_instantiations="Polyhedron @ BD_Shape<int8_t>"
+#
+# enableval=not_specified
+# AC_MSG_CHECKING([which instantiations are enabled])
+# AC_ARG_ENABLE(instantiations,
+# AC_HELP_STRING([--enable-instantiations],
+# [enable instantiations for the non-C++ interfaces]))
+# case x"${enableval}" in
+# xyes | x)
+# AC_MSG_ERROR([--enable-instantiations needs at least one argument])
+# ;;
+# xno | xnone)
+# enabled_instantiations=
+# AC_MSG_RESULT(none)
+# ;;
+# *)
+# if test x"${enableval}" = xnot_specified
+# then
+# enableval=${default_instantiations}
+# fi
+# # Make the list blank-separated.
+# required_instantiations=`echo "${enableval}" | sed -e 's/[[ ]][[ ]]*//g' -e 's/@/ /g' -e 's/[[ ]][[ ]]*/ /g'`
+# # Check the specified instantiations for validity.
+# ac_save_CPPFLAGS="$CPPFLAGS"
+# CPPFLAGS="$CPPFLAGS -I${srcdir}"
+# for instantiation in ${required_instantiations}
+# 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"
+# AC_MSG_RESULT([${required_instantiations}])
+# ;;
+# esac
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+
+
+
+
+# Check whether --enable-shared or --disable-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 or --disable-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 --enable-fast-install or --disable-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;
+
+echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5
+echo $ECHO_N "checking for a sed that does not truncate output... $ECHO_C" >&6
+if test "${lt_cv_path_SED+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # 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
+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
+
+fi
+
+SED=$lt_cv_path_SED
+echo "$as_me:$LINENO: result: $SED" >&5
+echo "${ECHO_T}$SED" >&6
+
+
+# Check whether --with-gnu-ld or --without-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.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&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
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$lt_cv_prog_gnu_ld" >&6
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5
+echo $ECHO_N "checking for $LD option to reload object files... $ECHO_C" >&6
+if test "${lt_cv_ld_reload_flag+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_ld_reload_flag='-r'
+fi
+echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5
+echo "${ECHO_T}$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
+ 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
+
+echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5
+echo $ECHO_N "checking for BSD-compatible nm... $ECHO_C" >&6
+if test "${lt_cv_path_NM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi
+fi
+echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5
+echo "${ECHO_T}$lt_cv_path_NM" >&6
+NM="$lt_cv_path_NM"
+
+echo "$as_me:$LINENO: checking whether ln -s works" >&5
+echo $ECHO_N "checking whether ln -s works... $ECHO_C" >&6
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me:$LINENO: result: no, using $LN_S" >&5
+echo "${ECHO_T}no, using $LN_S" >&6
+fi
+
+echo "$as_me:$LINENO: checking how to recognise dependent libraries" >&5
+echo $ECHO_N "checking how to recognise dependent libraries... $ECHO_C" >&6
+if test "${lt_cv_deplibs_check_method+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+aix4* | aix5*)
+ 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'.
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | kfreebsd*-gnu | 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
+ ;;
+
+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]) 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
+ ;;
+
+interix3*)
+ # 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 Linux ELF.
+linux*)
+ 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=unknown
+ ;;
+
+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
+ ;;
+
+solaris*)
+ 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
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5
+echo "${ECHO_T}$lt_cv_deplibs_check_method" >&6
+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 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 whether --enable-libtool-lock or --disable-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:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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 16042 "configure"' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ 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-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ 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"
+ echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5
+echo $ECHO_N "checking whether the C compiler needs -belf... $ECHO_C" >&6
+if test "${lt_cv_cc_needs_belf+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ lt_cv_cc_needs_belf=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+lt_cv_cc_needs_belf=no
+fi
+rm -f 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
+echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5
+echo "${ECHO_T}$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
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_DLLTOOL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+ echo "$as_me:$LINENO: result: $DLLTOOL" >&5
+echo "${ECHO_T}$DLLTOOL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_DLLTOOL="dlltool"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_DLLTOOL" && ac_cv_prog_ac_ct_DLLTOOL="false"
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+ echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5
+echo "${ECHO_T}$ac_ct_DLLTOOL" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ DLLTOOL=$ac_ct_DLLTOOL
+else
+ DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
+set dummy ${ac_tool_prefix}as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$AS"; then
+ ac_cv_prog_AS="$AS" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AS="${ac_tool_prefix}as"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AS=$ac_cv_prog_AS
+if test -n "$AS"; then
+ echo "$as_me:$LINENO: result: $AS" >&5
+echo "${ECHO_T}$AS" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AS"; then
+ ac_ct_AS=$AS
+ # Extract the first word of "as", so it can be a program name with args.
+set dummy as; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_AS"; then
+ ac_cv_prog_ac_ct_AS="$ac_ct_AS" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AS="as"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_AS" && ac_cv_prog_ac_ct_AS="false"
+fi
+fi
+ac_ct_AS=$ac_cv_prog_ac_ct_AS
+if test -n "$ac_ct_AS"; then
+ echo "$as_me:$LINENO: result: $ac_ct_AS" >&5
+echo "${ECHO_T}$ac_ct_AS" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AS=$ac_ct_AS
+else
+ AS="$ac_cv_prog_AS"
+fi
+
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_OBJDUMP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+ echo "$as_me:$LINENO: result: $OBJDUMP" >&5
+echo "${ECHO_T}$OBJDUMP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_OBJDUMP="objdump"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_OBJDUMP" && ac_cv_prog_ac_ct_OBJDUMP="false"
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5
+echo "${ECHO_T}$ac_ct_OBJDUMP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ OBJDUMP=$ac_ct_OBJDUMP
+else
+ OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+ ;;
+
+esac
+
+need_locks="$enable_libtool_lock"
+
+
+
+for ac_header in dlfcn.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+
+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=cc
+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
+echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5
+echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6
+if test -z "$CXXCPP"; then
+ if test "${ac_cv_prog_CXXCPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f 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
+echo "$as_me:$LINENO: result: $CXXCPP" >&5
+echo "${ECHO_T}$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 >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&5
+echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=cc
+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
+
+fi
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+ 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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$F77"; then
+ ac_cv_prog_F77="$F77" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_F77="$ac_tool_prefix$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+F77=$ac_cv_prog_F77
+if test -n "$F77"; then
+ echo "$as_me:$LINENO: result: $F77" >&5
+echo "${ECHO_T}$F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$F77" && break
+ done
+fi
+if test -z "$F77"; then
+ ac_ct_F77=$F77
+ for ac_prog in g77 f77 xlf frt pgf77 fort77 fl32 af77 f90 xlf90 pgf90 epcf90 f95 fort xlf95 ifc efc pgf95 lf95 gfortran
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_F77"; then
+ ac_cv_prog_ac_ct_F77="$ac_ct_F77" # 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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_F77="$ac_prog"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+ac_ct_F77=$ac_cv_prog_ac_ct_F77
+if test -n "$ac_ct_F77"; then
+ echo "$as_me:$LINENO: result: $ac_ct_F77" >&5
+echo "${ECHO_T}$ac_ct_F77" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_F77" && break
+done
+
+ F77=$ac_ct_F77
+fi
+
+
+# Provide some information about the compiler.
+echo "$as_me:16945:" \
+ "checking for Fortran 77 compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+rm -f a.out
+
+# If we don't use `.F' as extension, the preprocessor is not run on the
+# input file. (Note that this only needs to work for GNU compilers.)
+ac_save_ext=$ac_ext
+ac_ext=F
+echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU Fortran 77 compiler... $ECHO_C" >&6
+if test "${ac_cv_f77_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+#ifndef __GNUC__
+ choke me
+#endif
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_compiler_gnu=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_f77_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_f77_compiler_gnu" >&6
+ac_ext=$ac_save_ext
+ac_test_FFLAGS=${FFLAGS+set}
+ac_save_FFLAGS=$FFLAGS
+FFLAGS=
+echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5
+echo $ECHO_N "checking whether $F77 accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_f77_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ FFLAGS=-g
+cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_f77_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_prog_f77_g=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5
+echo "${ECHO_T}$ac_cv_prog_f77_g" >&6
+if test "$ac_test_FFLAGS" = set; then
+ FFLAGS=$ac_save_FFLAGS
+elif test $ac_cv_prog_f77_g = yes; then
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-g -O2"
+ else
+ FFLAGS="-g"
+ fi
+else
+ if test "x$ac_cv_f77_compiler_gnu" = xyes; then
+ FFLAGS="-O2"
+ else
+ FFLAGS=
+ fi
+fi
+
+G77=`test $ac_compiler_gnu = yes && echo yes`
+ac_ext=cc
+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
+
+
+
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+
+# find the maximum length of command line arguments
+echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5
+echo $ECHO_N "checking the maximum length of command line arguments... $ECHO_C" >&6
+if test "${lt_cv_sys_max_cmd_len+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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*)
+ # 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;
+ ;;
+
+ 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
+ ;;
+
+ 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
+ ;;
+ *)
+ # 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.
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ 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`
+ ;;
+ esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+ echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5
+echo "${ECHO_T}$lt_cv_sys_max_cmd_len" >&6
+else
+ echo "$as_me:$LINENO: result: none" >&5
+echo "${ECHO_T}none" >&6
+fi
+
+
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5
+echo $ECHO_N "checking command to parse $NM output from $compiler object... $ECHO_C" >&6
+if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \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\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[BCDT]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[ABCDGISTW]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDEGRST]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux*)
+ if test "$host_cpu" = ia64; then
+ symcode='[ABCDGIRSTW]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ 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
+
+# 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
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Try without a prefix undercore, 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.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if { (eval echo "$as_me:$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=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && 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 <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_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 -f 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
+ echo "$as_me:$LINENO: result: failed" >&5
+echo "${ECHO_T}failed" >&6
+else
+ echo "$as_me:$LINENO: result: ok" >&5
+echo "${ECHO_T}ok" >&6
+fi
+
+echo "$as_me:$LINENO: checking for objdir" >&5
+echo $ECHO_N "checking for objdir... $ECHO_C" >&6
+if test "${lt_cv_objdir+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5
+echo "${ECHO_T}$lt_cv_objdir" >&6
+objdir=$lt_cv_objdir
+
+
+
+
+
+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
+
+# 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 to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args.
+set dummy ${ac_tool_prefix}ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_AR="${ac_tool_prefix}ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+ echo "$as_me:$LINENO: result: $AR" >&5
+echo "${ECHO_T}$AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_AR"; then
+ ac_ct_AR=$AR
+ # Extract the first word of "ar", so it can be a program name with args.
+set dummy ar; ac_word=$2
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_AR+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_AR="ar"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_AR" && ac_cv_prog_ac_ct_AR="false"
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+ echo "$as_me:$LINENO: result: $ac_ct_AR" >&5
+echo "${ECHO_T}$ac_ct_AR" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ AR=$ac_ct_AR
+else
+ AR="$ac_cv_prog_AR"
+fi
+
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+RANLIB=$ac_cv_prog_RANLIB
+if test -n "$RANLIB"; then
+ echo "$as_me:$LINENO: result: $RANLIB" >&5
+echo "${ECHO_T}$RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_RANLIB="ranlib"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":"
+fi
+fi
+ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
+if test -n "$ac_ct_RANLIB"; then
+ echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
+echo "${ECHO_T}$ac_ct_RANLIB" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ RANLIB=$ac_ct_RANLIB
+else
+ RANLIB="$ac_cv_prog_RANLIB"
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_STRIP="${ac_tool_prefix}strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+STRIP=$ac_cv_prog_STRIP
+if test -n "$STRIP"; then
+ echo "$as_me:$LINENO: result: $STRIP" >&5
+echo "${ECHO_T}$STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_ac_ct_STRIP="strip"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+ test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":"
+fi
+fi
+ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
+if test -n "$ac_ct_STRIP"; then
+ echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
+echo "${ECHO_T}$ac_ct_STRIP" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ STRIP=$ac_ct_STRIP
+else
+ STRIP="$ac_cv_prog_STRIP"
+fi
+
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
+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 \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5
+echo $ECHO_N "checking for ${ac_tool_prefix}file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<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
+
+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
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ echo "$as_me:$LINENO: checking for file" >&5
+echo $ECHO_N "checking for file... $ECHO_C" >&6
+if test "${lt_cv_path_MAGIC_CMD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<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
+
+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
+ echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5
+echo "${ECHO_T}$MAGIC_CMD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ else
+ MAGIC_CMD=:
+ fi
+fi
+
+ fi
+ ;;
+esac
+
+enable_dlopen=yes
+enable_win32_dll=yes
+
+# Check whether --enable-libtool-lock or --disable-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
+
+
+# Check whether --with-pic or --without-pic was given.
+if test "${with_pic+set}" = set; then
+ withval="$with_pic"
+ pic_mode="$withval"
+else
+ pic_mode=default
+fi;
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+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;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}\n'
+
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:18008: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:18012: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$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=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ 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*)
+ # 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'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic='-fno-common'
+ ;;
+
+ interix3*)
+ # 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
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic='-fPIC'
+ ;;
+ 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
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic='-qnocommon'
+ lt_prog_compiler_wl='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl='-Wl,'
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # 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'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic='-KPIC'
+ lt_prog_compiler_static='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ 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
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:18276: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:18280: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works" >&6
+
+if test x"$lt_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
+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
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works=yes
+ fi
+ else
+ lt_prog_compiler_static_works=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works" >&6
+
+if test x"$lt_prog_compiler_static_works" = xyes; then
+ :
+else
+ lt_prog_compiler_static=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:18380: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:18384: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5
+echo "${ECHO_T}$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
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag=
+ enable_shared_with_static_runtimes=no
+ archive_cmds=
+ archive_expsym_cmds=
+ old_archive_From_new_cmds=
+ old_archive_from_expsyms_cmds=
+ export_dynamic_flag_spec=
+ whole_archive_flag_spec=
+ thread_safe_flag_spec=
+ hardcode_libdir_flag_spec=
+ hardcode_libdir_flag_spec_ld=
+ hardcode_libdir_separator=
+ hardcode_direct=no
+ hardcode_minus_L=no
+ hardcode_shlibpath_var=unsupported
+ link_all_deplibs=unknown
+ hardcode_automatic=no
+ module_cmds=
+ module_expsym_cmds=
+ always_export_symbols=no
+ export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # 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_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ 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
+ # 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>/dev/null` in
+ *\ [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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ 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
+
+ # 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 can't use
+ # them.
+ ld_shlibs=no
+ ;;
+
+ 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*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec='-L$libdir'
+ 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/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ 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
+ ;;
+
+ interix3*)
+ 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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ 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; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # 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; $echo \"$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' ;;
+ esac
+ archive_cmds='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; 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 -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ 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 $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'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ ld_shlibs=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ 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
+ ;;
+
+ 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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$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 $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
+
+ 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
+ ;;
+
+ 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
+ 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
+ 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")) && (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].*|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
+
+ 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_libdir_separator=':'
+ link_all_deplibs=yes
+
+ 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
+ hardcode_direct=yes
+ 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
+
+ # 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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 echo "${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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec='$convenience'
+ 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*)
+ 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
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec=-rdynamic
+ ;;
+
+ 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=' '
+ 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 `echo "$deplibs" | $SED -e '\''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'
+ fix_srcfile_path='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc=no
+ hardcode_direct=no
+ hardcode_automatic=yes
+ hardcode_shlibpath_var=unsupported
+ whole_archive_flag_spec=''
+ link_all_deplibs=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec='-L$libdir'
+ hardcode_shlibpath_var=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs=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* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds='$CC -shared -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 -fPIC ${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 -a "$with_gnu_ld" = no; then
+ archive_cmds='$CC -shared -fPIC ${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
+ 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 -a "$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 ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds='$CC -shared -fPIC ${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'
+ ;;
+ *)
+ archive_cmds='$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
+ hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld='+b $libdir'
+ hardcode_direct=no
+ hardcode_shlibpath_var=no
+ ;;
+ *)
+ hardcode_direct=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 $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator=:
+ 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
+ ;;
+
+ openbsd*)
+ hardcode_direct=yes
+ hardcode_shlibpath_var=no
+ 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
+ ;;
+
+ 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" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag=' -expect_unresolved \*'
+ archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ 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} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${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='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -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; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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
+ hardcode_libdir_separator=:
+ ;;
+
+ solaris*)
+ no_undefined_flag=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds='$CC -shared ${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 ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ 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'
+ 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 linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ 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*)
+ 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='`test -z "$SCOABSPATH" && echo ${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,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs" >&5
+echo "${ECHO_T}$ld_shlibs" >&6
+test "$ld_shlibs" = no && can_build_shared=no
+
+#
+# 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 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:$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=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc=no
+ else
+ archive_cmds_need_lc=yes
+ fi
+ allow_undefined_flag=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5
+echo "${ECHO_T}$archive_cmds_need_lc" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" || \
+ test -n "$runpath_var" || \
+ test "X$hardcode_automatic" = "Xyes" ; then
+
+ # We can hardcode non-existant 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_AC_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
+echo "$as_me:$LINENO: result: $hardcode_action" >&5
+echo "${ECHO_T}$hardcode_action" >&6
+
+if test "$hardcode_action" = relink; 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
+
+striplib=
+old_striplib=
+echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5
+echo $ECHO_N "checking whether stripping libraries is possible... $ECHO_C" >&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"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}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"
+ echo "$as_me:$LINENO: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+ ;;
+ *)
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+ ;;
+ esac
+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*)
+ 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
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; 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
+
+ ;;
+
+ *)
+ echo "$as_me:$LINENO: checking for shl_load" >&5
+echo $ECHO_N "checking for shl_load... $ECHO_C" >&6
+if test "${ac_cv_func_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define shl_load to an innocuous variant, in case <limits.h> declares shl_load.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define shl_load innocuous_shl_load
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char shl_load (); 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 shl_load
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+/* 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_shl_load) || defined (__stub___shl_load)
+choke me
+#else
+char (*f) () = shl_load;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != shl_load;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5
+echo "${ECHO_T}$ac_cv_func_shl_load" >&6
+if test $ac_cv_func_shl_load = yes; then
+ lt_cv_dlopen="shl_load"
+else
+ echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5
+echo $ECHO_N "checking for shl_load in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_shl_load+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char shl_load ();
+int
+main ()
+{
+shl_load ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_shl_load=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_shl_load=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_shl_load" >&6
+if test $ac_cv_lib_dld_shl_load = yes; then
+ lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"
+else
+ echo "$as_me:$LINENO: checking for dlopen" >&5
+echo $ECHO_N "checking for dlopen... $ECHO_C" >&6
+if test "${ac_cv_func_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+/* Define dlopen to an innocuous variant, in case <limits.h> declares dlopen.
+ For example, HP-UX 11i <limits.h> declares gettimeofday. */
+#define dlopen innocuous_dlopen
+
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char dlopen (); 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 dlopen
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+/* 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_dlopen) || defined (__stub___dlopen)
+choke me
+#else
+char (*f) () = dlopen;
+#endif
+#ifdef __cplusplus
+}
+#endif
+
+int
+main ()
+{
+return f != dlopen;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_func_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5
+echo "${ECHO_T}$ac_cv_func_dlopen" >&6
+if test $ac_cv_func_dlopen = yes; then
+ lt_cv_dlopen="dlopen"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5
+echo $ECHO_N "checking for dlopen in -ldl... $ECHO_C" >&6
+if test "${ac_cv_lib_dl_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dl_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dl_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_dl_dlopen" >&6
+if test $ac_cv_lib_dl_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+ echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5
+echo $ECHO_N "checking for dlopen in -lsvld... $ECHO_C" >&6
+if test "${ac_cv_lib_svld_dlopen+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dlopen ();
+int
+main ()
+{
+dlopen ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_svld_dlopen=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_svld_dlopen=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5
+echo "${ECHO_T}$ac_cv_lib_svld_dlopen" >&6
+if test $ac_cv_lib_svld_dlopen = yes; then
+ lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+ echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5
+echo $ECHO_N "checking for dld_link in -ldld... $ECHO_C" >&6
+if test "${ac_cv_lib_dld_dld_link+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char dld_link ();
+int
+main ()
+{
+dld_link ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_dld_dld_link=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_lib_dld_dld_link=no
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5
+echo "${ECHO_T}$ac_cv_lib_dld_dld_link" >&6
+if test $ac_cv_lib_dld_dld_link = yes; then
+ lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"
+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"
+
+ echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5
+echo $ECHO_N "checking whether a program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<EOF
+#line 20725 "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
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=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;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && 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
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5
+echo "${ECHO_T}$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\"
+ echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5
+echo $ECHO_N "checking whether a statically linked program can dlopen itself... $ECHO_C" >&6
+if test "${lt_cv_dlopen_self_static+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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 <<EOF
+#line 20825 "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
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=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;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}
+EOF
+ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } && 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
+echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5
+echo "${ECHO_T}$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
+
+
+# Report which library types will actually be built
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler \
+ CC \
+ LD \
+ lt_prog_compiler_wl \
+ lt_prog_compiler_pic \
+ lt_prog_compiler_static \
+ lt_prog_compiler_no_builtin_flag \
+ export_dynamic_flag_spec \
+ thread_safe_flag_spec \
+ whole_archive_flag_spec \
+ enable_shared_with_static_runtimes \
+ old_archive_cmds \
+ old_archive_from_new_cmds \
+ predep_objects \
+ postdep_objects \
+ predeps \
+ postdeps \
+ compiler_lib_search_path \
+ archive_cmds \
+ archive_expsym_cmds \
+ postinstall_cmds \
+ postuninstall_cmds \
+ old_archive_from_expsyms_cmds \
+ allow_undefined_flag \
+ no_undefined_flag \
+ export_symbols_cmds \
+ hardcode_libdir_flag_spec \
+ hardcode_libdir_flag_spec_ld \
+ hardcode_libdir_separator \
+ hardcode_automatic \
+ module_cmds \
+ module_expsym_cmds \
+ lt_cv_prog_compiler_c_o \
+ exclude_expsyms \
+ include_expsyms; do
+
+ case $var in
+ old_archive_cmds | \
+ old_archive_from_new_cmds | \
+ archive_cmds | \
+ archive_expsym_cmds | \
+ module_cmds | \
+ module_expsym_cmds | \
+ old_archive_from_expsyms_cmds | \
+ export_symbols_cmds | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ { echo "$as_me:$LINENO: creating $ofile" >&5
+echo "$as_me: creating $ofile" >&6;}
+
+ cat <<__EOF__ >> "$cfgfile"
+#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# 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.
+
+# 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//"
+
+# 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
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# 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
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# 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
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# 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 and install a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+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
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld
+
+# 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 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
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path"
+
+# 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
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_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
+
+# ### END LIBTOOL CONFIG
+
+__EOF__
+
+
+ case $host_os in
+ aix3*)
+ cat <<\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
+EOF
+ ;;
+ esac
+
+ # 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)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+
+# Check whether --with-tags or --without-tags was given.
+if test "${with_tags+set}" = set; then
+ withval="$with_tags"
+ tagnames="$withval"
+fi;
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;}
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ { echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5
+echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;}
+ else
+ { echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5
+echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;}
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in
+ "") ;;
+ *) { { echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5
+echo "$as_me: error: invalid tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ { { echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5
+echo "$as_me: error: tag name \"$tagname\" already exists" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ 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=cc
+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=
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_flag_spec_ld_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# 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=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[]) { return(0); }\n'
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+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++"}
+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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# We don't want -fno-exception wen 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 or --without-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.
+ echo "$as_me:$LINENO: checking for ld used by $CC" >&5
+echo $ECHO_N "checking for ld used by $CC... $ECHO_C" >&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
+ echo "$as_me:$LINENO: checking for GNU ld" >&5
+echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6
+else
+ echo "$as_me:$LINENO: checking for non-GNU ld" >&5
+echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6
+fi
+if test "${lt_cv_path_LD+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $LD" >&5
+echo "${ECHO_T}$LD" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5
+echo "$as_me: error: no acceptable ld found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5
+echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6
+if test "${lt_cv_prog_gnu_ld+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+echo "$as_me:$LINENO: result: $lt_cv_prog_gnu_ld" >&5
+echo "${ECHO_T}$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 -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_CXX='$CC -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 "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+ld_shlibs_CXX=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ 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
+ 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].*|aix5*)
+ 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_libdir_separator_CXX=':'
+ link_all_deplibs_CXX=yes
+
+ 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
+ hardcode_direct_CXX=yes
+ 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
+
+ # 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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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 echo "${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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; 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'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_CXX='$convenience'
+ 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*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_CXX='-L$libdir'
+ 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
+ ;;
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_CXX='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_CXX='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_CXX='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_CXX=no
+ hardcode_direct_CXX=no
+ hardcode_automatic_CXX=yes
+ hardcode_shlibpath_var_CXX=unsupported
+ whole_archive_flag_spec_CXX=''
+ link_all_deplibs_CXX=yes
+
+ if test "$GXX" = yes ; then
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_cmds_CXX='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ 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'
+ fi
+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "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~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_CXX=no
+ ;;
+ esac
+ 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
+ ;;
+ freebsd[12]*)
+ # 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* | kfreebsd*-gnu | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ ld_shlibs_CXX=yes
+ ;;
+ gnu*)
+ ;;
+ 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) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${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*)
+ hardcode_libdir_flag_spec_ld_CXX='+b $libdir'
+ ;;
+ *)
+ 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_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; echo $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 -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${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
+ ;;
+ interix3*)
+ 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" && echo -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 -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${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=:
+ ;;
+ linux*)
+ 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; echo $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*)
+ # 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*)
+ # Portland Group C++ compiler
+ 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'
+
+ 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; $echo \"$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=`echo $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; echo $list'
+ ;;
+ 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::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ ld_shlibs_CXX=no
+ ;;
+ openbsd*)
+ hardcode_direct_CXX=yes
+ hardcode_shlibpath_var_CXX=no
+ 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='echo'
+ ;;
+ osf3*)
+ 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
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ 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" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ 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.
+ #
+ # 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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ 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 "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ fi
+ ;;
+ esac
+ ;;
+ 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.
+ old_archive_cmds_CXX='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ ld_shlibs_CXX=no
+ ;;
+ cxx*)
+ 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" && echo -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'
+ 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=`echo $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; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ 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 "\-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*)
+ # 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 C++ compiler is used as linker so we must use $wl
+ # flag to pass the commands to the underlying system
+ # linker. We must also pass each convience library through
+ # to the system linker between allextract/defaultextract.
+ # The C++ compiler will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ link_all_deplibs_CXX=yes
+
+ output_verbose_link_cmd='echo'
+
+ # 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 -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 -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 \"\-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 \"\-L\""
+ fi
+
+ hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+ 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.
+ # 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.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ 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='`test -z "$SCOABSPATH" && echo ${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,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$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
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+GCC_CXX="$GXX"
+LD_CXX="$LD"
+
+
+cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; 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
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $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
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p 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
+ ;;
+
+ *.$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
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix3*)
+ # 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=
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # 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.
+ postdeps_CXX='-lCstd -lCrun'
+ ;;
+ esac
+ ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+
+lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ # 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*)
+ # 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'
+ ;;
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | os2* | pw32*)
+ # 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'
+ ;;
+ 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=
+ ;;
+ interix3*)
+ # 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 IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # 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_AC_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
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_CXX='-qnocommon'
+ lt_prog_compiler_wl_CXX='-Wl,'
+ ;;
+ esac
+ ;;
+ 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* | kfreebsd*-gnu | 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*)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ lt_prog_compiler_wl_CXX='--backend -Wl,'
+ lt_prog_compiler_pic_CXX='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ lt_prog_compiler_wl_CXX='-Wl,'
+ lt_prog_compiler_pic_CXX='-KPIC'
+ lt_prog_compiler_static_CXX='-static'
+ ;;
+ pgCC*)
+ # 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'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ lt_prog_compiler_pic_CXX='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd*)
+ ;;
+ 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*)
+ # 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
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ lt_prog_compiler_pic_CXX='-KPIC'
+ ;;
+ *)
+ ;;
+ 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
+ ;;
+ vxworks*)
+ ;;
+ *)
+ lt_prog_compiler_can_build_shared_CXX=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_CXX" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_CXX=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:23165: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:23169: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_CXX" >&6
+
+if test x"$lt_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
+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
+
+#
+# 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\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_CXX=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_CXX=yes
+ fi
+ else
+ lt_prog_compiler_static_works_CXX=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_CXX" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_CXX" >&6
+
+if test x"$lt_prog_compiler_static_works_CXX" = xyes; then
+ :
+else
+ lt_prog_compiler_static_CXX=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_CXX=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:23269: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:23273: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+echo "${ECHO_T}$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
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # 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
+ 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")) && (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*)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/;/^.* __nm__/s/^.* __nm__\([^ ]*\) [^ ]*/\1 DATA/;/^I /d;/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ *)
+ export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+
+echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5
+echo "${ECHO_T}$ld_shlibs_CXX" >&6
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+#
+# 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 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:$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=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_CXX=no
+ else
+ 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*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_CXX" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&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-existant 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_AC_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
+echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5
+echo "${ECHO_T}$hardcode_action_CXX" >&6
+
+if test "$hardcode_action_CXX" = relink; 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
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_CXX \
+ CC_CXX \
+ LD_CXX \
+ lt_prog_compiler_wl_CXX \
+ lt_prog_compiler_pic_CXX \
+ lt_prog_compiler_static_CXX \
+ lt_prog_compiler_no_builtin_flag_CXX \
+ export_dynamic_flag_spec_CXX \
+ thread_safe_flag_spec_CXX \
+ whole_archive_flag_spec_CXX \
+ enable_shared_with_static_runtimes_CXX \
+ old_archive_cmds_CXX \
+ old_archive_from_new_cmds_CXX \
+ predep_objects_CXX \
+ postdep_objects_CXX \
+ predeps_CXX \
+ postdeps_CXX \
+ compiler_lib_search_path_CXX \
+ archive_cmds_CXX \
+ archive_expsym_cmds_CXX \
+ postinstall_cmds_CXX \
+ postuninstall_cmds_CXX \
+ old_archive_from_expsyms_cmds_CXX \
+ allow_undefined_flag_CXX \
+ no_undefined_flag_CXX \
+ export_symbols_cmds_CXX \
+ hardcode_libdir_flag_spec_CXX \
+ hardcode_libdir_flag_spec_ld_CXX \
+ hardcode_libdir_separator_CXX \
+ hardcode_automatic_CXX \
+ module_cmds_CXX \
+ module_expsym_cmds_CXX \
+ lt_cv_prog_compiler_c_o_CXX \
+ exclude_expsyms_CXX \
+ include_expsyms_CXX; do
+
+ case $var in
+ old_archive_cmds_CXX | \
+ old_archive_from_new_cmds_CXX | \
+ archive_cmds_CXX | \
+ archive_expsym_cmds_CXX | \
+ module_cmds_CXX | \
+ module_expsym_cmds_CXX | \
+ old_archive_from_expsyms_cmds_CXX | \
+ export_symbols_cmds_CXX | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# 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
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_CXX
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_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
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_CXX
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# 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 and install a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_CXX
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_CXX
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+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
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_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 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
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_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
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# 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
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+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
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+
+ac_ext=f
+ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5'
+ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_f77_compiler_gnu
+
+
+archive_cmds_need_lc_F77=no
+allow_undefined_flag_F77=
+always_export_symbols_F77=no
+archive_expsym_cmds_F77=
+export_dynamic_flag_spec_F77=
+hardcode_direct_F77=no
+hardcode_libdir_flag_spec_F77=
+hardcode_libdir_flag_spec_ld_F77=
+hardcode_libdir_separator_F77=
+hardcode_minus_L_F77=no
+hardcode_automatic_F77=no
+module_cmds_F77=
+module_expsym_cmds_F77=
+link_all_deplibs_F77=unknown
+old_archive_cmds_F77=$old_archive_cmds
+no_undefined_flag_F77=
+whole_archive_flag_spec_F77=
+enable_shared_with_static_runtimes_F77=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+objext_F77=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code=" subroutine t\n return\n end\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=" program t\n end\n"
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+compiler_F77=$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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5
+echo $ECHO_N "checking if libtool supports shared libraries... $ECHO_C" >&6
+echo "$as_me:$LINENO: result: $can_build_shared" >&5
+echo "${ECHO_T}$can_build_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build shared libraries" >&5
+echo $ECHO_N "checking whether to build shared libraries... $ECHO_C" >&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
+ ;;
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+echo "$as_me:$LINENO: result: $enable_shared" >&5
+echo "${ECHO_T}$enable_shared" >&6
+
+echo "$as_me:$LINENO: checking whether to build static libraries" >&5
+echo $ECHO_N "checking whether to build static libraries... $ECHO_C" >&6
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+echo "$as_me:$LINENO: result: $enable_static" >&5
+echo "${ECHO_T}$enable_static" >&6
+
+GCC_F77="$G77"
+LD_F77="$LD"
+
+lt_prog_compiler_wl_F77=
+lt_prog_compiler_pic_F77=
+lt_prog_compiler_static_F77=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_static_F77='-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_F77='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # 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_F77='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_F77='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_F77='-fno-common'
+ ;;
+
+ interix3*)
+ # 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_F77=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_F77=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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_F77='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_F77='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_F77='-Bstatic'
+ else
+ lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_F77='-qnocommon'
+ lt_prog_compiler_wl_F77='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_F77='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_F77='-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_F77='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_F77='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-fpic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_F77='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_F77='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_F77='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_F77='-Qoption ld '
+ lt_prog_compiler_pic_F77='-PIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_F77='-Kconform_pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_pic_F77='-KPIC'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_F77='-Wl,'
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_F77='-pic'
+ lt_prog_compiler_static_F77='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_F77" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_F77"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_F77=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_F77"
+ # 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:24839: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:24843: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_F77" >&6
+
+if test x"$lt_prog_compiler_pic_works_F77" = xyes; then
+ case $lt_prog_compiler_pic_F77 in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;;
+ esac
+else
+ lt_prog_compiler_pic_F77=
+ lt_prog_compiler_can_build_shared_F77=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_F77=
+ ;;
+ *)
+ lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_F77=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_F77=yes
+ fi
+ else
+ lt_prog_compiler_static_works_F77=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_F77" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_F77" >&6
+
+if test x"$lt_prog_compiler_static_works_F77" = xyes; then
+ :
+else
+ lt_prog_compiler_static_F77=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_F77=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:24943: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:24947: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_F77=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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_F77" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_F77=
+ enable_shared_with_static_runtimes_F77=no
+ archive_cmds_F77=
+ archive_expsym_cmds_F77=
+ old_archive_From_new_cmds_F77=
+ old_archive_from_expsyms_cmds_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ thread_safe_flag_spec_F77=
+ hardcode_libdir_flag_spec_F77=
+ hardcode_libdir_flag_spec_ld_F77=
+ hardcode_libdir_separator_F77=
+ hardcode_direct_F77=no
+ hardcode_minus_L_F77=no
+ hardcode_shlibpath_var_F77=unsupported
+ link_all_deplibs_F77=unknown
+ hardcode_automatic_F77=no
+ module_cmds_F77=
+ module_expsym_cmds_F77=
+ always_export_symbols_F77=no
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_F77=
+ # 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_F77="_GLOBAL_OFFSET_TABLE_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ 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_F77=yes
+ if test "$with_gnu_ld" = 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_F77='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_F77='${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_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_F77=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_F77=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_F77='$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_F77='-L$libdir'
+ hardcode_minus_L_F77=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 can't use
+ # them.
+ ld_shlibs_F77=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_F77=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=no
+ enable_shared_with_static_runtimes_F77=yes
+ export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_F77='$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_F77='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_F77=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${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_F77='$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_F77='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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;;
+ esac
+ archive_cmds_F77='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $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_F77=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_F77=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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_F77=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_F77" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_F77=
+ export_dynamic_flag_spec_F77=
+ whole_archive_flag_spec_F77=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_F77=unsupported
+ always_export_symbols_F77=yes
+ archive_expsym_cmds_F77='$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_F77=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_F77=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
+ 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_F77='$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].*|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
+
+ 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_F77=''
+ hardcode_direct_F77=yes
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+
+ 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
+ hardcode_direct_F77=yes
+ else
+ # We have old collect2
+ hardcode_direct_F77=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_F77=yes
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_libdir_separator_F77=
+ 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
+
+ # 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_F77=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_F77='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${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_F77='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_F77="-z nodefs"
+ archive_expsym_cmds_F77="\$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.
+ cat >conftest.$ac_ext <<_ACEOF
+ program main
+
+ end
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_f77_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_F77='${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_F77=' ${wl}-bernotok'
+ allow_undefined_flag_F77=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_F77='$convenience'
+ archive_cmds_need_lc_F77=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_F77="\$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*)
+ archive_cmds_F77='$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_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_F77=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_F77=-rdynamic
+ ;;
+
+ 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_F77=' '
+ allow_undefined_flag_F77=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_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_F77='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_F77='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_F77='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_F77=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_F77='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_F77=no
+ hardcode_direct_F77=no
+ hardcode_automatic_F77=yes
+ hardcode_shlibpath_var_F77=unsupported
+ whole_archive_flag_spec_F77=''
+ link_all_deplibs_F77=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_F77=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_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_F77='$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_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_direct_F77=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$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_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared -fPIC ${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_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_F77='$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
+ hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_F77='+b $libdir'
+ hardcode_direct_F77=no
+ hardcode_shlibpath_var_F77=no
+ ;;
+ *)
+ hardcode_direct_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_F77=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ link_all_deplibs_F77=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ newsos6)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_F77=yes
+ hardcode_shlibpath_var_F77=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_F77='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ ;;
+ *)
+ archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_minus_L_F77=yes
+ allow_undefined_flag_F77=unsupported
+ archive_cmds_F77='$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_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_F77=' -expect_unresolved \*'
+ archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_F77='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_F77=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_F77=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_F77='$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'
+ fi
+ hardcode_libdir_flag_spec_F77='-R$libdir'
+ hardcode_shlibpath_var_F77=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec_F77='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs_F77=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_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_direct_F77=yes
+ hardcode_minus_L_F77=yes
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_F77='$CC -r -o $output$reload_objs'
+ hardcode_direct_F77=no
+ ;;
+ motorola)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ export_dynamic_flag_spec_F77='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_F77=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_F77=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag_F77='${wl}-z,text'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$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_F77='${wl}-z,text'
+ allow_undefined_flag_F77='${wl}-z,nodefs'
+ archive_cmds_need_lc_F77=no
+ hardcode_shlibpath_var_F77=no
+ hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_F77=':'
+ link_all_deplibs_F77=yes
+ export_dynamic_flag_spec_F77='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_F77='-L$libdir'
+ hardcode_shlibpath_var_F77=no
+ ;;
+
+ *)
+ ld_shlibs_F77=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5
+echo "${ECHO_T}$ld_shlibs_F77" >&6
+test "$ld_shlibs_F77" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_F77" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_F77=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_F77 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_F77
+ pic_flag=$lt_prog_compiler_pic_F77
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_F77
+ allow_undefined_flag_F77=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_F77=no
+ else
+ archive_cmds_need_lc_F77=yes
+ fi
+ allow_undefined_flag_F77=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_F77" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_F77=
+if test -n "$hardcode_libdir_flag_spec_F77" || \
+ test -n "$runpath_var_F77" || \
+ test "X$hardcode_automatic_F77" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_F77" != 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_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no &&
+ test "$hardcode_minus_L_F77" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_F77=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_F77=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_F77=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5
+echo "${ECHO_T}$hardcode_action_F77" >&6
+
+if test "$hardcode_action_F77" = relink; 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
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_F77 \
+ CC_F77 \
+ LD_F77 \
+ lt_prog_compiler_wl_F77 \
+ lt_prog_compiler_pic_F77 \
+ lt_prog_compiler_static_F77 \
+ lt_prog_compiler_no_builtin_flag_F77 \
+ export_dynamic_flag_spec_F77 \
+ thread_safe_flag_spec_F77 \
+ whole_archive_flag_spec_F77 \
+ enable_shared_with_static_runtimes_F77 \
+ old_archive_cmds_F77 \
+ old_archive_from_new_cmds_F77 \
+ predep_objects_F77 \
+ postdep_objects_F77 \
+ predeps_F77 \
+ postdeps_F77 \
+ compiler_lib_search_path_F77 \
+ archive_cmds_F77 \
+ archive_expsym_cmds_F77 \
+ postinstall_cmds_F77 \
+ postuninstall_cmds_F77 \
+ old_archive_from_expsyms_cmds_F77 \
+ allow_undefined_flag_F77 \
+ no_undefined_flag_F77 \
+ export_symbols_cmds_F77 \
+ hardcode_libdir_flag_spec_F77 \
+ hardcode_libdir_flag_spec_ld_F77 \
+ hardcode_libdir_separator_F77 \
+ hardcode_automatic_F77 \
+ module_cmds_F77 \
+ module_expsym_cmds_F77 \
+ lt_cv_prog_compiler_c_o_F77 \
+ exclude_expsyms_F77 \
+ include_expsyms_F77; do
+
+ case $var in
+ old_archive_cmds_F77 | \
+ old_archive_from_new_cmds_F77 | \
+ archive_cmds_F77 | \
+ archive_expsym_cmds_F77 | \
+ module_cmds_F77 | \
+ module_expsym_cmds_F77 | \
+ old_archive_from_expsyms_cmds_F77 | \
+ export_symbols_cmds_F77 | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_F77
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_F77
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_F77
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_F77
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_F77
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_F77
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_F77
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_F77
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_F77
+archive_expsym_cmds=$lt_archive_expsym_cmds_F77
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_F77
+module_expsym_cmds=$lt_module_expsym_cmds_F77
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_F77
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_F77
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_F77
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_F77
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_F77
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_F77
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_F77
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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_F77
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_F77
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_F77
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_F77
+
+# 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_F77
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_F77
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_F77"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_F77
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_F77
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_F77
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_F77
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+
+
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+objext_GCJ=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}\n"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }\n'
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+compiler_GCJ=$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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+archive_cmds_need_lc_GCJ=no
+
+old_archive_cmds_GCJ=$old_archive_cmds
+
+
+lt_prog_compiler_no_builtin_flag_GCJ=
+
+if test "$GCC" = yes; then
+ lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin'
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+echo $ECHO_N "checking if $compiler supports -fno-rtti -fno-exceptions... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_rtti_exceptions=no
+ ac_outfile=conftest.$ac_objext
+ printf "$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:27146: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:27150: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_rtti_exceptions" >&6
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+ lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions"
+else
+ :
+fi
+
+fi
+
+lt_prog_compiler_wl_GCJ=
+lt_prog_compiler_pic_GCJ=
+lt_prog_compiler_static_GCJ=
+
+echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5
+echo $ECHO_N "checking for $compiler option to produce PIC... $ECHO_C" >&6
+
+ if test "$GCC" = yes; then
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_static_GCJ='-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_GCJ='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # 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_GCJ='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | cygwin* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_GCJ='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ lt_prog_compiler_pic_GCJ='-fno-common'
+ ;;
+
+ interix3*)
+ # 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_GCJ=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ lt_prog_compiler_pic_GCJ=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # 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_GCJ='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ lt_prog_compiler_pic_GCJ='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ else
+ lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ lt_prog_compiler_pic_GCJ='-qnocommon'
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | pw32* | os2*)
+ # 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_GCJ='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ lt_prog_compiler_wl_GCJ='-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_GCJ='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # PIC (with -KPIC) is the default.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ newsos6)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ linux*)
+ case $cc_basename in
+ icc* | ecc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-fpic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+ ccc*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All Alpha code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ # All OSF/1 code is PIC.
+ lt_prog_compiler_static_GCJ='-non_shared'
+ ;;
+
+ solaris*)
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld ';;
+ *)
+ lt_prog_compiler_wl_GCJ='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ lt_prog_compiler_wl_GCJ='-Qoption ld '
+ lt_prog_compiler_pic_GCJ='-PIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ lt_prog_compiler_pic_GCJ='-Kconform_pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_pic_GCJ='-KPIC'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ unicos*)
+ lt_prog_compiler_wl_GCJ='-Wl,'
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+
+ uts4*)
+ lt_prog_compiler_pic_GCJ='-pic'
+ lt_prog_compiler_static_GCJ='-Bstatic'
+ ;;
+
+ *)
+ lt_prog_compiler_can_build_shared_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_GCJ" >&6
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_GCJ"; then
+
+echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5
+echo $ECHO_N "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... $ECHO_C" >&6
+if test "${lt_prog_compiler_pic_works_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_pic_works_GCJ=no
+ ac_outfile=conftest.$ac_objext
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$lt_prog_compiler_pic_GCJ"
+ # 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:27414: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&5
+ echo "$as_me:27418: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_pic_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_pic_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_pic_works_GCJ" = xyes; then
+ case $lt_prog_compiler_pic_GCJ in
+ "" | " "*) ;;
+ *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;;
+ esac
+else
+ lt_prog_compiler_pic_GCJ=
+ lt_prog_compiler_can_build_shared_GCJ=no
+fi
+
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ lt_prog_compiler_pic_GCJ=
+ ;;
+ *)
+ lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\"
+echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+echo $ECHO_N "checking if $compiler static flag $lt_tmp_static_flag works... $ECHO_C" >&6
+if test "${lt_prog_compiler_static_works_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_prog_compiler_static_works_GCJ=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+ printf "$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 "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ lt_prog_compiler_static_works_GCJ=yes
+ fi
+ else
+ lt_prog_compiler_static_works_GCJ=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+
+fi
+echo "$as_me:$LINENO: result: $lt_prog_compiler_static_works_GCJ" >&5
+echo "${ECHO_T}$lt_prog_compiler_static_works_GCJ" >&6
+
+if test x"$lt_prog_compiler_static_works_GCJ" = xyes; then
+ :
+else
+ lt_prog_compiler_static_GCJ=
+fi
+
+
+echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5
+echo $ECHO_N "checking if $compiler supports -c -o file.$ac_objext... $ECHO_C" >&6
+if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ lt_cv_prog_compiler_c_o_GCJ=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ printf "$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:27518: $lt_compile\"" >&5)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&5
+ echo "$as_me:27522: \$? = $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 "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/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_GCJ=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 ..
+ rmdir conftest
+ $rm conftest*
+
+fi
+echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5
+echo "${ECHO_T}$lt_cv_prog_compiler_c_o_GCJ" >&6
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ echo "$as_me:$LINENO: checking if we can lock with hard links" >&5
+echo $ECHO_N "checking if we can lock with hard links... $ECHO_C" >&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
+ echo "$as_me:$LINENO: result: $hard_links" >&5
+echo "${ECHO_T}$hard_links" >&6
+ if test "$hard_links" = no; then
+ { echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+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
+
+echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+echo $ECHO_N "checking whether the $compiler linker ($LD) supports shared libraries... $ECHO_C" >&6
+
+ runpath_var=
+ allow_undefined_flag_GCJ=
+ enable_shared_with_static_runtimes_GCJ=no
+ archive_cmds_GCJ=
+ archive_expsym_cmds_GCJ=
+ old_archive_From_new_cmds_GCJ=
+ old_archive_from_expsyms_cmds_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ thread_safe_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_GCJ=
+ hardcode_libdir_flag_spec_ld_GCJ=
+ hardcode_libdir_separator_GCJ=
+ hardcode_direct_GCJ=no
+ hardcode_minus_L_GCJ=no
+ hardcode_shlibpath_var_GCJ=unsupported
+ link_all_deplibs_GCJ=unknown
+ hardcode_automatic_GCJ=no
+ module_cmds_GCJ=
+ module_expsym_cmds_GCJ=
+ always_export_symbols_GCJ=no
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ include_expsyms_GCJ=
+ # 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_GCJ="_GLOBAL_OFFSET_TABLE_"
+ # 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.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ for cc_temp in $compiler""; do
+ case $cc_temp in
+ compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+ distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+ 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_GCJ=yes
+ if test "$with_gnu_ld" = 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_GCJ='${wl}--rpath ${wl}$libdir'
+ export_dynamic_flag_spec_GCJ='${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_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ whole_archive_flag_spec_GCJ=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [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
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ ld_shlibs_GCJ=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, 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 modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ archive_cmds_GCJ='$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_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=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 can't use
+ # them.
+ ld_shlibs_GCJ=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ allow_undefined_flag_GCJ=unsupported
+ # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless,
+ # as there is no search path for DLLs.
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=no
+ enable_shared_with_static_runtimes_GCJ=yes
+ export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS] /s/.* \([^ ]*\)/\1 DATA/'\'' | $SED -e '\''/^[AITW] /s/.* //'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ archive_cmds_GCJ='$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_GCJ='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_GCJ=no
+ fi
+ ;;
+
+ interix3*)
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${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_GCJ='$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_GCJ='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'
+ ;;
+
+ linux*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$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' ;;
+ esac
+ archive_cmds_GCJ='$CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC -shared'"$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $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_GCJ=no
+ cat <<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.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+ ld_shlibs_GCJ=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
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ ld_shlibs_GCJ=no
+ fi
+ ;;
+ esac
+
+ if test "$ld_shlibs_GCJ" = no; then
+ runpath_var=
+ hardcode_libdir_flag_spec_GCJ=
+ export_dynamic_flag_spec_GCJ=
+ whole_archive_flag_spec_GCJ=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ allow_undefined_flag_GCJ=unsupported
+ always_export_symbols_GCJ=yes
+ archive_expsym_cmds_GCJ='$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_GCJ=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_GCJ=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
+ 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
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols'
+ else
+ export_symbols_cmds_GCJ='$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].*|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
+
+ 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_GCJ=''
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+
+ 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
+ hardcode_direct_GCJ=yes
+ else
+ # We have old collect2
+ hardcode_direct_GCJ=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_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_libdir_separator_GCJ=
+ 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
+
+ # 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_GCJ=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_GCJ='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath"
+ archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${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_GCJ='${wl}-R $libdir:/usr/lib:/lib'
+ allow_undefined_flag_GCJ="-z nodefs"
+ archive_expsym_cmds_GCJ="\$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.
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+ (eval $ac_link) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
+}'`; fi
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+
+ hardcode_libdir_flag_spec_GCJ='${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_GCJ=' ${wl}-bernotok'
+ allow_undefined_flag_GCJ=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ whole_archive_flag_spec_GCJ='$convenience'
+ archive_cmds_need_lc_GCJ=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ archive_expsym_cmds_GCJ="\$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*)
+ archive_cmds_GCJ='$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_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ # see comment about different semantics on the GNU ld section
+ ld_shlibs_GCJ=no
+ ;;
+
+ bsdi[45]*)
+ export_dynamic_flag_spec_GCJ=-rdynamic
+ ;;
+
+ 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_GCJ=' '
+ allow_undefined_flag_GCJ=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_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ old_archive_From_new_cmds_GCJ='true'
+ # FIXME: Should let the user specify the lib program.
+ old_archive_cmds_GCJ='lib /OUT:$oldlib$oldobjs$old_deplibs'
+ fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`'
+ enable_shared_with_static_runtimes_GCJ=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[012])
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[012])
+ allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ archive_cmds_need_lc_GCJ=no
+ hardcode_direct_GCJ=no
+ hardcode_automatic_GCJ=yes
+ hardcode_shlibpath_var_GCJ=unsupported
+ whole_archive_flag_spec_GCJ=''
+ link_all_deplibs_GCJ=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $verstring'
+ module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ freebsd1*)
+ ld_shlibs_GCJ=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_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | kfreebsd*-gnu | dragonfly*)
+ archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${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_GCJ='$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_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_direct_GCJ=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$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_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared -fPIC ${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_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ archive_cmds_GCJ='$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
+ hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ hardcode_libdir_flag_spec_ld_GCJ='+b $libdir'
+ hardcode_direct_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+ *)
+ hardcode_direct_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ hardcode_minus_L_GCJ=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ link_all_deplibs_GCJ=yes
+ ;;
+
+ netbsd*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ newsos6)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ openbsd*)
+ hardcode_direct_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ export_dynamic_flag_spec_GCJ='${wl}-E'
+ else
+ case $host_os in
+ openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+ archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ ;;
+ *)
+ archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ ;;
+
+ os2*)
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_minus_L_GCJ=yes
+ allow_undefined_flag_GCJ=unsupported
+ archive_cmds_GCJ='$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_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*'
+ archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir'
+ else
+ allow_undefined_flag_GCJ=' -expect_unresolved \*'
+ archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_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_GCJ='-rpath $libdir'
+ fi
+ hardcode_libdir_separator_GCJ=:
+ ;;
+
+ solaris*)
+ no_undefined_flag_GCJ=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ archive_expsym_cmds_GCJ='$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'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-R$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ case $host_os in
+ solaris2.[0-5] | solaris2.[0-5].*) ;;
+ *)
+ # The compiler driver will combine linker options so we
+ # cannot just pass the convience library names through
+ # without $wl, iff we do not link with $LD.
+ # Luckily, gcc supports the same syntax we need for Sun Studio.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ case $wlarc in
+ '')
+ whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' ;;
+ *)
+ whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}-z ${wl}defaultextract' ;;
+ esac ;;
+ esac
+ link_all_deplibs_GCJ=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_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_direct_GCJ=yes
+ hardcode_minus_L_GCJ=yes
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ reload_cmds_GCJ='$CC -r -o $output$reload_objs'
+ hardcode_direct_GCJ=no
+ ;;
+ motorola)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ sysv4.3*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ export_dynamic_flag_spec_GCJ='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ ld_shlibs_GCJ=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7*)
+ no_undefined_flag_GCJ='${wl}-z,text'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$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_GCJ='${wl}-z,text'
+ allow_undefined_flag_GCJ='${wl}-z,nodefs'
+ archive_cmds_need_lc_GCJ=no
+ hardcode_shlibpath_var_GCJ=no
+ hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ hardcode_libdir_separator_GCJ=':'
+ link_all_deplibs_GCJ=yes
+ export_dynamic_flag_spec_GCJ='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ hardcode_libdir_flag_spec_GCJ='-L$libdir'
+ hardcode_shlibpath_var_GCJ=no
+ ;;
+
+ *)
+ ld_shlibs_GCJ=no
+ ;;
+ esac
+ fi
+
+echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5
+echo "${ECHO_T}$ld_shlibs_GCJ" >&6
+test "$ld_shlibs_GCJ" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_GCJ" in
+x|xyes)
+ # Assume -lc should be added
+ archive_cmds_need_lc_GCJ=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $archive_cmds_GCJ 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.
+ echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5
+echo $ECHO_N "checking whether -lc should be explicitly linked in... $ECHO_C" >&6
+ $rm conftest*
+ printf "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$lt_prog_compiler_wl_GCJ
+ pic_flag=$lt_prog_compiler_pic_GCJ
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ
+ allow_undefined_flag_GCJ=
+ if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5
+ (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }
+ then
+ archive_cmds_need_lc_GCJ=no
+ else
+ archive_cmds_need_lc_GCJ=yes
+ fi
+ allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5
+echo "${ECHO_T}$archive_cmds_need_lc_GCJ" >&6
+ ;;
+ esac
+ fi
+ ;;
+esac
+
+echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5
+echo $ECHO_N "checking dynamic linker characteristics... $ECHO_C" >&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"
+if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
+ # 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.
+ 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
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+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
+ 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'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ 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*)
+ 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=`$echo "X$lib" | $Xsed -e '\''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'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[45]*)
+ version_type=linux
+ 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*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ 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'
+ 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="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ 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
+ ;;
+ 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
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # 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}${versuffix}$shared_ext ${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`'
+ # Apple's gcc prints 'gcc -print-search-dirs' doesn't operate the same.
+ if test "$GCC" = yes; then
+ sys_lib_search_path_spec=`$CC -print-search-dirs | tr "\n" "$PATH_SEPARATOR" | sed -e 's/libraries:/@libraries:/' | tr "@" "\n" | grep "^libraries:" | sed -e "s/^libraries://" -e "s,=/,/,g" -e "s,$PATH_SEPARATOR, ,g" -e "s,.*,& /lib /usr/lib /usr/local/lib,g"`
+ else
+ sys_lib_search_path_spec='/lib /usr/lib /usr/local/lib'
+ fi
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ 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
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+kfreebsd*-gnu)
+ version_type=linux
+ 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='GNU ld.so'
+ ;;
+
+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[123]*) 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
+ ;;
+ freebsd*) # from 4.6 on
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ 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
+ 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'
+ ;;
+
+interix3*)
+ version_type=linux
+ 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
+ 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 Linux ELF.
+linux*)
+ version_type=linux
+ 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
+ # 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)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;s/[:, ]/ /g;s/=[^=]*$//;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'
+ ;;
+
+knetbsd*-gnu)
+ version_type=linux
+ 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='GNU 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
+ 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=linux
+ 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
+ ;;
+
+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"
+ ;;
+
+solaris*)
+ version_type=linux
+ 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
+ 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
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ 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
+ 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
+ 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'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ 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'
+ ;;
+
+uts4*)
+ version_type=linux
+ 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
+echo "$as_me:$LINENO: result: $dynamic_linker" >&5
+echo "${ECHO_T}$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
+
+echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5
+echo $ECHO_N "checking how to hardcode library paths into programs... $ECHO_C" >&6
+hardcode_action_GCJ=
+if test -n "$hardcode_libdir_flag_spec_GCJ" || \
+ test -n "$runpath_var_GCJ" || \
+ test "X$hardcode_automatic_GCJ" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$hardcode_direct_GCJ" != 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_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no &&
+ test "$hardcode_minus_L_GCJ" != no; then
+ # Linking always hardcodes the temporary library directory.
+ hardcode_action_GCJ=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ hardcode_action_GCJ=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ hardcode_action_GCJ=unsupported
+fi
+echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5
+echo "${ECHO_T}$hardcode_action_GCJ" >&6
+
+if test "$hardcode_action_GCJ" = relink; 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
+
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_GCJ \
+ CC_GCJ \
+ LD_GCJ \
+ lt_prog_compiler_wl_GCJ \
+ lt_prog_compiler_pic_GCJ \
+ lt_prog_compiler_static_GCJ \
+ lt_prog_compiler_no_builtin_flag_GCJ \
+ export_dynamic_flag_spec_GCJ \
+ thread_safe_flag_spec_GCJ \
+ whole_archive_flag_spec_GCJ \
+ enable_shared_with_static_runtimes_GCJ \
+ old_archive_cmds_GCJ \
+ old_archive_from_new_cmds_GCJ \
+ predep_objects_GCJ \
+ postdep_objects_GCJ \
+ predeps_GCJ \
+ postdeps_GCJ \
+ compiler_lib_search_path_GCJ \
+ archive_cmds_GCJ \
+ archive_expsym_cmds_GCJ \
+ postinstall_cmds_GCJ \
+ postuninstall_cmds_GCJ \
+ old_archive_from_expsyms_cmds_GCJ \
+ allow_undefined_flag_GCJ \
+ no_undefined_flag_GCJ \
+ export_symbols_cmds_GCJ \
+ hardcode_libdir_flag_spec_GCJ \
+ hardcode_libdir_flag_spec_ld_GCJ \
+ hardcode_libdir_separator_GCJ \
+ hardcode_automatic_GCJ \
+ module_cmds_GCJ \
+ module_expsym_cmds_GCJ \
+ lt_cv_prog_compiler_c_o_GCJ \
+ exclude_expsyms_GCJ \
+ include_expsyms_GCJ; do
+
+ case $var in
+ old_archive_cmds_GCJ | \
+ old_archive_from_new_cmds_GCJ | \
+ archive_cmds_GCJ | \
+ archive_expsym_cmds_GCJ | \
+ module_cmds_GCJ | \
+ module_expsym_cmds_GCJ | \
+ old_archive_from_expsyms_cmds_GCJ | \
+ export_symbols_cmds_GCJ | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_GCJ
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_GCJ
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_GCJ
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_GCJ
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_GCJ
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_GCJ
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_GCJ
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_GCJ
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_GCJ
+archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_GCJ
+module_expsym_cmds=$lt_module_expsym_cmds_GCJ
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_GCJ
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_GCJ
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_GCJ
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_GCJ
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_GCJ
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_GCJ
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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_GCJ
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_GCJ
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_GCJ
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ
+
+# 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_GCJ
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_GCJ
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_GCJ"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_GCJ
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_GCJ
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_GCJ
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_GCJ
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+
+
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+objext_RC=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }\n'
+
+# 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.
+
+# 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
+printf "$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
+printf "$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 conftest*
+
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+compiler_RC=$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 "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+
+lt_cv_prog_compiler_c_o_RC=yes
+
+# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # 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
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ compiler_RC \
+ CC_RC \
+ LD_RC \
+ lt_prog_compiler_wl_RC \
+ lt_prog_compiler_pic_RC \
+ lt_prog_compiler_static_RC \
+ lt_prog_compiler_no_builtin_flag_RC \
+ export_dynamic_flag_spec_RC \
+ thread_safe_flag_spec_RC \
+ whole_archive_flag_spec_RC \
+ enable_shared_with_static_runtimes_RC \
+ old_archive_cmds_RC \
+ old_archive_from_new_cmds_RC \
+ predep_objects_RC \
+ postdep_objects_RC \
+ predeps_RC \
+ postdeps_RC \
+ compiler_lib_search_path_RC \
+ archive_cmds_RC \
+ archive_expsym_cmds_RC \
+ postinstall_cmds_RC \
+ postuninstall_cmds_RC \
+ old_archive_from_expsyms_cmds_RC \
+ allow_undefined_flag_RC \
+ no_undefined_flag_RC \
+ export_symbols_cmds_RC \
+ hardcode_libdir_flag_spec_RC \
+ hardcode_libdir_flag_spec_ld_RC \
+ hardcode_libdir_separator_RC \
+ hardcode_automatic_RC \
+ module_cmds_RC \
+ module_expsym_cmds_RC \
+ lt_cv_prog_compiler_c_o_RC \
+ exclude_expsyms_RC \
+ include_expsyms_RC; do
+
+ case $var in
+ old_archive_cmds_RC | \
+ old_archive_from_new_cmds_RC | \
+ archive_cmds_RC | \
+ archive_expsym_cmds_RC | \
+ module_cmds_RC | \
+ module_expsym_cmds_RC | \
+ old_archive_from_expsyms_cmds_RC | \
+ export_symbols_cmds_RC | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\$0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'`
+ ;;
+ esac
+
+cfgfile="$ofile"
+
+ cat <<__EOF__ >> "$cfgfile"
+# ### BEGIN LIBTOOL TAG CONFIG: $tagname
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_RC
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# 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
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_compiler_RC
+
+# Is the compiler the GNU C compiler?
+with_gcc=$GCC_RC
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_LD_RC
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_RC
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_RC
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# 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
+
+# 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
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_RC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC
+
+# Library versioning type.
+version_type=$version_type
+
+# 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
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_old_archive_cmds_RC
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_archive_cmds_RC
+archive_expsym_cmds=$lt_archive_expsym_cmds_RC
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_module_cmds_RC
+module_expsym_cmds=$lt_module_expsym_cmds_RC
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_predep_objects_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_postdep_objects_RC
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_predeps_RC
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_postdeps_RC
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_RC
+
+# 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
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_RC
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_RC
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# 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
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_RC
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# 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_RC
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$hardcode_direct_RC
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$hardcode_minus_L_RC
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_RC
+
+# 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_RC
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_RC
+
+# 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
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path="$fix_srcfile_path_RC"
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$always_export_symbols_RC
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_RC
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_RC
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_RC
+
+# ### END LIBTOOL TAG CONFIG: $tagname
+
+__EOF__
+
+
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+
+
+ac_ext=cc
+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"
+
+ ;;
+
+ *)
+ { { echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5
+echo "$as_me: error: Unsupported tag name: $tagname" >&2;}
+ { (exit 1); exit 1; }; }
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ { { echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5
+echo "$as_me: error: unable to update list of available tagged configurations." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+fi
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+# Prevent multiple expansion
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+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
+echo "$as_me:$LINENO: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MD5SUM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+ ac_cv_prog_MD5SUM="md5sum"
+ echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+ break 2
+ fi
+done
+done
+
+fi
+fi
+MD5SUM=$ac_cv_prog_MD5SUM
+if test -n "$MD5SUM"; then
+ echo "$as_me:$LINENO: result: $MD5SUM" >&5
+echo "${ECHO_T}$MD5SUM" >&6
+else
+ echo "$as_me:$LINENO: result: no" >&5
+echo "${ECHO_T}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
+
+echo "$as_me:$LINENO: checking for the text md5sum command" >&5
+echo $ECHO_N "checking for the text md5sum command... $ECHO_C" >&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
+echo "$as_me:$LINENO: result: $ac_cv_prog_text_md5sum" >&5
+echo "${ECHO_T}$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
+
+if test "${ac_cv_header_glpk_h+set}" = set; then
+ echo "$as_me:$LINENO: checking for glpk.h" >&5
+echo $ECHO_N "checking for glpk.h... $ECHO_C" >&6
+if test "${ac_cv_header_glpk_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_glpk_h" >&5
+echo "${ECHO_T}$ac_cv_header_glpk_h" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking glpk.h usability" >&5
+echo $ECHO_N "checking glpk.h usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <glpk.h>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_c_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking glpk.h presence" >&5
+echo $ECHO_N "checking glpk.h presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <glpk.h>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_c_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: glpk.h: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: glpk.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: glpk.h: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: glpk.h: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: glpk.h: present but cannot be compiled" >&5
+echo "$as_me: WARNING: glpk.h: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: glpk.h: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: glpk.h: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: glpk.h: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: glpk.h: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: glpk.h: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: glpk.h: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: glpk.h: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: glpk.h: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: glpk.h: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: glpk.h: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for glpk.h" >&5
+echo $ECHO_N "checking for glpk.h... $ECHO_C" >&6
+if test "${ac_cv_header_glpk_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_header_glpk_h=$ac_header_preproc
+fi
+echo "$as_me:$LINENO: result: $ac_cv_header_glpk_h" >&5
+echo "${ECHO_T}$ac_cv_header_glpk_h" >&6
+
+fi
+if test $ac_cv_header_glpk_h = yes; then
+ HAVE_GLPK_H=yes
+fi
+
+
+
+
+if test x$HAVE_GLPK_H = xyes; then
+ HAVE_GLPK_TRUE=
+ HAVE_GLPK_FALSE='#'
+else
+ HAVE_GLPK_TRUE='#'
+ HAVE_GLPK_FALSE=
+fi
+
+ac_ext=cc
+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 files.
+
+
+
+
+
+
+
+
+for ac_header in fenv.h ieeefp.h getopt.h signal.h sys/resource.h sys/time.h sys/types.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+else
+ # Is the header compilable?
+echo "$as_me:$LINENO: checking $ac_header usability" >&5
+echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_header_compiler=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_header_compiler=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
+echo "${ECHO_T}$ac_header_compiler" >&6
+
+# Is the header present?
+echo "$as_me:$LINENO: checking $ac_header presence" >&5
+echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_cxx_preproc_warn_flag
+ ac_cpp_err=$ac_cpp_err$ac_cxx_werror_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_header_preproc=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_header_preproc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
+echo "${ECHO_T}$ac_header_preproc" >&6
+
+# So? What about this header?
+case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in
+ yes:no: )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5
+echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;}
+ ac_header_preproc=yes
+ ;;
+ no:yes:* )
+ { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5
+echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5
+echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5
+echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5
+echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5
+echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;}
+ { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5
+echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;}
+ (
+ cat <<\_ASBOX
+## ------------------------------------ ##
+## Report this to ppl-devel at cs.unipr.it ##
+## ------------------------------------ ##
+_ASBOX
+ ) |
+ sed "s/^/$as_me: WARNING: /" >&2
+ ;;
+esac
+echo "$as_me:$LINENO: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ eval "$as_ac_Header=\$ac_header_preproc"
+fi
+echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+
+fi
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<_ACEOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+# Checks for header declarations.
+echo "$as_me:$LINENO: checking whether RLIMIT_DATA is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_DATA is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_DATA+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_DATA
+ char *p = (char *) RLIMIT_DATA;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_RLIMIT_DATA=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_DATA=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_DATA" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_DATA" >&6
+if test $ac_cv_have_decl_RLIMIT_DATA = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_DATA 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether RLIMIT_RSS is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_RSS is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_RSS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_RSS
+ char *p = (char *) RLIMIT_RSS;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_RLIMIT_RSS=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_RSS=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_RSS" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_RSS" >&6
+if test $ac_cv_have_decl_RLIMIT_RSS = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_RSS 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether RLIMIT_VMEM is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_VMEM is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_VMEM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_VMEM
+ char *p = (char *) RLIMIT_VMEM;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_RLIMIT_VMEM=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_VMEM=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_VMEM" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_VMEM" >&6
+if test $ac_cv_have_decl_RLIMIT_VMEM = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_VMEM 0
+_ACEOF
+
+
+fi
+echo "$as_me:$LINENO: checking whether RLIMIT_AS is declared" >&5
+echo $ECHO_N "checking whether RLIMIT_AS is declared... $ECHO_C" >&6
+if test "${ac_cv_have_decl_RLIMIT_AS+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h. */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h. */
+
+#ifdef HAVE_SYS_RESOURCE_H
+# include <sys/resource.h>
+#endif
+
+
+int
+main ()
+{
+#ifndef RLIMIT_AS
+ char *p = (char *) RLIMIT_AS;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>conftest.er1
+ ac_status=$?
+ grep -v '^ *+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -z "$ac_cxx_werror_flag"
+ || test ! -s conftest.err'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_have_decl_RLIMIT_AS=yes
+else
+ echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_have_decl_RLIMIT_AS=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_have_decl_RLIMIT_AS" >&5
+echo "${ECHO_T}$ac_cv_have_decl_RLIMIT_AS" >&6
+if test $ac_cv_have_decl_RLIMIT_AS = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS 1
+_ACEOF
+
+
+else
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_RLIMIT_AS 0
+_ACEOF
+
+
+fi
+
+
+
+# Checks for typedefs, structures, and compiler characteristics.
+# Nothing for the time being.
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+ CFLAGS="-W -Wall $CFLAGS"
+fi
+if test x"$GXX" = xyes
+then
+ CXXFLAGS="-W -Wall $CXXFLAGS"
+fi
+
+# System-dependent adjustments.
+cygwin=no
+darwin=no
+solaris=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+ if test x"$GCC" = xyes
+ then
+ CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee"
+ CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee"
+ else
+ CFLAGS="$CFLAGS -fprm d -ieee -underflow_to_zero"
+ CXXFLAGS="$CXXFLAGS -fprm d -ieee -underflow_to_zero"
+ fi
+ ;;
+*)
+ ;;
+esac
+
+case "${host_os}" in
+cygwin)
+ cygwin=yes
+ no_undefined=yes
+ ;;
+darwin*)
+ darwin=yes
+ if test x"$GCC" = xyes
+ then
+ CFLAGS="$CFLAGS -Wno-long-double"
+ CXXFLAGS="$CXXFLAGS -Wno-long-double"
+ fi
+ ;;
+solaris*)
+ solaris=yes
+ ;;
+*)
+ ;;
+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$solaris = xyes; then
+ HOST_OS_SOLARIS_TRUE=
+ HOST_OS_SOLARIS_FALSE='#'
+else
+ HOST_OS_SOLARIS_TRUE='#'
+ HOST_OS_SOLARIS_FALSE=
+fi
+
+
+
+if test x$no_undefined = xyes; then
+ NO_UNDEFINED_TRUE=
+ NO_UNDEFINED_FALSE='#'
+else
+ NO_UNDEFINED_TRUE='#'
+ NO_UNDEFINED_FALSE=
+fi
+
+
+
+
+
+
+
+ ac_config_files="$ac_config_files Makefile ppl.lsm ppl.spec debian/Makefile debian/libppl.copyright debian/libppl-pwl.copyright src/ [...]
+
+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, don't put newlines in cache variables' values.
+# 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.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *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 \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if diff $cache_file confcache >/dev/null 2>&1; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ 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}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ 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[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+ac_libobjs=
+ac_ltlibobjs=
+for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
+ # 1. Remove the extension, and $U if already installed.
+ ac_i=`echo "$ac_i" |
+ sed 's/\$U\././;s/\.o$//;s/\.obj$//'`
+ # 2. Add them.
+ ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext"
+ ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+if test -z "${ASSERTIONS_ENABLED_TRUE}" && test -z "${ASSERTIONS_ENABLED_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ASSERTIONS_ENABLED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_PRECOMPILED_HEADERS_TRUE}" && test -z "${USE_PRECOMPILED_HEADERS_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_PRECOMPILED_HEADERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_NATIVE_INTEGERS_TRUE}" && test -z "${USE_NATIVE_INTEGERS_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_NATIVE_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_CHECKED_INTEGERS_TRUE}" && test -z "${USE_CHECKED_INTEGERS_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_CHECKED_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_GMP_INTEGERS_TRUE}" && test -z "${USE_GMP_INTEGERS_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_GMP_INTEGERS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT8_TRUE}" && test -z "${USE_INT8_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT8\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT16_TRUE}" && test -z "${USE_INT16_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT16\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT32_TRUE}" && test -z "${USE_INT32_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT32\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${USE_INT64_TRUE}" && test -z "${USE_INT64_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"USE_INT64\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_PERL_TRUE}" && test -z "${HAVE_PERL_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_PERL\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${CAN_CONTROL_FPU_TRUE}" && test -z "${CAN_CONTROL_FPU_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"CAN_CONTROL_FPU\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_FLOAT_TRUE}" && test -z "${SUPPORTED_FLOAT_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_FLOAT\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_DOUBLE_TRUE}" && test -z "${SUPPORTED_DOUBLE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${SUPPORTED_LONG_DOUBLE_TRUE}" && test -z "${SUPPORTED_LONG_DOUBLE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"SUPPORTED_LONG_DOUBLE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_WATCHDOG_LIBRARY_TRUE}" && test -z "${BUILD_WATCHDOG_LIBRARY_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_WATCHDOG_LIBRARY\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_C_INTERFACE_TRUE}" && test -z "${BUILD_C_INTERFACE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_C_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_CIAO_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_CIAO_PROLOG_INTERFACE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_CIAO_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_GNU_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_GNU_PROLOG_INTERFACE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_GNU_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SICSTUS_PROLOG_INTERFACE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_SICSTUS_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_SWI_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_SWI_PROLOG_INTERFACE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_SWI_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_XSB_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_XSB_PROLOG_INTERFACE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_XSB_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${BUILD_YAP_PROLOG_INTERFACE_TRUE}" && test -z "${BUILD_YAP_PROLOG_INTERFACE_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"BUILD_YAP_PROLOG_INTERFACE\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_SHARED_TRUE}" && test -z "${ENABLE_SHARED_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_SHARED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"ENABLE_STATIC\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_MD5SUM_TRUE}" && test -z "${HAVE_MD5SUM_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_MD5SUM\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HAVE_GLPK_TRUE}" && test -z "${HAVE_GLPK_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HAVE_GLPK\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_CYGWIN_TRUE}" && test -z "${HOST_OS_CYGWIN_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_CYGWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_DARWIN_TRUE}" && test -z "${HOST_OS_DARWIN_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_DARWIN\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${HOST_OS_SOLARIS_TRUE}" && test -z "${HOST_OS_SOLARIS_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"HOST_OS_SOLARIS\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+if test -z "${NO_UNDEFINED_TRUE}" && test -z "${NO_UNDEFINED_FALSE}"; then
+ { { echo "$as_me:$LINENO: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&5
+echo "$as_me: error: conditional \"NO_UNDEFINED\" was never defined.
+Usually this means the macro was only invoked conditionally." >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $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}
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+## --------------------- ##
+## M4sh Initialization. ##
+## --------------------- ##
+
+# 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+"$@"}'='"$@"'
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# Support unset when possible.
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+
+# Work around bugs in pre-3.0 UWIN ksh.
+$as_unset ENV MAIL MAILPATH
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+for as_var in \
+ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
+ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
+ LC_TELEPHONE LC_TIME
+do
+ if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
+ eval $as_var=C; export $as_var
+ else
+ $as_unset $as_var
+ fi
+done
+
+# Required to use basename.
+if expr a : '\(a\)' >/dev/null 2>&1; 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
+
+
+# Name of the executable.
+as_me=`$as_basename "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)$' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; }
+ /^X\/\(\/\/\)$/{ s//\1/; q; }
+ /^X\/\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+
+
+# PATH needs CR, and LINENO needs CR and PATH.
+# 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
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+
+
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" || {
+ # Find who we are. Look in the path if we contain no path at all
+ # relative or not.
+ 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
+
+ ;;
+ 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
+ { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5
+echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ case $CONFIG_SHELL in
+ '')
+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for as_base in sh bash ksh sh5; do
+ case $as_dir in
+ /*)
+ if ("$as_dir/$as_base" -c '
+ as_lineno_1=$LINENO
+ as_lineno_2=$LINENO
+ as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null`
+ test "x$as_lineno_1" != "x$as_lineno_2" &&
+ test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then
+ $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; }
+ $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; }
+ CONFIG_SHELL=$as_dir/$as_base
+ export CONFIG_SHELL
+ exec "$CONFIG_SHELL" "$0" ${1+"$@"}
+ fi;;
+ esac
+ done
+done
+;;
+ esac
+
+ # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
+ # uniformly replaced by the line number. The first 'sed' inserts a
+ # line-number line before each line; the second 'sed' does the real
+ # work. The second script uses 'N' to pair each line-number line
+ # with the numbered line, and appends trailing '-' during
+ # substitution so that $LINENO is not a special case at line end.
+ # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
+ # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-)
+ sed '=' <$as_myself |
+ sed '
+ N
+ s,$,-,
+ : loop
+ s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3,
+ t loop
+ s,-$,,
+ s,^['$as_cr_digits']*\n,,
+ ' >$as_me.lineno &&
+ chmod +x $as_me.lineno ||
+ { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5
+echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;}
+ { (exit 1); exit 1; }; }
+
+ # 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 sensible to this).
+ . ./$as_me.lineno
+ # Exit status is that of the last command.
+ exit
+}
+
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+if mkdir -p . 2>/dev/null; then
+ as_mkdir_p=:
+else
+ test -d ./-p && rmdir ./-p
+ as_mkdir_p=false
+fi
+
+as_executable_p="test -f"
+
+# 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'"
+
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH
+
+exec 6>&1
+
+# Open the log real soon, to keep \$[0] and so on meaningful, and to
+# report actual input values of CONFIG_FILES etc. instead of their
+# values after options handling. Logging --version etc. is OK.
+exec 5>>config.log
+{
+ echo
+ sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+} >&5
+cat >&5 <<_CSEOF
+
+This file was extended by the Parma Polyhedra Library $as_me 0.9, which was
+generated by GNU Autoconf 2.59. Invocation command line was
+
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ $ $0 $@
+
+_CSEOF
+echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5
+echo >&5
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -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
+ --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 <bug-autoconf at gnu.org>."
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+ac_cs_version="\\
+the Parma Polyhedra Library config.status 0.9
+configured by $0, generated by GNU Autoconf 2.59,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright (C) 2003 Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+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=$1
+ ac_optarg=$2
+ ac_shift=shift
+ ;;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_option=$1
+ ac_need_defaults=false;;
+ esac
+
+ case $ac_option in
+ # Handling of the options.
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ ac_cs_recheck=: ;;
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:$LINENO: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ $ac_shift
+ CONFIG_FILES="$CONFIG_FILES $ac_optarg"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ $ac_shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
+ ac_need_defaults=false;;
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil | --si | --s)
+ ac_cs_silent=: ;;
+
+ # This is an error.
+ -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ 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
+if \$ac_cs_recheck; then
+ echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
+ exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+fi
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+#
+# INIT-COMMANDS section.
+#
+
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+_ACEOF
+
+
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+ "ppl.lsm" ) CONFIG_FILES="$CONFIG_FILES ppl.lsm" ;;
+ "ppl.spec" ) CONFIG_FILES="$CONFIG_FILES ppl.spec" ;;
+ "debian/Makefile" ) CONFIG_FILES="$CONFIG_FILES debian/Makefile" ;;
+ "debian/libppl.copyright" ) CONFIG_FILES="$CONFIG_FILES debian/libppl.copyright" ;;
+ "debian/libppl-pwl.copyright" ) CONFIG_FILES="$CONFIG_FILES debian/libppl-pwl.copyright" ;;
+ "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/Polyhedron/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Polyhedron/Makefile" ;;
+ "tests/Grid/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Grid/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" ;;
+ "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" ;;
+ "interfaces/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/Makefile" ;;
+ "interfaces/C/Makefile" ) CONFIG_FILES="$CONFIG_FILES interfaces/C/Makefile" ;;
+ "interfaces/C/ppl_c.h" ) CONFIG_FILES="$CONFIG_FILES interfaces/C/ppl_c.h" ;;
+ "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" ;;
+ "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+ "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
+ *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ 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 to put it here, and in addition,
+# creating and moving files from /tmp can sometimes cause problems.
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+
+{
+ tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=./confstat$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in ." >&2
+ { (exit 1); exit 1; }
+}
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<_ACEOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s, at SHELL@,$SHELL,;t t
+s, at PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s, at PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s, at PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s, at PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s, at PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s, at PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s, at exec_prefix@,$exec_prefix,;t t
+s, at prefix@,$prefix,;t t
+s, at program_transform_name@,$program_transform_name,;t t
+s, at bindir@,$bindir,;t t
+s, at sbindir@,$sbindir,;t t
+s, at libexecdir@,$libexecdir,;t t
+s, at datadir@,$datadir,;t t
+s, at sysconfdir@,$sysconfdir,;t t
+s, at sharedstatedir@,$sharedstatedir,;t t
+s, at localstatedir@,$localstatedir,;t t
+s, at libdir@,$libdir,;t t
+s, at includedir@,$includedir,;t t
+s, at oldincludedir@,$oldincludedir,;t t
+s, at infodir@,$infodir,;t t
+s, at mandir@,$mandir,;t t
+s, at build_alias@,$build_alias,;t t
+s, at host_alias@,$host_alias,;t t
+s, at target_alias@,$target_alias,;t t
+s, at DEFS@,$DEFS,;t t
+s, at ECHO_C@,$ECHO_C,;t t
+s, at ECHO_N@,$ECHO_N,;t t
+s, at ECHO_T@,$ECHO_T,;t t
+s, at LIBS@,$LIBS,;t t
+s, at INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s, at INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s, at INSTALL_DATA@,$INSTALL_DATA,;t t
+s, at CYGPATH_W@,$CYGPATH_W,;t t
+s, at PACKAGE@,$PACKAGE,;t t
+s, at VERSION@,$VERSION,;t t
+s, at ACLOCAL@,$ACLOCAL,;t t
+s, at AUTOCONF@,$AUTOCONF,;t t
+s, at AUTOMAKE@,$AUTOMAKE,;t t
+s, at AUTOHEADER@,$AUTOHEADER,;t t
+s, at MAKEINFO@,$MAKEINFO,;t t
+s, at install_sh@,$install_sh,;t t
+s, at STRIP@,$STRIP,;t t
+s, at ac_ct_STRIP@,$ac_ct_STRIP,;t t
+s, at INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t
+s, at mkdir_p@,$mkdir_p,;t t
+s, at AWK@,$AWK,;t t
+s, at SET_MAKE@,$SET_MAKE,;t t
+s, at am__leading_dot@,$am__leading_dot,;t t
+s, at AMTAR@,$AMTAR,;t t
+s, at am__tar@,$am__tar,;t t
+s, at am__untar@,$am__untar,;t t
+s, at PPL_VERSION_MAJOR@,$PPL_VERSION_MAJOR,;t t
+s, at PPL_VERSION_MINOR@,$PPL_VERSION_MINOR,;t t
+s, at PPL_VERSION_REVISION@,$PPL_VERSION_REVISION,;t t
+s, at PPL_VERSION_BETA@,$PPL_VERSION_BETA,;t t
+s, at PPL_CONFIGURE_OPTIONS@,$PPL_CONFIGURE_OPTIONS,;t t
+s, at docdir@,$docdir,;t t
+s, at ISODATE@,$ISODATE,;t t
+s, at build@,$build,;t t
+s, at build_cpu@,$build_cpu,;t t
+s, at build_vendor@,$build_vendor,;t t
+s, at build_os@,$build_os,;t t
+s, at host@,$host,;t t
+s, at host_cpu@,$host_cpu,;t t
+s, at host_vendor@,$host_vendor,;t t
+s, at host_os@,$host_os,;t t
+s, at ASSERTIONS_ENABLED_TRUE@,$ASSERTIONS_ENABLED_TRUE,;t t
+s, at ASSERTIONS_ENABLED_FALSE@,$ASSERTIONS_ENABLED_FALSE,;t t
+s, at USE_PRECOMPILED_HEADERS_TRUE@,$USE_PRECOMPILED_HEADERS_TRUE,;t t
+s, at USE_PRECOMPILED_HEADERS_FALSE@,$USE_PRECOMPILED_HEADERS_FALSE,;t t
+s, at USE_NATIVE_INTEGERS_TRUE@,$USE_NATIVE_INTEGERS_TRUE,;t t
+s, at USE_NATIVE_INTEGERS_FALSE@,$USE_NATIVE_INTEGERS_FALSE,;t t
+s, at USE_CHECKED_INTEGERS_TRUE@,$USE_CHECKED_INTEGERS_TRUE,;t t
+s, at USE_CHECKED_INTEGERS_FALSE@,$USE_CHECKED_INTEGERS_FALSE,;t t
+s, at USE_GMP_INTEGERS_TRUE@,$USE_GMP_INTEGERS_TRUE,;t t
+s, at USE_GMP_INTEGERS_FALSE@,$USE_GMP_INTEGERS_FALSE,;t t
+s, at USE_INT8_TRUE@,$USE_INT8_TRUE,;t t
+s, at USE_INT8_FALSE@,$USE_INT8_FALSE,;t t
+s, at USE_INT16_TRUE@,$USE_INT16_TRUE,;t t
+s, at USE_INT16_FALSE@,$USE_INT16_FALSE,;t t
+s, at USE_INT32_TRUE@,$USE_INT32_TRUE,;t t
+s, at USE_INT32_FALSE@,$USE_INT32_FALSE,;t t
+s, at USE_INT64_TRUE@,$USE_INT64_TRUE,;t t
+s, at USE_INT64_FALSE@,$USE_INT64_FALSE,;t t
+s, at EGREP@,$EGREP,;t t
+s, at CC@,$CC,;t t
+s, at CFLAGS@,$CFLAGS,;t t
+s, at LDFLAGS@,$LDFLAGS,;t t
+s, at CPPFLAGS@,$CPPFLAGS,;t t
+s, at ac_ct_CC@,$ac_ct_CC,;t t
+s, at EXEEXT@,$EXEEXT,;t t
+s, at OBJEXT@,$OBJEXT,;t t
+s, at DEPDIR@,$DEPDIR,;t t
+s, at am__include@,$am__include,;t t
+s, at am__quote@,$am__quote,;t t
+s, at AMDEP_TRUE@,$AMDEP_TRUE,;t t
+s, at AMDEP_FALSE@,$AMDEP_FALSE,;t t
+s, at AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t
+s, at CCDEPMODE@,$CCDEPMODE,;t t
+s, at am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t
+s, at am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t
+s, at CXX@,$CXX,;t t
+s, at CXXFLAGS@,$CXXFLAGS,;t t
+s, at ac_ct_CXX@,$ac_ct_CXX,;t t
+s, at CXXDEPMODE@,$CXXDEPMODE,;t t
+s, at am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t
+s, at am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t
+s, at CXXCPP@,$CXXCPP,;t t
+s, at PERL@,$PERL,;t t
+s, at HAVE_PERL_TRUE@,$HAVE_PERL_TRUE,;t t
+s, at HAVE_PERL_FALSE@,$HAVE_PERL_FALSE,;t t
+s, at CPP@,$CPP,;t t
+s, at CAN_CONTROL_FPU_TRUE@,$CAN_CONTROL_FPU_TRUE,;t t
+s, at CAN_CONTROL_FPU_FALSE@,$CAN_CONTROL_FPU_FALSE,;t t
+s, at SUPPORTED_FLOAT_TRUE@,$SUPPORTED_FLOAT_TRUE,;t t
+s, at SUPPORTED_FLOAT_FALSE@,$SUPPORTED_FLOAT_FALSE,;t t
+s, at SUPPORTED_DOUBLE_TRUE@,$SUPPORTED_DOUBLE_TRUE,;t t
+s, at SUPPORTED_DOUBLE_FALSE@,$SUPPORTED_DOUBLE_FALSE,;t t
+s, at SUPPORTED_LONG_DOUBLE_TRUE@,$SUPPORTED_LONG_DOUBLE_TRUE,;t t
+s, at SUPPORTED_LONG_DOUBLE_FALSE@,$SUPPORTED_LONG_DOUBLE_FALSE,;t t
+s, at LIBGMP@,$LIBGMP,;t t
+s, at LTLIBGMP@,$LTLIBGMP,;t t
+s, at LIBGMPXX@,$LIBGMPXX,;t t
+s, at LTLIBGMPXX@,$LTLIBGMPXX,;t t
+s, at BUILD_WATCHDOG_LIBRARY_TRUE@,$BUILD_WATCHDOG_LIBRARY_TRUE,;t t
+s, at BUILD_WATCHDOG_LIBRARY_FALSE@,$BUILD_WATCHDOG_LIBRARY_FALSE,;t t
+s, at subdirs@,$subdirs,;t t
+s, at BUILD_C_INTERFACE_TRUE@,$BUILD_C_INTERFACE_TRUE,;t t
+s, at BUILD_C_INTERFACE_FALSE@,$BUILD_C_INTERFACE_FALSE,;t t
+s, at CIAO_PROLOG@,$CIAO_PROLOG,;t t
+s, at BUILD_CIAO_PROLOG_INTERFACE_TRUE@,$BUILD_CIAO_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_CIAO_PROLOG_INTERFACE_FALSE@,$BUILD_CIAO_PROLOG_INTERFACE_FALSE,;t t
+s, at GNU_PROLOG@,$GNU_PROLOG,;t t
+s, at BUILD_GNU_PROLOG_INTERFACE_TRUE@,$BUILD_GNU_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_GNU_PROLOG_INTERFACE_FALSE@,$BUILD_GNU_PROLOG_INTERFACE_FALSE,;t t
+s, at sicstus_prolog@,$sicstus_prolog,;t t
+s, at SICSTUS_PROLOG_INCLUDE_OPTIONS@,$SICSTUS_PROLOG_INCLUDE_OPTIONS,;t t
+s, at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@,$BUILD_SICSTUS_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@,$BUILD_SICSTUS_PROLOG_INTERFACE_FALSE,;t t
+s, at swi_prolog@,$swi_prolog,;t t
+s, at SWI_PROLOG_INCLUDE_OPTIONS@,$SWI_PROLOG_INCLUDE_OPTIONS,;t t
+s, at BUILD_SWI_PROLOG_INTERFACE_TRUE@,$BUILD_SWI_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_SWI_PROLOG_INTERFACE_FALSE@,$BUILD_SWI_PROLOG_INTERFACE_FALSE,;t t
+s, at xsb_prolog@,$xsb_prolog,;t t
+s, at XSB_PROLOG_INCLUDE_OPTIONS@,$XSB_PROLOG_INCLUDE_OPTIONS,;t t
+s, at BUILD_XSB_PROLOG_INTERFACE_TRUE@,$BUILD_XSB_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_XSB_PROLOG_INTERFACE_FALSE@,$BUILD_XSB_PROLOG_INTERFACE_FALSE,;t t
+s, at YAP_PROLOG@,$YAP_PROLOG,;t t
+s, at BUILD_YAP_PROLOG_INTERFACE_TRUE@,$BUILD_YAP_PROLOG_INTERFACE_TRUE,;t t
+s, at BUILD_YAP_PROLOG_INTERFACE_FALSE@,$BUILD_YAP_PROLOG_INTERFACE_FALSE,;t t
+s, at LN_S@,$LN_S,;t t
+s, at ECHO@,$ECHO,;t t
+s, at AR@,$AR,;t t
+s, at ac_ct_AR@,$ac_ct_AR,;t t
+s, at RANLIB@,$RANLIB,;t t
+s, at ac_ct_RANLIB@,$ac_ct_RANLIB,;t t
+s, at DLLTOOL@,$DLLTOOL,;t t
+s, at ac_ct_DLLTOOL@,$ac_ct_DLLTOOL,;t t
+s, at AS@,$AS,;t t
+s, at ac_ct_AS@,$ac_ct_AS,;t t
+s, at OBJDUMP@,$OBJDUMP,;t t
+s, at ac_ct_OBJDUMP@,$ac_ct_OBJDUMP,;t t
+s, at F77@,$F77,;t t
+s, at FFLAGS@,$FFLAGS,;t t
+s, at ac_ct_F77@,$ac_ct_F77,;t t
+s, at LIBTOOL@,$LIBTOOL,;t t
+s, at ENABLE_SHARED_TRUE@,$ENABLE_SHARED_TRUE,;t t
+s, at ENABLE_SHARED_FALSE@,$ENABLE_SHARED_FALSE,;t t
+s, at ENABLE_STATIC_TRUE@,$ENABLE_STATIC_TRUE,;t t
+s, at ENABLE_STATIC_FALSE@,$ENABLE_STATIC_FALSE,;t t
+s, at MD5SUM@,$MD5SUM,;t t
+s, at HAVE_MD5SUM_TRUE@,$HAVE_MD5SUM_TRUE,;t t
+s, at HAVE_MD5SUM_FALSE@,$HAVE_MD5SUM_FALSE,;t t
+s, at TEXT_MD5SUM@,$TEXT_MD5SUM,;t t
+s, at HAVE_GLPK_TRUE@,$HAVE_GLPK_TRUE,;t t
+s, at HAVE_GLPK_FALSE@,$HAVE_GLPK_FALSE,;t t
+s, at HOST_OS_CYGWIN_TRUE@,$HOST_OS_CYGWIN_TRUE,;t t
+s, at HOST_OS_CYGWIN_FALSE@,$HOST_OS_CYGWIN_FALSE,;t t
+s, at HOST_OS_DARWIN_TRUE@,$HOST_OS_DARWIN_TRUE,;t t
+s, at HOST_OS_DARWIN_FALSE@,$HOST_OS_DARWIN_FALSE,;t t
+s, at HOST_OS_SOLARIS_TRUE@,$HOST_OS_SOLARIS_TRUE,;t t
+s, at HOST_OS_SOLARIS_FALSE@,$HOST_OS_SOLARIS_FALSE,;t t
+s, at NO_UNDEFINED_TRUE@,$NO_UNDEFINED_TRUE,;t t
+s, at NO_UNDEFINED_FALSE@,$NO_UNDEFINED_FALSE,;t t
+s, at extra_includes@,$extra_includes,;t t
+s, at extra_libraries@,$extra_libraries,;t t
+s, at debug_flag@,$debug_flag,;t t
+s, at coefficient_mnemonic@,$coefficient_mnemonic,;t t
+s, at LIBOBJS@,$LIBOBJS,;t t
+s, at LTLIBOBJS@,$LTLIBOBJS,;t t
+CEOF
+
+_ACEOF
+
+ cat >>$CONFIG_STATUS <<\_ACEOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_top_builddir$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # 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. */
+ if test x"$ac_file" = x-; then
+ configure_input=
+ else
+ configure_input="$ac_file. "
+ fi
+ configure_input=$configure_input"Generated from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF
+ sed "$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s, at configure_input@,$configure_input,;t t
+s, at srcdir@,$ac_srcdir,;t t
+s, at abs_srcdir@,$ac_abs_srcdir,;t t
+s, at top_srcdir@,$ac_top_srcdir,;t t
+s, at abs_top_srcdir@,$ac_abs_top_srcdir,;t t
+s, at builddir@,$ac_builddir,;t t
+s, at abs_builddir@,$ac_abs_builddir,;t t
+s, at top_builddir@,$ac_top_builddir,;t t
+s, at abs_top_builddir@,$ac_abs_top_builddir,;t t
+s, at INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ # Do quote $f, to prevent DOS paths from being IFS'd.
+ echo "$f";;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo "$f"
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo "$srcdir/$f"
+ else
+ # /dev/null tree
+ { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+_ACEOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\_ACEOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+_ACEOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #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.
+cat >>conftest.undefs <<\_ACEOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+_ACEOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # grep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+ # 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. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if diff $ac_file $tmp/config.h >/dev/null 2>&1; then
+ { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`(dirname "$ac_file") 2>/dev/null ||
+$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+# Compute $ac_file's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $ac_file | $ac_file:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null ||
+$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X$ac_file : 'X\(//\)[^/]' \| \
+ X$ac_file : 'X\(//\)$' \| \
+ X$ac_file : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X$ac_file |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`/stamp-h$_am_stamp_count
+done
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_dir=`(dirname "$ac_dest") 2>/dev/null ||
+$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_dest" : 'X\(//\)[^/]' \| \
+ X"$ac_dest" : 'X\(//\)$' \| \
+ X"$ac_dest" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_dest" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ { echo "$as_me:$LINENO: executing $ac_dest commands" >&5
+echo "$as_me: executing $ac_dest commands" >&6;}
+ case $ac_dest in
+ depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; 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.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`(dirname "$mf") 2>/dev/null ||
+$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$mf" : 'X\(//\)[^/]' \| \
+ X"$mf" : 'X\(//\)$' \| \
+ X"$mf" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+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"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //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' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`(dirname "$file") 2>/dev/null ||
+$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$file" : 'X\(//\)[^/]' \| \
+ X"$file" : 'X\(//\)$' \| \
+ X"$file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ { if $as_mkdir_p; then
+ mkdir -p $dirpart/$fdir
+ else
+ as_dir=$dirpart/$fdir
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5
+echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+ ;;
+ esac
+done
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+
+{ (exit 0); exit 0; }
+_ACEOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+
+# 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 || { (exit 1); exit 1; }
+fi
+
+#
+# CONFIG_SUBDIRS section.
+#
+if test "$no_recursion" != yes; then
+
+ # Remove --cache-file and --srcdir arguments so they do not pile up.
+ ac_sub_configure_args=
+ ac_prev=
+ for ac_arg in $ac_configure_args; do
+ if test -n "$ac_prev"; then
+ ac_prev=
+ continue
+ fi
+ case $ac_arg in
+ -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=*)
+ ;;
+ --config-cache | -C)
+ ;;
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ ;;
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ ;;
+ *) ac_sub_configure_args="$ac_sub_configure_args $ac_arg" ;;
+ esac
+ done
+
+ # Always prepend --prefix to ensure using the same prefix
+ # in subdir configurations.
+ ac_sub_configure_args="--prefix=$prefix $ac_sub_configure_args"
+
+ ac_popdir=`pwd`
+ for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue
+
+ # Do not complain, so a configure script can configure whichever
+ # parts of a large source tree are present.
+ test -d $srcdir/$ac_dir || continue
+
+ { echo "$as_me:$LINENO: configuring in $ac_dir" >&5
+echo "$as_me: configuring in $ac_dir" >&6;}
+ { if $as_mkdir_p; then
+ mkdir -p "$ac_dir"
+ else
+ as_dir="$ac_dir"
+ as_dirs=
+ while test ! -d "$as_dir"; do
+ as_dirs="$as_dir $as_dirs"
+ as_dir=`(dirname "$as_dir") 2>/dev/null ||
+$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$as_dir" : 'X\(//\)[^/]' \| \
+ X"$as_dir" : 'X\(//\)$' \| \
+ X"$as_dir" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$as_dir" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ done
+ test ! -n "$as_dirs" || mkdir $as_dirs
+ fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5
+echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;}
+ { (exit 1); exit 1; }; }; }
+
+ ac_builddir=.
+
+if test "$ac_dir" != .; then
+ ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'`
+else
+ ac_dir_suffix= ac_top_builddir=
+fi
+
+case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_srcdir=.
+ if test -z "$ac_top_builddir"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_top_builddir$srcdir ;;
+esac
+
+# Do not use `cd foo && pwd` to compute absolute paths, because
+# the directories may not exist.
+case `pwd` in
+.) ac_abs_builddir="$ac_dir";;
+*)
+ case "$ac_dir" in
+ .) ac_abs_builddir=`pwd`;;
+ [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";;
+ *) ac_abs_builddir=`pwd`/"$ac_dir";;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_builddir=${ac_top_builddir}.;;
+*)
+ case ${ac_top_builddir}. in
+ .) ac_abs_top_builddir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;;
+ *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_srcdir=$ac_srcdir;;
+*)
+ case $ac_srcdir in
+ .) ac_abs_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;;
+ *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;;
+ esac;;
+esac
+case $ac_abs_builddir in
+.) ac_abs_top_srcdir=$ac_top_srcdir;;
+*)
+ case $ac_top_srcdir in
+ .) ac_abs_top_srcdir=$ac_abs_builddir;;
+ [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;;
+ *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;;
+ esac;;
+esac
+
+
+ cd $ac_dir
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_srcdir/configure.gnu; then
+ ac_sub_configure="$SHELL '$ac_srcdir/configure.gnu'"
+ elif test -f $ac_srcdir/configure; then
+ ac_sub_configure="$SHELL '$ac_srcdir/configure'"
+ elif test -f $ac_srcdir/configure.in; then
+ ac_sub_configure=$ac_configure
+ else
+ { echo "$as_me:$LINENO: WARNING: no configuration information is in $ac_dir" >&5
+echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;}
+ ac_sub_configure=
+ fi
+
+ # The recursion is here.
+ if test -n "$ac_sub_configure"; then
+ # Make the cache file name correct relative to the subdirectory.
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;;
+ *) # Relative path.
+ ac_sub_cache_file=$ac_top_builddir$cache_file ;;
+ esac
+
+ { echo "$as_me:$LINENO: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5
+echo "$as_me: running $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;}
+ # The eval makes quoting arguments work.
+ eval $ac_sub_configure $ac_sub_configure_args \
+ --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir ||
+ { { echo "$as_me:$LINENO: error: $ac_sub_configure failed for $ac_dir" >&5
+echo "$as_me: error: $ac_sub_configure failed for $ac_dir" >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+
+ cd $ac_popdir
+ done
+fi
+
+
+if test x"$gmp_supports_exceptions" = xno
+then
+ { echo "$as_me:$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
+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
+ { echo "$as_me:$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
+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
+ { echo "$as_me:$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
+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..18e3c2e
--- /dev/null
+++ b/configure.ac
@@ -0,0 +1,911 @@
+# Autoconf source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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], [0.9], [ppl-devel at cs.unipr.it], [ppl])
+
+# Minimum autoconf version required.
+AC_PREREQ(2.59)
+
+# Make sure the sources are there.
+AC_CONFIG_SRCDIR(src/Polyhedron_public.cc)
+
+# Use Automake.
+AM_INIT_AUTOMAKE([foreign dist-bzip2 dist-zip 1.7.3])
+
+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(PPL_CONFIGURE_OPTIONS)
+
+# Installation directories.
+AC_SUBST([docdir], ['${datadir}/doc/ppl'])
+
+# Generate a configuration header file.
+AC_CONFIG_HEADER(config.h)
+
+ISODATE=`date +%Y-%m-%d`
+AC_SUBST(ISODATE)
+
+# Check for host type.
+AC_CANONICAL_HOST
+
+AH_TOP([
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+])
+
+AH_BOTTOM([
+/*
+ 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.
+*/
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#endif /* !defined(PPL_ppl_config_h) */
+])
+
+# C compiler
+
+AC_ARG_WITH(cc,
+ AC_HELP_STRING([--with-cc=XXX],
+ [use XXX as the C compiler]),
+ CC=$with_cc)
+
+# C++ compiler
+
+AC_ARG_WITH(cxx,
+ AC_HELP_STRING([--with-cxx=XXX],
+ [use XXX as the C++ compiler]),
+ CXX=$with_cxx)
+
+# Compilation flags
+
+COMP_FLAGS=""
+OPT_FLAGS=""
+
+enableval=yes
+AC_MSG_CHECKING([whether to compile with debug info])
+AC_ARG_ENABLE(debugging,
+ AC_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
+
+enableval=no
+AC_MSG_CHECKING([whether to compile for profiling])
+AC_ARG_ENABLE(profiling,
+ AC_HELP_STRING([--enable-profiling],
+ [compile for profiling]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ OPT_FLAGS="-g"
+ COMP_FLAGS="$COMP_FLAGS -pg -DPROFILING=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,
+ AC_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"
+ ;;
+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,
+ AC_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,
+ AC_HELP_STRING([--enable-more-assertions],
+ [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(EXTRA_ROW_DEBUG, 1, [Enable more assertions when defined.])
+fi
+
+if test x"$enable_assertions" = xno
+then
+ AC_DEFINE(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,
+ AC_HELP_STRING([--enable-optimization],
+ [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,
+ AC_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=no
+AC_MSG_CHECKING([whether to use precompiled headers])
+AC_ARG_ENABLE(pch,
+ AC_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"
+CXXFLAGS="$COMP_FLAGS $OPT_FLAGS"
+
+enableval=mpz
+AC_MSG_CHECKING([the type of integral values to use as coefficients])
+AC_ARG_ENABLE(coefficients,
+ AC_HELP_STRING([--enable-coefficients],
+ [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>"
+ AC_DEFINE_UNQUOTED(COEFFICIENT_TYPE, $coefficient_type, [The integral type used to represent coefficients.])
+ AC_DEFINE_UNQUOTED(COEFFICIENT_BITS, $coefficient_bits, [The number of bits of coefficients; 0 if unbounded.])
+ AC_DEFINE(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>"
+ AC_DEFINE_UNQUOTED(COEFFICIENT_TYPE, $coefficient_type)
+ AC_DEFINE_UNQUOTED(COEFFICIENT_BITS, $coefficient_bits)
+ AC_DEFINE(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(COEFFICIENT_TYPE, mpz_class)
+ AC_DEFINE(COEFFICIENT_BITS, 0)
+ AC_DEFINE(GMP_INTEGERS, 1, [Defined if the integral type to be used for coefficients is GMP's one.])
+fi
+
+# Allow additions to C and C++ compilation flags
+
+AC_ARG_WITH(cflags,
+ AC_HELP_STRING([--with-cflags=XXX],
+ [add XXX to the options for the C compiler]),
+ CFLAGS="$CFLAGS $with_cflags")
+
+AC_ARG_WITH(cxxflags,
+ AC_HELP_STRING([--with-cxxflags=XXX],
+ [add XXX to the options for the C++ compiler]),
+ CXXFLAGS="$CXXFLAGS $with_cxxflags")
+
+# Checks for programs.
+AC_PROG_EGREP
+AC_PROG_CC
+AC_PROG_CXX
+AC_PROG_CXXCPP
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+
+# Check for Perl.
+AC_PATH_PROG([PERL], perl, no)
+AC_SUBST([PERL])
+AM_CONDITIONAL(HAVE_PERL, test x"$PERL" != xno)
+
+# Checks for C typedefs, structures, compiler and architecture characteristics.
+AC_LANG(C)
+AC_C_CONST
+AC_C_INLINE
+AC_C_BIGENDIAN
+
+# Checks for C type sizes.
+AC_CHECK_SIZEOF(int)
+AC_CHECK_SIZEOF(long)
+AC_CHECK_SIZEOF(long long)
+AC_CHECK_SIZEOF(unsigned)
+AC_CHECK_SIZEOF(unsigned long)
+AC_CHECK_SIZEOF(unsigned long long)
+AC_CHECK_SIZEOF(size_t)
+AC_CHECK_SIZEOF(float)
+AC_CHECK_SIZEOF(double)
+AC_CHECK_SIZEOF(long double)
+
+# Use C++ for the remaining checks.
+AC_LANG(C++)
+
+dnl Check for the possibility to control the FPU.
+AC_CHECK_FPU_CONTROL
+
+# 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
+
+# Check whether the C++ compiler supports flexible arrays.
+AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS
+
+# Check whether the C++ compiler supports __attribute__ ((weak)).
+AC_CXX_SUPPORTS_ATTRIBUTE_WEAK
+
+# Checks for the availability of C library functions in C++.
+AC_CHECK_DECLS([ffs], , , [#include <strings.h>])
+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])
+
+# Must link everything with libm.
+extra_libraries="${extra_libraries} -lm"
+
+# 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_includes_option}"
+extra_libraries="${extra_libraries}${extra_libraries:+ }${gmp_library_option}"
+
+enableval=yes
+AC_MSG_CHECKING([whether to build the Parma Watchdog Library])
+AC_ARG_ENABLE(watchdog,
+ AC_HELP_STRING([--enable-watchdog],
+ [build also the Parma Watchdog Library]))
+case "${enableval}" in
+yes)
+ AC_MSG_RESULT(yes)
+ ;;
+no)
+ AC_MSG_RESULT(no)
+ ;;
+*)
+ AC_MSG_ERROR([bad value ${enableval} for --enable-watchdog, needs yes or no])
+ ;;
+esac
+build_watchdog_library=$enableval
+AM_CONDITIONAL(BUILD_WATCHDOG_LIBRARY, test x"$build_watchdog_library" = xyes)
+
+# Enabled or not, the Watchdog subdirectory must be configured.
+AC_CONFIG_SUBDIRS(Watchdog)
+
+# This is the list of available interfaces: lowercase and blank-separated.
+available_interfaces="cxx c ciao_prolog gnu_prolog sicstus_prolog swi_prolog xsb_prolog yap_prolog"
+
+# This is the list of interfaces that are enabled by default.
+#default_interfaces="cxx c swi_prolog"
+default_interfaces=${available_interfaces}
+
+enableval=not_specified
+AC_MSG_CHECKING([which interfaces are enabled])
+AC_ARG_ENABLE(interfaces,
+ AC_HELP_STRING([--enable-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
+
+# Set an Automake conditional to build or not to build the C interface.
+AM_CONDITIONAL(BUILD_C_INTERFACE, test x${c_interface_enabled} = xyes)
+
+# Checks for Prolog systems for which the interface is enabled.
+
+# Ciao Prolog
+if test x${ciao_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_PROG(CIAO_PROLOG, ciao, ciao)
+ if test x"$CIAO_PROLOG" = xciao
+ then
+ AC_CHECK_HEADER(ciao_prolog.h,
+ [],
+ CIAO_PROLOG="")
+ fi
+fi
+AM_CONDITIONAL(BUILD_CIAO_PROLOG_INTERFACE, test x$CIAO_PROLOG = xciao)
+
+# 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
+AM_CONDITIONAL(BUILD_GNU_PROLOG_INTERFACE, test x$GNU_PROLOG = xgprolog)
+
+# SICStus
+if test x${sicstus_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_SICSTUS_PROLOG
+fi
+AM_CONDITIONAL(BUILD_SICSTUS_PROLOG_INTERFACE, test x$have_sicstus_prolog = xyes)
+
+# SWI Prolog
+if test x${swi_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_SWI_PROLOG
+fi
+AM_CONDITIONAL(BUILD_SWI_PROLOG_INTERFACE, test x$have_swi_prolog = xyes)
+
+# XSB
+if test x${xsb_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_XSB_PROLOG
+fi
+AM_CONDITIONAL(BUILD_XSB_PROLOG_INTERFACE, test x$have_xsb_prolog = xyes)
+
+# YAP
+if test x${yap_prolog_interface_enabled} = xyes
+then
+ AC_CHECK_PROG(YAP_PROLOG, yap, yap)
+ if test x"$YAP_PROLOG" = xyap
+ then
+ AC_CHECK_HEADER(Yap/c_interface.h,
+ [],
+ YAP_PROLOG="")
+ fi
+fi
+AM_CONDITIONAL(BUILD_YAP_PROLOG_INTERFACE, test x$YAP_PROLOG = xyap)
+
+# # This is the list of interfaces that are enabled by default.
+# # Different instantiations are separated by a '@' character.
+# default_instantiations="Polyhedron @ BD_Shape<int8_t>"
+#
+# enableval=not_specified
+# AC_MSG_CHECKING([which instantiations are enabled])
+# AC_ARG_ENABLE(instantiations,
+# AC_HELP_STRING([--enable-instantiations],
+# [enable instantiations for the non-C++ interfaces]))
+# case x"${enableval}" in
+# xyes | x)
+# AC_MSG_ERROR([--enable-instantiations needs at least one argument])
+# ;;
+# xno | xnone)
+# enabled_instantiations=
+# AC_MSG_RESULT(none)
+# ;;
+# *)
+# if test x"${enableval}" = xnot_specified
+# then
+# enableval=${default_instantiations}
+# fi
+# # Make the list blank-separated.
+# required_instantiations=`echo "${enableval}" | sed -e 's/[[ ]][[ ]]*//g' -e 's/@/ /g' -e 's/[[ ]][[ ]]*/ /g'`
+# # Check the specified instantiations for validity.
+# ac_save_CPPFLAGS="$CPPFLAGS"
+# CPPFLAGS="$CPPFLAGS -I${srcdir}"
+# for instantiation in ${required_instantiations}
+# 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"
+# AC_MSG_RESULT([${required_instantiations}])
+# ;;
+# esac
+
+# Libtool.
+# Turn off shared libraries during beta-testing, since they
+# make debugging harder and the build process takes too long.
+#AC_DISABLE_SHARED
+AC_LIBTOOL_DLOPEN
+AC_LIBTOOL_WIN32_DLL
+AC_PROG_LIBTOOL
+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_HEADER(glpk.h, HAVE_GLPK_H=yes)
+AM_CONDITIONAL(HAVE_GLPK, test x$HAVE_GLPK_H = xyes)
+AC_LANG_POP(C)
+
+# Checks for header files.
+AC_CHECK_HEADERS([fenv.h ieeefp.h getopt.h signal.h sys/resource.h sys/time.h sys/types.h unistd.h])
+
+# 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
+])
+
+# Checks for typedefs, structures, and compiler characteristics.
+# Nothing for the time being.
+
+# Checks for library functions.
+# Nothing for the time being.
+
+# If we are using GCC we want to compile with warnings enabled.
+if test x"$GCC" = xyes
+then
+ CFLAGS="-W -Wall $CFLAGS"
+fi
+if test x"$GXX" = xyes
+then
+ CXXFLAGS="-W -Wall $CXXFLAGS"
+fi
+
+# System-dependent adjustments.
+cygwin=no
+darwin=no
+solaris=no
+no_undefined=no
+
+case "${host_cpu}" in
+alpha*)
+ if test x"$GCC" = xyes
+ then
+ CFLAGS="$CFLAGS -mfp-rounding-mode=d -mieee"
+ CXXFLAGS="$CXXFLAGS -mfp-rounding-mode=d -mieee"
+ else
+ CFLAGS="$CFLAGS -fprm d -ieee -underflow_to_zero"
+ CXXFLAGS="$CXXFLAGS -fprm d -ieee -underflow_to_zero"
+ fi
+ ;;
+*)
+ ;;
+esac
+
+case "${host_os}" in
+cygwin)
+ cygwin=yes
+ no_undefined=yes
+ ;;
+darwin*)
+ darwin=yes
+ if test x"$GCC" = xyes
+ then
+ CFLAGS="$CFLAGS -Wno-long-double"
+ CXXFLAGS="$CXXFLAGS -Wno-long-double"
+ fi
+ ;;
+solaris*)
+ solaris=yes
+ ;;
+*)
+ ;;
+esac
+
+AM_CONDITIONAL(HOST_OS_CYGWIN, test x$cygwin = xyes)
+AM_CONDITIONAL(HOST_OS_DARWIN, test x$darwin = xyes)
+AM_CONDITIONAL(HOST_OS_SOLARIS, test x$solaris = xyes)
+AM_CONDITIONAL(NO_UNDEFINED, test x$no_undefined = xyes)
+
+AC_SUBST(extra_includes)
+AC_SUBST(extra_libraries)
+AC_SUBST(debug_flag)
+AC_SUBST(coefficient_mnemonic)
+
+AC_CONFIG_FILES(Makefile
+ ppl.lsm ppl.spec
+ debian/Makefile
+ debian/libppl.copyright
+ debian/libppl-pwl.copyright
+ src/Makefile
+ src/version.hh
+ src/ppl-config.cc
+ tests/Makefile
+ tests/BD_Shape/Makefile
+ tests/Polyhedron/Makefile
+ tests/Grid/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
+ doc/Makefile
+ doc/user.doxyconf-latex
+ doc/devref.doxyconf-latex
+ doc/user.doxyconf-html
+ doc/devref.doxyconf-html
+ interfaces/Makefile
+ interfaces/C/Makefile
+ interfaces/C/ppl_c.h
+ 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)
+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/debian/Makefile.am b/debian/Makefile.am
new file mode 100644
index 0000000..a33cb7e
--- /dev/null
+++ b/debian/Makefile.am
@@ -0,0 +1,44 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = \
+changelog \
+compat \
+control \
+libppl-c.dirs \
+libppl-c.install \
+libppl-c.links \
+libppl-dev.dirs \
+libppl-dev.doc-base \
+libppl-dev.doc-base.user \
+libppl-dev.docs \
+libppl-dev.install \
+libppl-dev.links \
+libppl-pwl.copyright.in \
+libppl-pwl.dirs \
+libppl-pwl.docs \
+libppl-pwl.install \
+libppl.copyright.in \
+libppl.dirs \
+libppl.docs \
+libppl.install \
+rules
diff --git a/debian/Makefile.in b/debian/Makefile.in
new file mode 100644
index 0000000..57f9618
--- /dev/null
+++ b/debian/Makefile.in
@@ -0,0 +1,465 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = debian
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+ $(srcdir)/libppl-pwl.copyright.in \
+ $(srcdir)/libppl.copyright.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 = libppl.copyright libppl-pwl.copyright
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = \
+changelog \
+compat \
+control \
+libppl-c.dirs \
+libppl-c.install \
+libppl-c.links \
+libppl-dev.dirs \
+libppl-dev.doc-base \
+libppl-dev.doc-base.user \
+libppl-dev.docs \
+libppl-dev.install \
+libppl-dev.links \
+libppl-pwl.copyright.in \
+libppl-pwl.dirs \
+libppl-pwl.docs \
+libppl-pwl.install \
+libppl.copyright.in \
+libppl.dirs \
+libppl.docs \
+libppl.install \
+rules
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign debian/Makefile'; \
+ cd $(top_srcdir) && \
+ $(AUTOMAKE) --foreign debian/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
+libppl.copyright: $(top_builddir)/config.status $(srcdir)/libppl.copyright.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+libppl-pwl.copyright: $(top_builddir)/config.status $(srcdir)/libppl-pwl.copyright.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-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/debian/README b/debian/README
new file mode 100644
index 0000000..a1564a0
--- /dev/null
+++ b/debian/README
@@ -0,0 +1,35 @@
+Building the Debian packages
+============================
+
+The simplest way to build the Debian packages is to run the following
+command in an up-to-date PPL directory.
+
+ dpkg-buildpackage -rsudo
+
+`dpkg-buildpackage' is available in the dpkg-dev package. Here the
+`sudo' program (from the sudo package) is also required. This will
+build the PPL using the standard GMP, C compiler and C++ compiler.
+Note that the configuration of GMP, at least on the Debian stable
+distribution, lacks the -fexceptions preprocessor flag, which is
+required for PPL memory bounds handling.
+
+Alternatively, the `pbuilder' program (from the pbuilder package) can
+be used to build a "clean-room" package. `pbuilder' sets up a chroot
+of a minimal stable distribution and then builds the package inside
+the chroot. This is good to verify the build dependencies. It also
+may be required, to ensure that the PPL is built against the compiler
+and GMP from the stable distributions (if, for example, the build
+machine uses the testing or unstable distributions).
+
+
+References
+----------
+
+ - Debian Library Packaging guide
+ http://www.netfort.gr.jp/~dancer/column/libpkg-guide/libpkg-guide.html
+
+ - Debian New Maintainers' Guide
+ http://www.debian.org/doc/maint-guide/
+
+ - Debian Developer's Reference
+ http://www.debian.org/doc/developers-reference/
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..2ed3e36
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,11 @@
+libppl (0.9) unstable; urgency=low
+
+ * Release 0.9.
+
+ -- Roberto Bagnara <bagnara at cs.unipr.it> Fri, 10 Mar 2006 18:08:34 +0000
+
+libppl (0.8) unstable; urgency=low
+
+ * Initial upstream release.
+
+ -- Roberto Bagnara <bagnara at cs.unipr.it> Thu, 19 Jan 2006 23:58:34 +0000
diff --git a/debian/compat b/debian/compat
new file mode 100644
index 0000000..b8626c4
--- /dev/null
+++ b/debian/compat
@@ -0,0 +1 @@
+4
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..c6ef086
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,74 @@
+Source: libppl
+Section: libs
+Priority: optional
+Maintainer: PPL developers <ppl-devel at cs.unipr.it>
+Standards-Version: 3.6.1
+Build-Depends: debhelper (>= 4), binutils, g++, libgmp3-dev (>= 4.1.3), autoconf, automake1.9, libtool, doxygen, graphviz, glpk, tetex-bin, tetex-extra, xpdf-utils, gs-gpl
+Build-Conflicts: automake1.4
+
+Package: libppl
+Architecture: any
+Depends: libgmp3 (>=4.1.3)
+Description: Parma Polyhedra Library: base package
+ The Parma Polyhedra Library (PPL) is a C++ library for the
+ manipulation of (not necessarily closed) convex polyhedra and other
+ numerical abstractions. The applications of convex polyhedra include
+ program analysis, optimized compilation, integer and combinatorial
+ optimization and statistical data-editing. 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++,
+ exception-safe, rather efficient and thoroughly documented.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
+
+Package: libppl-dev
+Architecture: any
+Section: libdevel
+Depends: libppl, graphviz
+Recommends: libgmp3-dev
+Suggests: libgmp3-doc
+Description: Parma Polyhedra Library: C++ interface
+ The Parma Polyhedra Library (PPL) is a C++ library for the
+ manipulation of (not necessarily closed) convex polyhedra and other
+ numerical abstractions. The applications of convex polyhedra include
+ program analysis, optimized compilation, integer and combinatorial
+ optimization and statistical data-editing. 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++,
+ exception-safe, rather efficient and thoroughly documented.
+ .
+ This package provides C++ header files, the static library and
+ various formats of the developer documentation.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
+
+Package: libppl-c
+Architecture: any
+Depends: libppl, libc6
+Description: Parma Polyhedra Library: C interface
+ The Parma Polyhedra Library (PPL) is a C++ library for the
+ manipulation of (not necessarily closed) convex polyhedra and other
+ numerical abstractions. The applications of convex polyhedra include
+ program analysis, optimized compilation, integer and combinatorial
+ optimization and statistical data-editing. 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++,
+ exception-safe, rather efficient and thoroughly documented.
+ .
+ This package provides the C interface.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
+
+Package: libppl-pwl
+Architecture: any
+Section: libs
+Description: Parma Watchdog Library: C++ library for watchdog timers
+ The Parma Watchdog Library (PWL) provides support for multiple,
+ concurrent watchdog timers on systems providing setitimer(2). The
+ PWL is currently distributed with the Parma Polyhedra Library (PPL),
+ but is totally independent from it.
+ .
+ Homepage: http://www.cs.unipr.it/ppl/
diff --git a/debian/libppl-c.dirs b/debian/libppl-c.dirs
new file mode 100644
index 0000000..6845771
--- /dev/null
+++ b/debian/libppl-c.dirs
@@ -0,0 +1 @@
+usr/lib
diff --git a/debian/libppl-c.install b/debian/libppl-c.install
new file mode 100644
index 0000000..9ffe5c0
--- /dev/null
+++ b/debian/libppl-c.install
@@ -0,0 +1 @@
+usr/lib/libppl_c.so.*
diff --git a/debian/libppl-c.links b/debian/libppl-c.links
new file mode 100644
index 0000000..f764b85
--- /dev/null
+++ b/debian/libppl-c.links
@@ -0,0 +1 @@
+usr/share/doc/libppl usr/share/doc/libppl-c
diff --git a/debian/libppl-dev.dirs b/debian/libppl-dev.dirs
new file mode 100644
index 0000000..3b6ff49
--- /dev/null
+++ b/debian/libppl-dev.dirs
@@ -0,0 +1,3 @@
+usr/include
+usr/share/doc-base
+usr/share/doc/libppl
diff --git a/debian/libppl-dev.doc-base b/debian/libppl-dev.doc-base
new file mode 100644
index 0000000..8aa51e2
--- /dev/null
+++ b/debian/libppl-dev.doc-base
@@ -0,0 +1,17 @@
+Document: libppl-dev
+Title: The Parma Polyhedra Library Developer Reference Manual
+Author: PPL developers <ppl-devel at cs.unipr.it>
+Abstract: This manual contains a general introduction to the Parma
+ Polyhedra Library (PPL) and full documentation of the PPL C++
+ interface, including implementation details.
+Section: Apps/Programming
+
+Format: postscript
+Files: /usr/share/doc/libppl/ppl-devref-browse.ps.gz
+
+Format: pdf
+Files: /usr/share/doc/libppl/ppl-devref-browse.pdf
+
+Format: HTML
+Index: /usr/share/doc/libppl/html/developer-reference/index.html
+Files: /usr/share/doc/libppl/html/developer-reference/*.html
diff --git a/debian/libppl-dev.doc-base.user b/debian/libppl-dev.doc-base.user
new file mode 100644
index 0000000..1bbe891
--- /dev/null
+++ b/debian/libppl-dev.doc-base.user
@@ -0,0 +1,17 @@
+Document: libppl
+Title: The Parma Polyhedra Library User Manual
+Author: PPL developers <ppl-devel at cs.unipr.it>
+Abstract: This manual contains a general introduction to the Parma
+ Polyhedra Library (PPL) and full documentation of the PPL C++
+ interface.
+Section: Apps/Programming
+
+Format: postscript
+Files: /usr/share/doc/libppl/ppl-user-browse.ps.gz
+
+Format: pdf
+Files: /usr/share/doc/libppl/ppl-user-browse.pdf
+
+Format: HTML
+Index: /usr/share/doc/libppl/html/user-manual/index.html
+Files: /usr/share/doc/libppl/html/user-manual/*.html
diff --git a/debian/libppl-dev.docs b/debian/libppl-dev.docs
new file mode 100644
index 0000000..e69de29
diff --git a/debian/libppl-dev.install b/debian/libppl-dev.install
new file mode 100644
index 0000000..1371793
--- /dev/null
+++ b/debian/libppl-dev.install
@@ -0,0 +1,5 @@
+usr/lib/libppl.la
+usr/lib/libppl.a
+usr/include/ppl_c.h
+usr/include/ppl.hh
+usr/include/pwl.hh
diff --git a/debian/libppl-dev.links b/debian/libppl-dev.links
new file mode 100644
index 0000000..cf1724c
--- /dev/null
+++ b/debian/libppl-dev.links
@@ -0,0 +1 @@
+usr/share/doc/libppl usr/share/doc/libppl-dev
diff --git a/debian/libppl-pwl.copyright.in b/debian/libppl-pwl.copyright.in
new file mode 100644
index 0000000..16a6b17
--- /dev/null
+++ b/debian/libppl-pwl.copyright.in
@@ -0,0 +1,444 @@
+This is the Debian GNU/Linux prepackaged version of the Parma
+Polyhedra Library (PPL): a C++ library for the manipulation of
+numerical abstractions.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/
+
+
+Sources: this package was put together by the PPL developers
+<ppl-devel at cs.unipr.it>, with sources obtained from
+
+ ftp://ftp.cs.unipr.it/pub/ppl/releases/@VERSION@/ppl-@VERSION@.tar.gz
+
+or, for prereleases, from the anonymously accessible CVS repository
+
+ :pserver:anoncvs at cvs.cs.unipr.it:/cvs/ppl
+
+
+Authors: see the CREDITS file or http://www.cs.unipr.it/ppl/Credits
+for the complete list of authors.
+
+
+Copyright: 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ The PPL is free software; you can 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.
+
+ The PPL is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+On Debian systems, the complete text of the GNU General Public
+License, version 2, can be found in /usr/share/common-licenses/GPL-2.
+
+The documentation of the PPL is licensed under the GNU Free Documentation
+License (v1.2), appended at the end of this file.
+
+
+==============================================================================
+
+ 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/debian/libppl-pwl.dirs b/debian/libppl-pwl.dirs
new file mode 100644
index 0000000..4418816
--- /dev/null
+++ b/debian/libppl-pwl.dirs
@@ -0,0 +1,2 @@
+usr/lib
+usr/include
diff --git a/debian/libppl-pwl.docs b/debian/libppl-pwl.docs
new file mode 100644
index 0000000..a5a4271
--- /dev/null
+++ b/debian/libppl-pwl.docs
@@ -0,0 +1,5 @@
+BUGS
+NEWS
+README
+ChangeLog
+CREDITS
diff --git a/debian/libppl-pwl.install b/debian/libppl-pwl.install
new file mode 100644
index 0000000..353e95a
--- /dev/null
+++ b/debian/libppl-pwl.install
@@ -0,0 +1,4 @@
+usr/lib/libpwl.so
+usr/lib/libpwl.so.*
+usr/lib/libpwl.a
+usr/lib/libpwl.la
diff --git a/debian/libppl.copyright.in b/debian/libppl.copyright.in
new file mode 100644
index 0000000..16a6b17
--- /dev/null
+++ b/debian/libppl.copyright.in
@@ -0,0 +1,444 @@
+This is the Debian GNU/Linux prepackaged version of the Parma
+Polyhedra Library (PPL): a C++ library for the manipulation of
+numerical abstractions.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/
+
+
+Sources: this package was put together by the PPL developers
+<ppl-devel at cs.unipr.it>, with sources obtained from
+
+ ftp://ftp.cs.unipr.it/pub/ppl/releases/@VERSION@/ppl-@VERSION@.tar.gz
+
+or, for prereleases, from the anonymously accessible CVS repository
+
+ :pserver:anoncvs at cvs.cs.unipr.it:/cvs/ppl
+
+
+Authors: see the CREDITS file or http://www.cs.unipr.it/ppl/Credits
+for the complete list of authors.
+
+
+Copyright: 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+ The PPL is free software; you can 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.
+
+ The PPL is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+On Debian systems, the complete text of the GNU General Public
+License, version 2, can be found in /usr/share/common-licenses/GPL-2.
+
+The documentation of the PPL is licensed under the GNU Free Documentation
+License (v1.2), appended at the end of this file.
+
+
+==============================================================================
+
+ 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/debian/libppl.dirs b/debian/libppl.dirs
new file mode 100644
index 0000000..d96c6d6
--- /dev/null
+++ b/debian/libppl.dirs
@@ -0,0 +1,3 @@
+usr/lib
+usr/bin
+usr/share/man/man1
diff --git a/debian/libppl.docs b/debian/libppl.docs
new file mode 100644
index 0000000..a5a4271
--- /dev/null
+++ b/debian/libppl.docs
@@ -0,0 +1,5 @@
+BUGS
+NEWS
+README
+ChangeLog
+CREDITS
diff --git a/debian/libppl.install b/debian/libppl.install
new file mode 100644
index 0000000..a7ba61c
--- /dev/null
+++ b/debian/libppl.install
@@ -0,0 +1,8 @@
+usr/lib/libppl.so
+usr/lib/libppl.so.*
+usr/bin/ppl-config
+usr/bin/ppl_lcdd
+usr/bin/ppl_lpsol
+usr/share/man/man1/ppl-config.1
+usr/share/man/man1/ppl_lcdd.1
+usr/share/man/man1/ppl_lpsol.1
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..aaa9070
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,186 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+#
+# Modified to make a template file for a multi-binary package with separated
+# build-arch and build-indep targets by Bill Allombert 2001
+
+# Uncomment this to turn on verbose mode.
+export DH_VERBOSE=1
+
+# This has to be exported to make some magic below work.
+export DH_OPTIONS
+
+# These are used for cross-compiling and for saving the configure script
+# from having to guess our platform (since we know it already)
+DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+CFLAGS = -Wall -g
+
+ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
+ CFLAGS += -O0
+else
+ CFLAGS += -O2
+endif
+
+# FOR AUTOCONF 2.52 AND NEWER ONLY
+ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE))
+ confflags += --build $(DEB_HOST_GNU_TYPE)
+else
+ confflags += --build $(DEB_BUILD_GNU_TYPE) --host $(DEB_HOST_GNU_TYPE)
+endif
+
+# If the version string was set using automake then the build would
+# have to be configured before the dpkg-buildpackage command.
+PPL_VERSION = $(shell grep "^AC_INIT" $(CURDIR)/configure.ac | sed -e "s/^AC_INIT.\[[^]]*\],[ \t]*\[\([^]]*\)\],.*/\1/")
+
+config.status:
+ dh_testdir
+# Add here commands to configure the package.
+# /usr/share/doc/autotools-dev/README.Debian.gz:
+# - Call the autoconf suite using simple names ("autoconf", "autoheader", etc.)
+# - Call the automake suite using *versioned* names ("automake-1.9", etc),
+ autoreconf && CFLAGS="$(CFLAGS)" ./configure $(confflags) --prefix=/usr --mandir=\$${prefix}/share/man --infodir=\$${prefix}/share/info
+
+## Architecture
+build: build-arch build-indep
+
+build-arch: build-arch-stamp
+build-arch-stamp: config.status
+
+# Add here commands to compile the arch part of the package.
+ $(MAKE)
+ touch build-arch-stamp
+
+build-indep: build-indep-stamp
+build-indep-stamp: config.status
+
+# Add here commands to compile the indep part of the package.
+# FIX this depends on build-arch to install the doc to debian/tmp
+# $(MAKE) doc
+ touch build-indep-stamp
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-arch-stamp build-indep-stamp #CONFIGURE-STAMP#
+
+# Add here commands to clean up after the build process.
+ -$(MAKE) distclean
+ifneq "$(wildcard /usr/share/misc/config.sub)" ""
+ cp -f /usr/share/misc/config.sub config.sub
+endif
+ifneq "$(wildcard /usr/share/misc/config.guess)" ""
+ cp -f /usr/share/misc/config.guess config.guess
+endif
+ dh_clean
+
+install: install-indep install-arch
+install: install-arch
+
+install-indep:
+# dh_testdir
+# dh_testroot
+# dh_clean -k -i
+# dh_installdirs -i
+
+## Add here commands to install the indep part of the package into
+## debian/<package>-doc.
+
+# dh_install -i
+
+# Destination directory for user manual.
+DOC_DIR=debian/libppl-dev/usr/share/doc/libppl
+# Destination directory for developer reference.
+DEV_DOC_DIR=debian/libppl-dev/usr/share/doc/libppl
+#SRC_DOC_DIR=$(CURDIR)/debian/tmp/usr/share/doc/ppl/
+SRC_DOC_DIR=$(CURDIR)/doc
+install-arch:
+ dh_testdir
+ dh_testroot
+ dh_clean -k -s
+ dh_installdirs -s
+
+# Add here commands to install the arch part of the package into
+# debian/tmp.
+
+ $(MAKE) install DESTDIR=$(CURDIR)/debian/tmp
+ $(MAKE) -C Watchdog install DESTDIR=$(CURDIR)/debian/tmp
+
+# Install the PPL programs.
+# FIXME: Consider installing the ppl_lcdd and ppl_lpsol examples
+# (what about copyrights?).
+ cp -a $(CURDIR)/src/ppl-config $(CURDIR)/debian/tmp/usr/bin/
+ cp -a $(CURDIR)/demos/ppl_lcdd/ppl_lcdd $(CURDIR)/debian/tmp/usr/bin/
+ cp -a $(CURDIR)/demos/ppl_lpsol/ppl_lpsol $(CURDIR)/debian/tmp/usr/bin/
+
+# Build all the documentation, then move it into debian/tmp
+# directories which have fixed names.
+ mkdir -p $(DOC_DIR)/html || exit 1
+ mkdir -p $(DEV_DOC_DIR)/html || exit 1
+ $(MAKE) -C doc world \
+ && cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION)-html $(DOC_DIR)/html/user-manual/ \
+ && cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION).pdf $(DOC_DIR)/ppl-user-browse.pdf \
+ && cp -a $(SRC_DOC_DIR)/ppl-user-$(PPL_VERSION).ps.gz $(DOC_DIR)/ppl-user-print.ps.gz \
+ && cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION)-html $(DEV_DOC_DIR)/html/developer-reference/ \
+ && cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION).pdf $(DEV_DOC_DIR)/ppl-devref-browse.pdf \
+ && cp -a $(SRC_DOC_DIR)/ppl-devref-$(PPL_VERSION).ps.gz $(DEV_DOC_DIR)/ppl-devref-print.ps.gz
+
+# Explicitly install the Debian changelog, for libppl and libppl-pwl.
+ mkdir -p debian/libppl/usr/share/doc/libppl/
+ cp -a debian/changelog debian/libppl/usr/share/doc/libppl/changelog.Debian
+ mkdir -p debian/libppl-pwl/usr/share/doc/libppl-pwl/
+ cp -a debian/changelog debian/libppl-pwl/usr/share/doc/libppl-pwl/changelog.Debian
+
+ dh_install -s --sourcedir=debian/tmp
+
+# Must not depend on anything. This is to be called by
+# binary-arch/binary-indep
+# in another 'make' thread.
+binary-common:
+ dh_testdir
+ dh_testroot
+
+# This would install the change logs into every package, so instead
+# the install-arch rule above copies the logs into place.
+# dh_installchangelogs -plibppl -plibppl-pwl
+
+ dh_installdocs
+# These directories will be symlinks instead. The [^p] is to keep
+# the directory for libppl-pwl.
+ rmdir debian/libppl-[^p]*/usr/share/doc/libppl-* || exit 1
+# dh_installexamples
+# dh_installmenu
+# dh_installdebconf
+# dh_installlogrotate
+# dh_installinit
+# dh_installcron
+# dh_installinfo
+# dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+# dh_perl
+# dh_python
+ dh_makeshlibs
+ dh_installdeb
+ dh_shlibdeps
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+## Build architecture independant packages using the common target.
+binary-indep: build-indep install-indep
+# $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common
+
+## Build architecture dependant packages using the common target.
+binary-arch: build-arch install-arch
+ $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common
+
+binary: binary-arch binary-indep
+.PHONY: build clean binary-indep binary-arch binary install install-indep install-arch
diff --git a/demos/Makefile.am b/demos/Makefile.am
new file mode 100644
index 0000000..5f88c4e
--- /dev/null
+++ b/demos/Makefile.am
@@ -0,0 +1,23 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = ppl_lcdd ppl_lpsol
diff --git a/demos/Makefile.in b/demos/Makefile.in
new file mode 100644
index 0000000..aea007a
--- /dev/null
+++ b/demos/Makefile.in
@@ -0,0 +1,594 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = ppl_lcdd ppl_lpsol
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ clean clean-generic clean-libtool clean-recursive ctags \
+ ctags-recursive distclean distclean-generic distclean-libtool \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am uninstall-info-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..fe5b08e
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.am
@@ -0,0 +1,122 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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@
+
+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) $< -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) $< -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
+ echo $(TOUGH_EXAMPLES) >tough_examples
+ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ LANG=C; \
+ for path in $(srcdir)/examples/*.ext $(srcdir)/examples/*.ine; \
+ do \
+ file=`basename $$path`; \
+ grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ echo $(ECHO_N) $$file " $(ECHO_C)" >>obtained; \
+ echo ppl_lcdd $$path; \
+ ./ppl_lcdd $$path | $(TEXT_MD5SUM) >>obtained; \
+ done
+ diff -u $(srcdir)/$(EXPECTED) obtained
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained
+
+endif HAVE_MD5SUM
diff --git a/demos/ppl_lcdd/Makefile.in b/demos/ppl_lcdd/Makefile.in
new file mode 100644
index 0000000..09135ae
--- /dev/null
+++ b/demos/ppl_lcdd/Makefile.in
@@ -0,0 +1,770 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+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
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_lcdd_SOURCES)
+DIST_SOURCES = $(ppl_lcdd_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_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@
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/Makefile'; \
+ 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
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+ppl_lcdd$(EXEEXT): $(ppl_lcdd_OBJECTS) $(ppl_lcdd_DEPENDENCIES)
+ @rm -f ppl_lcdd$(EXEEXT)
+ $(CXXLINK) $(ppl_lcdd_LDFLAGS) $(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@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ 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)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-recursive
+
+install-man:
+
+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-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ check-local clean clean-binPROGRAMS clean-generic \
+ clean-libtool clean-recursive ctags ctags-recursive distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
+ pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-info-am
+
+
+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) $< -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) $< -lpolylibgmp -lgmpxx -lgmp $(top_builddir)/utils/libppl_utils.a
+
+ at HAVE_MD5SUM_TRUE@check-local: ppl_lcdd
+ at HAVE_MD5SUM_TRUE@ echo $(TOUGH_EXAMPLES) >tough_examples
+ at HAVE_MD5SUM_TRUE@ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at HAVE_MD5SUM_TRUE@ LANG=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@ grep $$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 $$path; \
+ at HAVE_MD5SUM_TRUE@ ./ppl_lcdd $$path | $(TEXT_MD5SUM) >>obtained; \
+ at HAVE_MD5SUM_TRUE@ done
+ at HAVE_MD5SUM_TRUE@ diff -u $(srcdir)/$(EXPECTED) obtained
+# 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..4ddf077
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.am
@@ -0,0 +1,135 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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..771315f
--- /dev/null
+++ b/demos/ppl_lcdd/examples/Makefile.in
@@ -0,0 +1,552 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+SOURCES =
+DIST_SOURCES =
+DATA = $(dist_noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lcdd/examples/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-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..2e253f8
--- /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 d41d8cd98f00b204e9800998ecf8427e -
+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.cc b/demos/ppl_lcdd/ppl_lcdd.cc
new file mode 100644
index 0000000..5391e47
--- /dev/null
+++ b/demos/ppl_lcdd/ppl_lcdd.cc
@@ -0,0 +1,1294 @@
+/* A sort of clone of the cddlib test program `lcdd'.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 !CXX_SUPPORTS_ATTRIBUTE_WEAK
+extern "C" void
+set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+#elif defined(USE_POLKA)
+
+#include <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 <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 <cstdarg>
+#include <csignal>
+#include <cerrno>
+#include <cstring>
+#include <cstdio>
+#include <cstdlib>
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
+
+#ifdef HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+// Include this for `getopt()': especially important if we do not have
+// <getopt.h>.
+# include <unistd.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
+
+namespace {
+
+#ifdef HAVE_GETOPT_H
+struct option long_options[] = {
+ {"max-cpu", required_argument, 0, 'C'},
+ {"max-memory", required_argument, 0, 'R'},
+ {"help", no_argument, 0, 'h'},
+ {"version", no_argument, 0, 'V'},
+ {"output", required_argument, 0, 'o'},
+ {"timings", no_argument, 0, 't'},
+ {"verbose", no_argument, 0, 'v'},
+#if defined(USE_PPL)
+ {"check", required_argument, 0, 'c'},
+#endif
+ {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]...\n\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"
+" -V, --version prints version information 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)
+" -cPATH, --check=PATH checks if the result is equal to what is in PATH\n"
+#endif
+#ifndef 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:hVo:tvc:"
+#else
+#define OPTION_LETTERS "C:R:hVo:tv"
+#endif
+
+const char* program_name = 0;
+
+unsigned long max_seconds_of_cpu_time = 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);
+}
+
+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);
+ 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);
+ 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);
+}
+
+extern "C" typedef void (*sig_handler_type)(int);
+
+void
+set_alarm_on_cpu_time(const unsigned 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));
+ }
+}
+
+#if HAVE_DECL_RLIMIT_AS
+void
+limit_virtual_memory(const unsigned 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) {
+}
+#endif // !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 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;
+
+ char* endptr;
+ long l;
+ switch (c) {
+ case 0:
+ break;
+
+ case '?':
+ case 'h':
+ fprintf(stdout, usage_string, argv[0]);
+ exit(0);
+ break;
+
+ case 'V':
+ fprintf(stdout, "%s\n", PPL_VERSION);
+ exit(0);
+ break;
+
+ 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;
+
+ case 'R':
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0)
+ fatal("a non-negative integer must follow `-R'");
+ else
+ max_bytes_of_virtual_memory = l*1024*1024;
+ break;
+
+ case 'o':
+ output_file_name = optarg;
+ break;
+
+ case 't':
+ print_timings = true;
+ break;
+
+ case 'v':
+ verbose = true;
+ break;
+
+ case 'c':
+ check_file_name = optarg;
+ 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;
+ }
+}
+
+
+void
+normalize(const std::vector<mpq_class>& source,
+ std::vector<mpz_class>& dest,
+ mpz_class& denominator) {
+ unsigned n = source.size();
+ denominator = 1;
+ for (unsigned i = 0; i < n; ++i)
+ mpz_lcm(denominator.get_mpz_t(),
+ denominator.get_mpz_t(),
+ source[i].get_den().get_mpz_t());
+ for (unsigned i = 0; i < n; ++i)
+ dest[i] = denominator*source[i];
+}
+
+template <typename T>
+bool
+guarded_read(std::istream& in, T& x) {
+ try {
+ return in >> x;
+ }
+ catch (...) {
+ return false;
+ }
+}
+
+template <typename T>
+void
+guarded_write(std::ostream& out, const T& x) {
+ bool succeeded = false;
+ try {
+ succeeded = out << x;
+ }
+ 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) {
+ unsigned 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 istr(s);
+ if (!guarded_read(istr, 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");
+ 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 istr(s);
+ if (!guarded_read(istr, 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 istr(s);
+ read_coefficients(istr, 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);
+#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);
+#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)
+ PPL::dimension_type space_dim = ph.space_dimension();
+#elif defined(USE_POLKA)
+ unsigned space_dim = poly_dimension(ph);
+#elif defined(USE_POLYLIB)
+ 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 num, den;
+ PPL::assign_r(num,
+ g.coefficient(PPL::Variable(j)),
+ PPL::ROUND_NOT_NEEDED);
+ PPL::assign_r(den, divisor, PPL::ROUND_NOT_NEEDED);
+ guarded_write(out, mpq_class(num, den));
+ }
+ }
+ }
+ 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 {
+ flush_succeeded = out.flush();
+ }
+ 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);
+
+ if (max_seconds_of_cpu_time > 0)
+ set_alarm_on_cpu_time(max_seconds_of_cpu_time, timeout);
+
+ 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);
+
+ 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;
+ 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..06c7f75
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.am
@@ -0,0 +1,160 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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
+
+if BUILD_C_INTERFACE
+if HAVE_GLPK
+
+AM_CPPFLAGS = -I$(top_builddir)/interfaces/C @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
+ppl_lpsol_LDADD = \
+-lglpk \
+$(top_builddir)/interfaces/C/libppl_c.la \
+$(top_builddir)/src/libppl.la \
+ at extra_libraries@
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED = \
+afiro.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 \
+kb2.mps \
+mip.mps \
+sc105.mps \
+sc50a.mps \
+sc50b.mps \
+ship08l.mps \
+$(TOUGH_EXAMPLES_FOR_ENUM_IF_ASSERTIONS_ENABLED)
+
+TOUGH_EXAMPLES_FOR_SIMPLEX = \
+ship08l.mps
+
+if HOST_OS_CYGWIN
+
+DIFF_COMMAND = \
+grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& grep "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_CYGWIN
+
+if HOST_OS_DARWIN
+
+DIFF_COMMAND = \
+grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+&& grep "^Optimum value: " obtained >obtained_optima \
+&& diff -u expected_optima obtained_optima
+
+else !HOST_OS_DARWIN
+
+if HOST_OS_SOLARIS
+
+DIFF_COMMAND = \
+grep "^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 \
+&& grep "^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
+
+DIFF_COMMAND = diff -u $(srcdir)/$(EXPECTED) obtained
+
+endif !HOST_OS_SOLARIS
+
+endif !HOST_OS_DARWIN
+
+endif !HOST_OS_CYGWIN
+
+check-local: ppl_lpsol
+ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ LANG=C; \
+ for path in $(srcdir)/examples/*.mps; \
+ do \
+ file=`basename $$path`; \
+ grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ for m in -m -M; \
+ do \
+ echo "*** ppl_lpsol -e $$m -oobtained $$file" >>obtained; \
+ ./ppl_lpsol -e $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ done \
+ done
+ echo $(TOUGH_EXAMPLES_FOR_SIMPLEX) >tough_examples
+ for path in $(srcdir)/examples/*.mps; \
+ do \
+ file=`basename $$path`; \
+ grep $$file tough_examples >/dev/null 2>&1 && continue; \
+ for m in -m -M; \
+ do \
+ echo "*** ppl_lpsol -s $$m -oobtained $$file" >>obtained; \
+ ./ppl_lpsol -s $(CHECK_OPTION) $$m -oobtained $$path >/dev/null; \
+ done \
+ done
+ $(DIFF_COMMAND)
+
+MOSTLYCLEANFILES = \
+tough_examples \
+obtained \
+expected_optima \
+obtained_optima
+
+endif HAVE_GLPK
+endif BUILD_C_INTERFACE
diff --git a/demos/ppl_lpsol/Makefile.in b/demos/ppl_lpsol/Makefile.in
new file mode 100644
index 0000000..50a89da
--- /dev/null
+++ b/demos/ppl_lpsol/Makefile.in
@@ -0,0 +1,821 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+am__installdirs = "$(DESTDIR)$(bindir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+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 = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ 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 = $(top_builddir)/interfaces/C/libppl_c.la \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ $(top_builddir)/src/libppl.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_lpsol_SOURCES)
+DIST_SOURCES = $(am__ppl_lpsol_SOURCES_DIST)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_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
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at AM_CPPFLAGS = -I$(top_builddir)/interfaces/C @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
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at ppl_lpsol_LDADD = \
+ 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 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_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 kb2.mps \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at mip.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@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_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_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 at grep "^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@&& grep "^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 at grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_FALSE@@HOST_OS_DARWIN_TRUE@&& grep "^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 at grep "^Optimum value: " $(srcdir)/$(EXPECTED) >expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& grep "^Optimum value: " obtained >obtained_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@@HOST_OS_CYGWIN_TRUE@&& diff -u expected_optima obtained_optima
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at MOSTLYCLEANFILES = \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at tough_examples \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at obtained \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at expected_optima \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at obtained_optima
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/Makefile'; \
+ 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
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+ppl_lpsol$(EXEEXT): $(ppl_lpsol_OBJECTS) $(ppl_lpsol_DEPENDENCIES)
+ @rm -f ppl_lpsol$(EXEEXT)
+ $(CXXLINK) $(ppl_lpsol_LDFLAGS) $(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)/ppl_lpsol.Po at am__quote@
+
+.c.o:
+ at am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(COMPILE) -c $<
+
+.c.obj:
+ at am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
+
+.c.lo:
+ at am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ 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 $(PROGRAMS)
+installdirs: installdirs-recursive
+installdirs-am:
+ for dir in "$(DESTDIR)$(bindir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS
+
+install-info: install-info-recursive
+
+install-man:
+
+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-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ check-local clean clean-binPROGRAMS clean-generic \
+ clean-libtool clean-recursive ctags ctags-recursive distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-binPROGRAMS \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs installdirs-am \
+ maintainer-clean maintainer-clean-generic \
+ maintainer-clean-recursive mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-recursive \
+ pdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \
+ uninstall-binPROGRAMS uninstall-info-am
+
+
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE at check-local: ppl_lpsol
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(ECHO_N) "$(ECHO_C)" >obtained
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ echo $(TOUGH_EXAMPLES_FOR_ENUM) >tough_examples
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ LANG=C; \
+ 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@ grep $$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 "*** ppl_lpsol -e $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ ./ppl_lpsol -e $(CHECK_OPTION) $$m -oobtained $$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@ 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@ grep $$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 "*** ppl_lpsol -s $$m -oobtained $$file" >>obtained; \
+ at BUILD_C_INTERFACE_TRUE@@HAVE_GLPK_TRUE@ ./ppl_lpsol -s $(CHECK_OPTION) $$m -oobtained $$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@ $(DIFF_COMMAND)
+# 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..fbf56a6
--- /dev/null
+++ b/demos/ppl_lpsol/dummy.cc
@@ -0,0 +1 @@
+// 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..e10393f
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.am
@@ -0,0 +1,38 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+ex1.mps \
+kb2.mps \
+mip.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..82c7b70
--- /dev/null
+++ b/demos/ppl_lpsol/examples/Makefile.in
@@ -0,0 +1,456 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = README $(dist_noinst_DATA) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+SOURCES =
+DIST_SOURCES =
+DATA = $(dist_noinst_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+dist_noinst_DATA = \
+adlittle.mps \
+afiro.mps \
+bgprtr.mps \
+blend.mps \
+boeing1.mps \
+boeing2.mps \
+ex1.mps \
+kb2.mps \
+mip.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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign demos/ppl_lpsol/examples/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-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..91cfe27
--- /dev/null
+++ b/demos/ppl_lpsol/examples/README
@@ -0,0 +1,7 @@
+Most of the examples in this directory have been taken from the `lp'
+library of Netlib [1].
+
+
+--------
+
+[1] http://www.netlib.org/
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..cd267e5
--- /dev/null
+++ b/demos/ppl_lpsol/examples/blend.mps
@@ -0,0 +1,359 @@
+NAME BLEND BRUCE MURTAGHS BLENDING PROBLEM (MINIMIZE).
+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 -.537 3 -.131
+ 1 4 -.1155 5 -.0365
+ 1 6 -.143 7 -.037
+ 1 40 .003 41 .0587
+ 1 42 .15 43 .302
+ 1 67 1. C 3.2
+ 2 1 -.2931 3 -.117
+ 2 4 -.0649 5 -.1233
+ 2 6 -.2217 8 -.18
+ 2 39 .0042 40 .003
+ 2 41 .1053 42 .185
+ 2 43 .384 50 -.00862
+ 2 51 -.00862 56 -.0101
+ 2 57 -.0101 68 1.
+ 2 C 2.87
+ 3 2 1. 9 -.0277
+ 3 10 -.0563 11 -.199
+ 3 12 -.6873 13 -.017
+ 3 40 .01303 41 .0506
+ 3 42 .209 43 .495
+ 3 65 1.
+ 4 1 1. 9 -.0112
+ 4 10 -.0378 11 -.1502
+ 4 12 -.7953 13 -.0099
+ 4 40 .01303 41 .0448
+ 4 42 .185 43 .721
+ 4 65 1.
+ 5 9 -.175 10 -.27
+ 5 11 -.028 13 -.455
+ 5 21 1. 40 .01303
+ 5 41 .0506 42 .209
+ 5 43 .495
+ 6 9 -.271 10 -.3285
+ 6 11 -.0255 13 -.2656
+ 6 18 1. 40 .01303
+ 6 41 .0506 42 .209
+ 6 43 .495
+ 7 9 -.2836 10 -.3285
+ 7 11 -.0241 13 -.2502
+ 7 17 1. 40 .01303
+ 7 41 .0506 42 .209
+ 7 43 .495
+ 8 12 1. 14 -1.
+ 8 39 .0327 41 .094
+ 8 42 .045 43 .793
+ 8 C .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 -.0588
+ 13 19 -.8145 23 -.0091
+ 13 39 -.8239 40 .0081
+ 13 41 -.2112 42 .387
+ 13 43 1.03 69 1.3
+ 13 C .07
+ 14 16 1. 18 -.0404
+ 14 20 -.8564 23 -.0069
+ 14 39 -.7689 40 .0063
+ 14 41 -.156 42 .297
+ 14 43 .792 69 1.
+ 14 C .0378
+ 15 5 1. 21 -.3321
+ 15 22 -.5875 23 -.362
+ 15 39 2.3 41 -.2049
+ 15 42 .826 43 14.61
+ 15 65 1. 70 1.
+ 15 C .155
+ 16 6 1. 21 -.3321
+ 16 22 -.5875 23 -.362
+ 16 39 2.3 41 -.2049
+ 16 42 .826 43 14.61
+ 16 66 1. 70 1.
+ 16 C .155
+ 17 4 1. 21 -.2414
+ 17 22 -.6627 23 -.293
+ 17 39 2.3 41 -.1531
+ 17 42 .826 43 14.61
+ 17 65 1. 70 1.
+ 17 C .155
+ 18 21 -.2414 22 -.6627
+ 18 23 -.293 28 1.
+ 18 39 2.3 41 -.1531
+ 18 42 .826 43 14.61
+ 18 70 1. C .155
+ 19 5 1. 10 -.0185
+ 19 13 -.0568 24 -.0806
+ 19 25 -.0658 26 -.0328
+ 19 27 -.4934 28 -.2922
+ 19 29 -.0096 40 -.0654
+ 19 41 -.2535 42 .632
+ 19 43 .6807 65 1.
+ 19 71 1. C .0528
+ 20 6 1. 10 -.0185
+ 20 13 -.0568 24 -.0806
+ 20 25 -.0658 26 -.0328
+ 20 27 -.4934 28 -.2922
+ 20 29 -.0096 40 -.0654
+ 20 41 -.2535 42 .632
+ 20 43 .6807 66 1.
+ 20 71 1. C .0528
+ 21 4 1. 10 -.0184
+ 21 13 -.0564 24 -.078
+ 21 25 -.0655 26 -.0303
+ 21 27 -.475 28 -.305
+ 21 40 -.0654 41 -.2703
+ 21 42 .632 43 .6807
+ 21 65 1. 71 1.
+ 21 C .0528
+ 22 3 1. 10 -.0184
+ 22 13 -.0564 24 -.078
+ 22 25 -.0655 26 -.0303
+ 22 27 -.475 28 -.305
+ 22 40 -.0654 41 -.2703
+ 22 42 .632 43 .6807
+ 22 65 1. 71 1.
+ 22 C .0528
+ 23 13 .76 25 .5714
+ 23 30 -1. 40 .1869
+ 23 41 .2796 42 2.241
+ 23 43 2.766 72 1.
+ 23 C .128
+ 24 9 -.0571 10 -.0114
+ 24 13 .6571 24 .5714
+ 24 31 -1. 40 .1724
+ 24 41 .2579 42 2.067
+ 24 43 2.552 72 1.
+ 24 C .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 .233 49 -.358
+ 31 20 1. 32 -1.
+ 31 44 -9.03 45 -9.32
+ 31 46 -3. 47 3.5
+ 31 48 .205 49 -.333
+ 32 27 1. 32 -1.
+ 32 44 -9.23 45 -9.22
+ 32 46 -3. 47 6.
+ 32 48 .381 49 -.509
+ 33 30 1. 32 -1.
+ 33 44 -9.4 45 -9.85
+ 33 46 -3. 47 2.5
+ 33 48 .39 49 -.77
+ 34 31 1. 32 -1.
+ 34 44 -9.74 45 -10.1
+ 34 46 -3. 47 3.3
+ 34 48 .233 49 -.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 -.493 45 -.165
+ 36 46 1. C .0924
+ 37 32 1. 44 10.03
+ 37 45 10.03 47 -9.5
+ 37 48 -.5 49 .5
+ 37 73 .64 74 .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 .233 55 -.358
+ 41 20 1. 33 -1.
+ 41 50 -9.06 51 -9.2
+ 41 52 -3. 53 3.5
+ 41 54 .205 55 -.333
+ 42 27 1. 33 -1.
+ 42 50 -9.26 51 -9.13
+ 42 52 -3. 53 6.
+ 42 54 .318 55 -.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 -.435 51 -.208
+ 44 52 1. C .0924
+ 45 33 1. 50 9.65
+ 45 51 9.65 53 -9.5
+ 45 54 -.5 55 .5
+ 45 73 -.36 74 .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 .233 61 -.358
+ 49 20 1. 36 -1.
+ 49 56 -9.07 57 -9.21
+ 49 58 -3. 59 3.5
+ 49 60 .205 61 -.333
+ 50 27 1. 36 -1.
+ 50 56 -9.27 57 -9.14
+ 50 58 -3. 59 6.
+ 50 60 .318 61 -.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 -.426 57 -.204
+ 52 58 1. C .0924
+ 53 36 1. 56 9.05
+ 53 57 9.05 59 -9.5
+ 53 60 -.5 61 .5
+ 53 73 -.36 74 -.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 -.8 64 .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 -.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 .04
+ 78 40 1.
+ 79 10 -.5 13 -.5
+ 79 C 3.
+ 80 41 -1. C .4
+ 81 41 1.
+ 82 42 -1. C .0132
+ 83 43 -1. C .01
+RHS
+ 65 23.26 66 5.25
+ 67 26.32 68 21.05
+ 69 13.45 70 2.58
+ 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/ex1.mps b/demos/ppl_lpsol/examples/ex1.mps
new file mode 100644
index 0000000..125f3d9
--- /dev/null
+++ b/demos/ppl_lpsol/examples/ex1.mps
@@ -0,0 +1,19 @@
+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
+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/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/sample.mps b/demos/ppl_lpsol/examples/sample.mps
new file mode 100644
index 0000000..fa3cffe
--- /dev/null
+++ b/demos/ppl_lpsol/examples/sample.mps
@@ -0,0 +1,22 @@
+* Problem: sample
+* Rows: 3
+* Columns: 3
+* Non-zeros: 12
+*
+NAME sample
+ROWS
+ N R______0
+ L p
+ L q
+ L r
+COLUMNS
+ x1 R______0 -10 r 2
+ q 10 p 1
+ x2 R______0 -6 r 2
+ q 4 p 1
+ x3 R______0 -4 r 6
+ q 5 p 1
+RHS
+ p 100 q 600
+ 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..059a663
--- /dev/null
+++ b/demos/ppl_lpsol/examples/unboundedmin.mps
@@ -0,0 +1,19 @@
+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
+ENDATA
diff --git a/demos/ppl_lpsol/expected_int16 b/demos/ppl_lpsol/expected_int16
new file mode 100644
index 0000000..def7b7f
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16
@@ -0,0 +1,79 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int16_a b/demos/ppl_lpsol/expected_int16_a
new file mode 100644
index 0000000..3b5becc
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int16_a
@@ -0,0 +1,67 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+*** ppl_lpsol -e -M -oobtained sample.mps
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int32 b/demos/ppl_lpsol/expected_int32
new file mode 100644
index 0000000..7017f87
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32
@@ -0,0 +1,98 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int32_a b/demos/ppl_lpsol/expected_int32_a
new file mode 100644
index 0000000..c147817
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int32_a
@@ -0,0 +1,96 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int64 b/demos/ppl_lpsol/expected_int64
new file mode 100644
index 0000000..7017f87
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64
@@ -0,0 +1,98 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int64_a b/demos/ppl_lpsol/expected_int64_a
new file mode 100644
index 0000000..c147817
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int64_a
@@ -0,0 +1,96 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int8 b/demos/ppl_lpsol/expected_int8
new file mode 100644
index 0000000..08d6efc
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8
@@ -0,0 +1,56 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+*** ppl_lpsol -e -M -oobtained afiro.mps
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+*** ppl_lpsol -e -M -oobtained sample.mps
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_int8_a b/demos/ppl_lpsol/expected_int8_a
new file mode 100644
index 0000000..4cbf25d
--- /dev/null
+++ b/demos/ppl_lpsol/expected_int8_a
@@ -0,0 +1,54 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+*** ppl_lpsol -e -M -oobtained sample.mps
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+*** ppl_lpsol -s -m -oobtained afiro.mps
+*** ppl_lpsol -s -M -oobtained afiro.mps
+*** ppl_lpsol -s -m -oobtained bgprtr.mps
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+*** ppl_lpsol -s -m -oobtained blend.mps
+*** ppl_lpsol -s -M -oobtained blend.mps
+*** ppl_lpsol -s -m -oobtained boeing1.mps
+*** ppl_lpsol -s -M -oobtained boeing1.mps
+*** ppl_lpsol -s -m -oobtained boeing2.mps
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+*** ppl_lpsol -s -m -oobtained ex1.mps
+*** ppl_lpsol -s -M -oobtained ex1.mps
+*** ppl_lpsol -s -m -oobtained kb2.mps
+*** ppl_lpsol -s -M -oobtained kb2.mps
+*** ppl_lpsol -s -m -oobtained mip.mps
+*** ppl_lpsol -s -M -oobtained mip.mps
+*** ppl_lpsol -s -m -oobtained sample.mps
+*** ppl_lpsol -s -M -oobtained sample.mps
+*** ppl_lpsol -s -m -oobtained sc105.mps
+*** ppl_lpsol -s -M -oobtained sc105.mps
+*** ppl_lpsol -s -m -oobtained sc50a.mps
+*** ppl_lpsol -s -M -oobtained sc50a.mps
+*** ppl_lpsol -s -m -oobtained sc50b.mps
+*** ppl_lpsol -s -M -oobtained sc50b.mps
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_mpz b/demos/ppl_lpsol/expected_mpz
new file mode 100644
index 0000000..4b5e468
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz
@@ -0,0 +1,1980 @@
+*** ppl_lpsol -e -m -oobtained afiro.mps
+Optimum value: -464.7531429
+Optimum location:
+X01 = 80
+X02 = 25.5
+X03 = 54.5
+X04 = 84.8
+X06 = 18.21428571
+X07 = 0
+X08 = 0
+X09 = 0
+X10 = 0
+X11 = 0
+X12 = 0
+X13 = 0
+X14 = 18.21428571
+X15 = 0
+X16 = 19.30714286
+X22 = 500
+X23 = 475.92
+X24 = 24.08
+X25 = 0
+X26 = 215
+X28 = 0
+X29 = 0
+X30 = 0
+X31 = 0
+X32 = 0
+X33 = 0
+X34 = 0
+X35 = 0
+X36 = 339.9428571
+X37 = 383.9428571
+X38 = 0
+X39 = 0
+*** ppl_lpsol -e -M -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 -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+Optimum value: 225494.9632
+Optimum location:
+...100 = 22.85454545
+...101 = 0.5454545455
+...102 = 4.62693727
+...103 = 0
+...104 = 0
+...105 = 35.10714286
+...106 = 4.793014706
+...107 = 2.942801288
+...108 = 0
+...109 = 44.40554954
+...110 = 0
+...111 = 9.884315099
+...112 = 0
+...113 = 0
+...114 = 108
+...115 = 0
+...116 = 0
+...117 = 0
+...118 = 0
+...119 = 0
+...120 = 13
+...121 = 0
+...122 = 0
+...123 = 0
+...124 = 73.92849567
+...125 = 51.29498565
+...126 = 139.7765187
+...127 = 0
+...128 = 0
+...129 = 109.3391662
+...130 = 3.803724425
+...131 = 3.920125575
+...132 = 134
+...133 = 0
+...134 = 0
+...135 = 0
+...136 = 31
+...137 = 0
+...138 = 0
+...139 = 0
+...140 = 0
+...141 = 60
+...142 = 111.7272727
+...143 = 0
+...144 = 51.90909091
+...145 = 29.86330761
+...146 = 4.136692391
+...147 = 0
+...148 = 0
+...149 = 41.5
+...150 = 0
+...151 = 15.4788166
+...152 = 0
+...153 = 15
+...154 = 0
+...155 = 0
+...156 = 3.1
+...157 = 0
+...158 = 0.6909090909
+...159 = 0
+...160 = 0
+...161 = 175.4447167
+...162 = 0
+...163 = 9.806141065
+...164 = 0
+...165 = 0
+...166 = 33.46836966
+...167 = 9.531630344
+...168 = 10.29307503
+...169 = 8.906924975
+...170 = 0
+...171 = 0
+...172 = 6.1
+...173 = 0
+...174 = 9.792857143
+...175 = 313.1973528
+...176 = 55.43167804
+...177 = 264.5552833
+...178 = 0
+...179 = 13.2
+...180 = 0
+...181 = 1.314479773
+...182 = 0.5032608696
+...183 = 0
+...184 = 0
+...185 = 0
+...186 = 0
+...187 = 0
+...188 = 0
+...189 = 0
+...190 = 0
+...191 = 13.5
+...192 = 8.737073136
+...193 = 0
+...194 = 31.2
+...195 = 0
+...196 = 0
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained 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 -M -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 -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained blend.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained 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 = 73
+PBOSSFO1 = 60
+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 = 33.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 37
+PLASYVR6 = 0
+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 = 75
+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 = 0
+PLAXTPE8 = 22.41860465
+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 = 145
+PSEATPE0 = 75.80232558
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 1.61627907
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 138
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 33.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 6
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 17
+PSFOTYO8 = 0
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 51.01162791
+PTPETYO1 = 0
+PTPETYO2 = 59.98837209
+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.085065997
+N1011AC3 = 0.6951730225
+N1011AC4 = 0
+N1011AC5 = 3.897217245
+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.7048194146
+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.4860357966
+N1033AC2 = 0.500476922
+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 -M -oobtained 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 = 73
+PBOSSFO1 = 48
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 383.9469027
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 0
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 0
+PBOSYYZ1 = 193
+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 = 295.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 139
+PLAXSEA8 = 139
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 1090
+PLAXSFO2 = 0
+PLAXSFO3 = 20
+PLAXSFO4 = 68
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 9
+PLAXTYO2 = 27
+PLAXTYO8 = 0
+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 = 822
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 20
+PSEASFO6 = 68
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 117
+PSEATYO3 = 0
+PSEAYVR0 = 0
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 649.2523364
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 0
+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 = 99
+PTPETYO3 = 0
+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 = 1997
+PYULYYZ4 = 107.6981132
+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.986798017
+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.782713662
+N1018AC2 = 6.749720383
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001304
+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.793776249
+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 -m -oobtained 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 = 0
+PBOSCLE1 = 142
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 182.705314
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 119.294686
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 12.29468599
+PORDCLE1 = 0
+PORDCLE2 = 458
+PORDCLE3 = 148.705314
+PLGABOS0 = 913
+PLGABOS1 = 458
+PLGABOS2 = 0
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1372
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 0
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 131
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 409
+PCLELGA1 = 0
+PCLELGA2 = 0
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 3.188405797
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 20.8115942
+CORDBOS1 = 0
+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 = 0.1254559795
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 2.540816327
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 9.316326531
+N1008AC4 = 2
+N1010AC2 = 4.673469388
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 14
+N1201AC4 = 0
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+Optimum value: -73.36896911
+Optimum location:
+PBOSORD0 = 277
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 258.2518987
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810133
+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 = 517
+PLGABOS3 = 686
+PLGABOS4 = 426.7481013
+PLGABOS5 = 401.2518987
+PLGAORD0 = 258.2518987
+PLGAORD1 = 0
+PLGAORD2 = 453.7481013
+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 = 0
+PCLELGA1 = 0
+PCLELGA2 = 18
+PCLELGA3 = 391
+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 = 0
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 19.2
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 20.1
+CLGAORD3 = 15.9
+CLGACLE0 = 10.4
+CLGACLE1 = 2.4
+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.635223456
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 0.9244444444
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082667
+N1019AC4 = 2
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 0.9244444444
+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 = 0
+N1012AC4 = 2
+N1014AC2 = 5.275510204
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572463
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 4.094407129
+N1201AC4 = 0
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained 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 -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 50
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 50
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 50
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 27.27272727
+COL00022 = 0
+COL00023 = 0
+COL00024 = 63.63636364
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 163.6363636
+COL00030 = 0
+COL00031 = 0
+COL00032 = 163.6363636
+COL00033 = 0
+COL00034 = 45.45454545
+COL00035 = 109.0909091
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 45.45454545
+COL00040 = 272.7272727
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 100
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 145.4545455
+COL00051 = 272.7272727
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 100
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 245.4545455
+COL00062 = 272.7272727
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 100
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 345.4545455
+COL00073 = 272.7272727
+COL00074 = 0
+COL00075 = 0
+COL00076 = 272.7272727
+COL00077 = 0
+COL00078 = 9.090909091
+COL00079 = 181.8181818
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 354.5454545
+COL00084 = 454.5454545
+COL00085 = 0
+COL00086 = 354.5454545
+COL00087 = 454.5454545
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 369.6969697
+COL00092 = 0
+COL00093 = 0
+COL00094 = 354.5454545
+COL00095 = 454.5454545
+COL00096 = 369.6969697
+COL00097 = 0
+COL00098 = 100
+COL00099 = 0
+COL00100 = 20
+COL00101 = 20
+COL00102 = 93.33333333
+COL00103 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 20
+COL00002 = 55
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 20
+COL00007 = 55
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 70
+COL00013 = 30
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 90
+COL00018 = 85
+COL00019 = 0
+COL00020 = 0
+COL00021 = 85
+COL00022 = 0
+COL00023 = 41.66666667
+COL00024 = 86.66666667
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 131.6666667
+COL00029 = 171.6666667
+COL00030 = 0
+COL00031 = 131.6666667
+COL00032 = 171.6666667
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 201.1111111
+COL00037 = 0
+COL00038 = 0
+COL00039 = 131.6666667
+COL00040 = 171.6666667
+COL00041 = 201.1111111
+COL00042 = 0
+COL00043 = 40
+COL00044 = 0
+COL00045 = 17
+COL00046 = 17
+COL00047 = 79.33333333
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained 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 = 100
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 100
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 200
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 100
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 200
+COL00041 = 100
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/expected_mpz_a b/demos/ppl_lpsol/expected_mpz_a
new file mode 100644
index 0000000..ffb6e8d
--- /dev/null
+++ b/demos/ppl_lpsol/expected_mpz_a
@@ -0,0 +1,1910 @@
+*** ppl_lpsol -e -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -e -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -e -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -e -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -e -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -e -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -e -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+*** ppl_lpsol -s -m -oobtained adlittle.mps
+Optimum value: 225494.9632
+Optimum location:
+...100 = 22.85454545
+...101 = 0.5454545455
+...102 = 4.62693727
+...103 = 0
+...104 = 0
+...105 = 35.10714286
+...106 = 4.793014706
+...107 = 2.942801288
+...108 = 0
+...109 = 44.40554954
+...110 = 0
+...111 = 9.884315099
+...112 = 0
+...113 = 0
+...114 = 108
+...115 = 0
+...116 = 0
+...117 = 0
+...118 = 0
+...119 = 0
+...120 = 13
+...121 = 0
+...122 = 0
+...123 = 0
+...124 = 73.92849567
+...125 = 51.29498565
+...126 = 139.7765187
+...127 = 0
+...128 = 0
+...129 = 109.3391662
+...130 = 3.803724425
+...131 = 3.920125575
+...132 = 134
+...133 = 0
+...134 = 0
+...135 = 0
+...136 = 31
+...137 = 0
+...138 = 0
+...139 = 0
+...140 = 0
+...141 = 60
+...142 = 111.7272727
+...143 = 0
+...144 = 51.90909091
+...145 = 29.86330761
+...146 = 4.136692391
+...147 = 0
+...148 = 0
+...149 = 41.5
+...150 = 0
+...151 = 15.4788166
+...152 = 0
+...153 = 15
+...154 = 0
+...155 = 0
+...156 = 3.1
+...157 = 0
+...158 = 0.6909090909
+...159 = 0
+...160 = 0
+...161 = 175.4447167
+...162 = 0
+...163 = 9.806141065
+...164 = 0
+...165 = 0
+...166 = 33.46836966
+...167 = 9.531630344
+...168 = 10.29307503
+...169 = 8.906924975
+...170 = 0
+...171 = 0
+...172 = 6.1
+...173 = 0
+...174 = 9.792857143
+...175 = 313.1973528
+...176 = 55.43167804
+...177 = 264.5552833
+...178 = 0
+...179 = 13.2
+...180 = 0
+...181 = 1.314479773
+...182 = 0.5032608696
+...183 = 0
+...184 = 0
+...185 = 0
+...186 = 0
+...187 = 0
+...188 = 0
+...189 = 0
+...190 = 0
+...191 = 13.5
+...192 = 8.737073136
+...193 = 0
+...194 = 31.2
+...195 = 0
+...196 = 0
+*** ppl_lpsol -s -M -oobtained adlittle.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained 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 -M -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 -s -m -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -M -oobtained bgprtr.mps
+Unfeasible problem.
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained blend.mps
+Unbounded problem.
+*** ppl_lpsol -s -m -oobtained 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 = 73
+PBOSSFO1 = 60
+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 = 33.01327253
+PLASSEA1 = 342.9867275
+PLASYVR0 = 37
+PLASYVR6 = 0
+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 = 75
+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 = 0
+PLAXTPE8 = 22.41860465
+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 = 145
+PSEATPE0 = 75.80232558
+PSEATPE1 = 0
+PSEATPE2 = 0
+PSEATPE3 = 1.61627907
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 0
+PSEATYO3 = 138
+PSEAYVR0 = 164.8598131
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 392
+PSEAYVR4 = 0
+PSEAYVR5 = 33.01327253
+PSEAYVR6 = 0
+PSEAYVR7 = 50.75581395
+PSEAYVR8 = 47.16549296
+PSFOTPE0 = 0
+PSFOTPE1 = 0
+PSFOTPE2 = 6
+PSFOTPE8 = 0
+PSFOTYO0 = 0
+PSFOTYO1 = 0
+PSFOTYO2 = 17
+PSFOTYO8 = 0
+PSFOYVR0 = 260.8488372
+PSFOYVR1 = 37.15116279
+PTPETYO0 = 51.01162791
+PTPETYO1 = 0
+PTPETYO2 = 59.98837209
+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.085065997
+N1011AC3 = 0.6951730225
+N1011AC4 = 0
+N1011AC5 = 3.897217245
+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.7048194146
+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.4860357966
+N1033AC2 = 0.500476922
+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 -M -oobtained 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 = 73
+PBOSSFO1 = 48
+PBOSTPE1 = 0
+PBOSTPE2 = 0
+PBOSTYO1 = 0
+PBOSTYO2 = 0
+PBOSYUL0 = 383.9469027
+PBOSYUL1 = 224.0530973
+PBOSYUL2 = 0
+PBOSYUL3 = 0
+PBOSYUL4 = 0
+PBOSYVR0 = 0
+PBOSYVR1 = 23
+PBOSYVR2 = 0
+PBOSYWG0 = 33
+PBOSYWG1 = 0
+PBOSYWG7 = 0
+PBOSYYZ0 = 0
+PBOSYYZ1 = 193
+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 = 295.96875
+PLAXSEA1 = 0
+PLAXSEA2 = 0
+PLAXSEA3 = 0
+PLAXSEA4 = 6
+PLAXSEA5 = 139
+PLAXSEA6 = 0
+PLAXSEA7 = 139
+PLAXSEA8 = 139
+PLAXSEA9 = 12.03125
+PLAXSFO0 = 164.828125
+PLAXSFO1 = 1090
+PLAXSFO2 = 0
+PLAXSFO3 = 20
+PLAXSFO4 = 68
+PLAXSFO5 = 144
+PLAXSFO6 = 1212.171875
+PLAXTPE0 = 0
+PLAXTPE1 = 18
+PLAXTPE2 = 9
+PLAXTPE8 = 0
+PLAXTYO0 = 0
+PLAXTYO1 = 9
+PLAXTYO2 = 27
+PLAXTYO8 = 0
+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 = 822
+PSEASFO1 = 0
+PSEASFO2 = 156
+PSEASFO3 = 224
+PSEASFO4 = 0
+PSEASFO5 = 20
+PSEASFO6 = 68
+PSEATPE0 = 0
+PSEATPE1 = 0
+PSEATPE2 = 42
+PSEATPE3 = 0
+PSEATYO0 = 0
+PSEATYO1 = 0
+PSEATYO2 = 117
+PSEATYO3 = 0
+PSEAYVR0 = 0
+PSEAYVR1 = 0
+PSEAYVR2 = 0
+PSEAYVR3 = 649.2523364
+PSEAYVR4 = 0
+PSEAYVR5 = 0
+PSEAYVR6 = 0
+PSEAYVR7 = 0
+PSEAYVR8 = 0
+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 = 99
+PTPETYO3 = 0
+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 = 1997
+PYULYYZ4 = 107.6981132
+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.986798017
+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.782713662
+N1018AC2 = 6.749720383
+N1018AC3 = 7
+N1018AC4 = 0
+N1018AC5 = 4.039001304
+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.793776249
+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 -m -oobtained 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 = 0
+PBOSCLE1 = 142
+PBOSCLE2 = 0
+PBOSCLE3 = 0
+PORDBOS0 = 182.705314
+PORDBOS1 = 0
+PORDBOS2 = 0
+PORDBOS3 = 119.294686
+PORDBOS4 = 0
+PORDLGA0 = 0
+PORDLGA1 = 515
+PORDLGA2 = 0
+PORDLGA3 = 0
+PORDCLE0 = 12.29468599
+PORDCLE1 = 0
+PORDCLE2 = 458
+PORDCLE3 = 148.705314
+PLGABOS0 = 913
+PLGABOS1 = 458
+PLGABOS2 = 0
+PLGABOS3 = 0
+PLGABOS4 = 0
+PLGABOS5 = 1372
+PLGAORD0 = 712
+PLGAORD1 = 0
+PLGAORD2 = 0
+PLGAORD3 = 0
+PLGACLE0 = 0
+PLGACLE1 = 249
+PLGACLE2 = 268
+PCLEBOS0 = 0
+PCLEBOS1 = 0
+PCLEBOS2 = 0
+PCLEBOS3 = 131
+PCLEBOS4 = 0
+PCLEORD0 = 178.5972891
+PCLEORD1 = 249
+PCLEORD2 = 16.40271092
+PCLEORD3 = 268
+PCLEORD4 = 0
+PCLELGA0 = 409
+PCLELGA1 = 0
+PCLELGA2 = 0
+PCLELGA3 = 0
+BBOSORD0 = 0
+BBOSORD1 = 0
+BBOSCLE0 = 0.1616272102
+BBOSCLE1 = 7.026778587
+BORDBOS0 = 3.188405797
+CBOSORD0 = 12
+CBOSORD1 = 0
+CBOSORD2 = 0
+CBOSORD3 = 0
+CBOSORD4 = 0
+CBOSCLE0 = 0
+CBOSCLE1 = 8.811594203
+CBOSCLE2 = 0
+CBOSCLE3 = 0
+CORDBOS0 = 20.8115942
+CORDBOS1 = 0
+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 = 0.1254559795
+N1002AC3 = 0
+N1002AC4 = 0
+N1004AC2 = 2.540816327
+N1004AC4 = 2
+N1006AC1 = 0.5990338164
+N1006AC2 = 0
+N1006AC3 = 0.6937198068
+N1006AC4 = 0
+N1008AC2 = 9.316326531
+N1008AC4 = 2
+N1010AC2 = 4.673469388
+N1010AC4 = 0
+N1012AC2 = 0
+N1012AC4 = 1.422222222
+N1014AC2 = 0
+N1014AC4 = 0
+N1100AC2 = 2.734693878
+N1100AC4 = 0
+N1102AC2 = 0
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0
+N1201AC2 = 14
+N1201AC4 = 0
+*** ppl_lpsol -s -M -oobtained boeing2.mps
+Optimum value: -73.36896911
+Optimum location:
+PBOSORD0 = 277
+PBOSORD1 = 0
+PBOSORD2 = 0
+PBOSORD3 = 0
+PBOSORD4 = 0
+PBOSLGA0 = 258.2518987
+PBOSLGA1 = 686
+PBOSLGA2 = 35.74810133
+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 = 517
+PLGABOS3 = 686
+PLGABOS4 = 426.7481013
+PLGABOS5 = 401.2518987
+PLGAORD0 = 258.2518987
+PLGAORD1 = 0
+PLGAORD2 = 453.7481013
+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 = 0
+PCLELGA1 = 0
+PCLELGA2 = 18
+PCLELGA3 = 391
+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 = 0
+CORDBOS1 = 0
+CORDBOS2 = 0
+CORDBOS3 = 19.2
+CORDBOS4 = 0
+CORDLGA0 = 0
+CORDLGA1 = 0
+CORDLGA2 = 10.4
+CORDLGA3 = 0
+CLGAORD0 = 0
+CLGAORD1 = 0
+CLGAORD2 = 20.1
+CLGAORD3 = 15.9
+CLGACLE0 = 10.4
+CLGACLE1 = 2.4
+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.635223456
+N1013AC4 = 0
+N1015AC2 = 5.275510204
+N1015AC4 = 0.9244444444
+N1017AC2 = 0
+N1017AC4 = 0
+N1019AC2 = 4.630082667
+N1019AC4 = 2
+N1021AC1 = 7
+N1021AC2 = 0
+N1021AC3 = 2
+N1021AC4 = 0.9244444444
+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 = 0
+N1012AC4 = 2
+N1014AC2 = 5.275510204
+N1014AC4 = 0
+N1100AC2 = 7
+N1100AC4 = 5.274621909
+N1102AC2 = 4.354572463
+N1102AC4 = 0
+N1200AC2 = 14
+N1200AC4 = 0.9244444444
+N1201AC2 = 4.094407129
+N1201AC4 = 0
+*** ppl_lpsol -s -m -oobtained ex1.mps
+Optimum value: -3.75
+Optimum location:
+x1 = 1.25
+x2 = 2.5
+*** ppl_lpsol -s -M -oobtained ex1.mps
+Optimum value: 2.5
+Optimum location:
+x1 = 2.5
+x2 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained 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 -m -oobtained mip.mps
+Optimum value: 24.07692308
+Optimum location:
+X1 = 2.615384615
+X2 = 2
+X3 = 0.7692307692
+X4 = 3
+*** ppl_lpsol -s -M -oobtained mip.mps
+Optimum value: 46.42857143
+Optimum location:
+X1 = 4
+X2 = 4.571428571
+X3 = 0.5714285714
+X4 = 3
+*** ppl_lpsol -s -m -oobtained sample.mps
+Optimum value: -733.3333333
+Optimum location:
+x1 = 33.33333333
+x2 = 66.66666667
+x3 = 0
+*** ppl_lpsol -s -M -oobtained sample.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
+x3 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained sc105.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 0
+COL00002 = 50
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 0
+COL00007 = 50
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 0
+COL00013 = 50
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 27.27272727
+COL00022 = 0
+COL00023 = 0
+COL00024 = 63.63636364
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 163.6363636
+COL00030 = 0
+COL00031 = 0
+COL00032 = 163.6363636
+COL00033 = 0
+COL00034 = 45.45454545
+COL00035 = 109.0909091
+COL00036 = 0
+COL00037 = 0
+COL00038 = 0
+COL00039 = 45.45454545
+COL00040 = 272.7272727
+COL00041 = 0
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 100
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+COL00049 = 0
+COL00050 = 145.4545455
+COL00051 = 272.7272727
+COL00052 = 0
+COL00053 = 0
+COL00054 = 0
+COL00055 = 0
+COL00056 = 100
+COL00057 = 0
+COL00058 = 0
+COL00059 = 0
+COL00060 = 0
+COL00061 = 245.4545455
+COL00062 = 272.7272727
+COL00063 = 0
+COL00064 = 0
+COL00065 = 0
+COL00066 = 0
+COL00067 = 100
+COL00068 = 0
+COL00069 = 0
+COL00070 = 0
+COL00071 = 0
+COL00072 = 345.4545455
+COL00073 = 272.7272727
+COL00074 = 0
+COL00075 = 0
+COL00076 = 272.7272727
+COL00077 = 0
+COL00078 = 9.090909091
+COL00079 = 181.8181818
+COL00080 = 0
+COL00081 = 0
+COL00082 = 0
+COL00083 = 354.5454545
+COL00084 = 454.5454545
+COL00085 = 0
+COL00086 = 354.5454545
+COL00087 = 454.5454545
+COL00088 = 0
+COL00089 = 0
+COL00090 = 0
+COL00091 = 369.6969697
+COL00092 = 0
+COL00093 = 0
+COL00094 = 354.5454545
+COL00095 = 454.5454545
+COL00096 = 369.6969697
+COL00097 = 0
+COL00098 = 100
+COL00099 = 0
+COL00100 = 20
+COL00101 = 20
+COL00102 = 93.33333333
+COL00103 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained sc50a.mps
+Optimum value: 0
+Optimum location:
+COL00001 = 20
+COL00002 = 55
+COL00003 = 0
+COL00004 = 0
+COL00005 = 0
+COL00006 = 20
+COL00007 = 55
+COL00008 = 0
+COL00009 = 0
+COL00010 = 0
+COL00011 = 0
+COL00012 = 70
+COL00013 = 30
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 90
+COL00018 = 85
+COL00019 = 0
+COL00020 = 0
+COL00021 = 85
+COL00022 = 0
+COL00023 = 41.66666667
+COL00024 = 86.66666667
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 131.6666667
+COL00029 = 171.6666667
+COL00030 = 0
+COL00031 = 131.6666667
+COL00032 = 171.6666667
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 201.1111111
+COL00037 = 0
+COL00038 = 0
+COL00039 = 131.6666667
+COL00040 = 171.6666667
+COL00041 = 201.1111111
+COL00042 = 0
+COL00043 = 40
+COL00044 = 0
+COL00045 = 17
+COL00046 = 17
+COL00047 = 79.33333333
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained 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 -M -oobtained 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 = 100
+COL00014 = 0
+COL00015 = 0
+COL00016 = 0
+COL00017 = 0
+COL00018 = 100
+COL00019 = 0
+COL00020 = 0
+COL00021 = 0
+COL00022 = 0
+COL00023 = 0
+COL00024 = 100
+COL00025 = 0
+COL00026 = 0
+COL00027 = 0
+COL00028 = 0
+COL00029 = 200
+COL00030 = 0
+COL00031 = 0
+COL00032 = 0
+COL00033 = 0
+COL00034 = 0
+COL00035 = 0
+COL00036 = 100
+COL00037 = 0
+COL00038 = 0
+COL00039 = 0
+COL00040 = 200
+COL00041 = 100
+COL00042 = 0
+COL00043 = 0
+COL00044 = 0
+COL00045 = 0
+COL00046 = 0
+COL00047 = 0
+COL00048 = 0
+*** ppl_lpsol -s -m -oobtained unboundedmin.mps
+Unbounded problem.
+*** ppl_lpsol -s -M -oobtained unboundedmin.mps
+Optimum value: 0
+Optimum location:
+x1 = 0
+x2 = 0
diff --git a/demos/ppl_lpsol/ppl_lpsol.c b/demos/ppl_lpsol/ppl_lpsol.c
new file mode 100644
index 0000000..cc55b39
--- /dev/null
+++ b/demos/ppl_lpsol/ppl_lpsol.c
@@ -0,0 +1,895 @@
+/* Solve linear programming problems by either vertex/point enumeration
+ or the primal simplex algorithm. Just a toy to test the C interface
+ of the library.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "config.h"
+#include "ppl_c.h"
+#include <gmp.h>
+#include <glpk.h>
+#include <stdio.h>
+#include <assert.h>
+#include <time.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+
+#ifdef HAVE_GETOPT_H
+# include <getopt.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
+/* Include this for `getopt()': especially important if we do not have
+ <getopt.h>. */
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_SIGNAL_H
+# include <signal.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
+
+#if PPL_VERSION_MAJOR == 0 && PPL_VERSION_MINOR < 8
+# error "PPL version 0.8 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
+
+#ifdef HAVE_GETOPT_H
+static struct option long_options[] = {
+ {"check", no_argument, 0, 'c'},
+ {"help", no_argument, 0, 'h'},
+ {"version", no_argument, 0, 'V'},
+ {"min", no_argument, 0, 'm'},
+ {"max", no_argument, 0, 'M'},
+ {"max-cpu", required_argument, 0, 'C'},
+ {"max-memory", required_argument, 0, 'R'},
+ {"output", required_argument, 0, 'o'},
+ {"enumerate", no_argument, 0, 'e'},
+ {"simplex", no_argument, 0, 's'},
+ {"timings", no_argument, 0, 't'},
+ {"verbose", no_argument, 0, 'v'},
+ {0, 0, 0, 0}
+};
+#endif
+
+static const char* usage_string
+= "Usage: %s [OPTION]... [FILE]...\n\n"
+" -c, --check checks plausibility of the optimum value found\n"
+" -m, --min minimizes the objective function\n"
+" -M, --max maximizes the objective function (default)\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"
+" -V, --version prints version information to stdout\n"
+" -oPATH, --output=PATH appends output to PATH\n"
+" -e, --enumerate use the (expensive!) enumeration method\n"
+" -s, --simplex use the simplex method\n"
+" -t, --timings prints timings to stderr\n"
+" -v, --verbose outputs also the constraints "
+"and objective function\n"
+#ifndef HAVE_GETOPT_H
+"\n"
+"NOTE: this version does not support long options.\n"
+#endif
+;
+
+#define OPTION_LETTERS "bcemMC:R:hVo:stv"
+
+static const char* program_name = 0;
+
+static unsigned long max_seconds_of_cpu_time = 0;
+static unsigned long max_bytes_of_virtual_memory = 0;
+static const char* output_argument = 0;
+FILE* output_file = NULL;
+static int check_optimum = 0;
+static int use_simplex = 0;
+static int print_timings = 0;
+static int verbose = 0;
+static int maximize = 1;
+
+static void
+my_exit(int status) {
+ (void) ppl_finalize();
+ exit(status);
+}
+
+static 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);
+ my_exit(1);
+}
+
+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 HAVE_GETOPT_H
+ int option_index;
+#endif
+ int enumerate_required = 0;
+ int simplex_required = 0;
+ int c;
+ char* endptr;
+ long l;
+
+ while (1) {
+#ifdef 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_optimum = 1;
+ break;
+
+ case 'm':
+ maximize = 0;
+ break;
+
+ case 'M':
+ maximize = 1;
+ break;
+
+ case '?':
+ case 'h':
+ fprintf(stdout, usage_string, argv[0]);
+ my_exit(0);
+ break;
+
+ case 'V':
+ fprintf(stdout, "%s\n", PPL_VERSION);
+ exit(0);
+ break;
+
+ 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;
+
+ case 'R':
+ l = strtol(optarg, &endptr, 10);
+ if (*endptr || l < 0)
+ fatal("a non-negative integer must follow `-R'");
+ else
+ max_bytes_of_virtual_memory = l*1024*1024;
+ break;
+
+ case 'o':
+ output_argument = optarg;
+ break;
+
+ case 'e':
+ enumerate_required = 1;
+ break;
+
+ case 's':
+ simplex_required = 1;
+ break;
+
+ case 't':
+ print_timings = 1;
+ break;
+
+ case 'v':
+ verbose = 1;
+ break;
+
+ default:
+ abort();
+ }
+ }
+
+ if (enumerate_required && simplex_required)
+ fatal("--enumerate and --simplex are incompatible options");
+
+ if (enumerate_required)
+ use_simplex = 0;
+ else if (simplex_required)
+ use_simplex = 1;
+
+ if (optind >= argc) {
+ if (verbose)
+ fprintf(stderr,
+ "Parma Polyhedra Library version:\n%s\n\n"
+ "Parma Polyhedra Library banner:\n%s",
+ 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;
+}
+
+/* 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 hsecs;
+ if (current_usecs < saved_usecs) {
+ hsecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+ secs = (current_secs - saved_secs) -1;
+ }
+ else {
+ hsecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+ secs = current_secs - saved_secs;
+ }
+ assert(hsecs >= 0 && hsecs < 100 && secs >= 0);
+ fprintf(f, "%d.%.2d", secs, hsecs);
+ }
+}
+
+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));
+ }
+}
+
+#if HAVE_DECL_RLIMIT_AS
+void
+limit_virtual_memory(unsigned 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 bytes ATTRIBUTE_UNUSED) {
+}
+#endif /* !HAVE_DECL_RLIMIT_AS */
+
+static void
+my_timeout(int dummy ATTRIBUTE_UNUSED) {
+ fprintf(stderr, "TIMEOUT\n");
+ if (output_argument)
+ fprintf(output_file, "TIMEOUT\n");
+ my_exit(0);
+}
+
+static mpz_t tmp_z;
+static mpq_t tmp1_q;
+static mpq_t tmp2_q;
+static ppl_Coefficient_t ppl_coeff;
+static LPX* lp;
+
+static const char*
+variable_output_function(ppl_dimension_type var) {
+ const char* name = lpx_get_col_name(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 LPX_FR:
+ break;
+
+ case LPX_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_THAN_OR_EQUAL);
+ if (verbose) {
+ 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 LPX_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_THAN_OR_EQUAL);
+ if (verbose) {
+ 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 LPX_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_THAN_OR_EQUAL);
+ if (verbose) {
+ 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_THAN_OR_EQUAL);
+ ppl_delete_Linear_Expression(ppl_le2);
+ if (verbose) {
+ 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 LPX_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 (verbose) {
+ 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_const_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 empty;
+ int unbounded;
+ int included;
+ int ok;
+
+ /* Create the polyhedron. */
+ ppl_new_C_Polyhedron_from_Constraint_System(&ppl_ph, ppl_cs);
+
+ if (print_timings) {
+ fprintf(stderr, "Time to create a PPL polyhedron: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+ empty = ppl_Polyhedron_is_empty(ppl_ph);
+
+ if (print_timings) {
+ fprintf(stderr, "Time to check for emptiness: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+ if (empty) {
+ fprintf(output_file, "Unfeasible problem.\n");
+ /* FIXME: check!!! */
+ return 0;
+ }
+
+ /* 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);
+
+ if (print_timings) {
+ fprintf(stderr, "Time to check for unboundedness: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+ if (unbounded) {
+ fprintf(output_file, "Unbounded problem.\n");
+ /* FIXME: check!!! */
+ return 0;
+ }
+
+ ok = maximize
+ ? ppl_Polyhedron_maximize(ppl_ph, ppl_objective_le,
+ optimum_n, optimum_d, &included,
+ point)
+ : ppl_Polyhedron_minimize(ppl_ph, ppl_objective_le,
+ optimum_n, optimum_d, &included,
+ point);
+
+ if (!ok)
+ fatal("internal error");
+
+ ppl_delete_Polyhedron(ppl_ph);
+
+ if (print_timings) {
+ fprintf(stderr, "Time to find the optimum: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+ if (!included)
+ fatal("internal error");
+
+ return 1;
+}
+
+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) {
+ int status;
+
+ ppl_LP_Problem_t lp;
+ int mode = maximize
+ ? PPL_LP_PROBLEM_MAXIMIZATION : PPL_LP_PROBLEM_MINIMIZATION;
+ ppl_new_LP_Problem(&lp, cs, objective, mode);
+ status = ppl_LP_Problem_solve(lp);
+
+ if (print_timings) {
+ fprintf(stderr, "Time to solve the LP problem: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+ if (status == PPL_LP_PROBLEM_STATUS_UNFEASIBLE) {
+ fprintf(output_file, "Unfeasible problem.\n");
+ /* FIXME: check!!! */
+ return 0;
+ }
+ else if (status == PPL_LP_PROBLEM_STATUS_UNBOUNDED) {
+ fprintf(output_file, "Unbounded problem.\n");
+ /* FIXME: check!!! */
+ return 0;
+ }
+ else if (status == PPL_LP_PROBLEM_STATUS_OPTIMIZED) {
+ ppl_LP_Problem_optimal_value(lp, optimum_n, optimum_d);
+ ppl_const_Generator_t g;
+ ppl_LP_Problem_optimizing_point(lp, &g);
+ ppl_assign_Generator_from_Generator(point, g);
+ return 1;
+ }
+ else
+ fatal("internal error");
+}
+
+static void
+check_feasibility(ppl_const_Constraint_System_t cs,
+ ppl_const_Generator_t g) {
+ ppl_Polyhedron_t ph;
+ unsigned int relation;
+ ppl_new_C_Polyhedron_from_Constraint_System(&ph, cs);
+ relation = ppl_Polyhedron_relation_with_Generator(ph, g);
+ ppl_delete_Polyhedron(ph);
+ if (relation != PPL_POLY_GEN_RELATION_SUBSUMES)
+ fprintf(stderr, "The computed optimum is NOT a feasible point!\n");
+}
+
+static void
+solve(char* file_name) {
+ ppl_Constraint_System_t ppl_cs;
+ ppl_Generator_t optimum_value;
+ ppl_Linear_Expression_t ppl_le;
+ int dimension, row, num_rows, column, nz, i, 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;
+
+ if (print_timings)
+ start_clock();
+
+ lp = lpx_read_mps(file_name);
+ if (lp == NULL)
+ fatal("cannot read MPS file `%s'", file_name);
+
+ if (print_timings) {
+ fprintf(stderr, "Time to read the input file: ");
+ print_clock(stderr);
+ fprintf(stderr, " s\n");
+ start_clock();
+ }
+
+ dimension = lpx_get_num_cols(lp);
+
+ 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 (verbose)
+ fprintf(output_file, "Constraints:\n");
+
+ /* Set up the row (ordinary) constraints. */
+ num_rows = lpx_get_num_rows(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 = lpx_get_mat_row(lp, row, coefficient_index, coefficient_value);
+ for (i = 1; i <= nz; ++i) {
+ mpq_set_d(rational_coefficient[i], coefficient_value[i]);
+ /* Update den_lcm. */
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_coefficient[i]));
+ }
+ lpx_get_row_bnds(lp, row, &type, &lb, &ub);
+ mpq_set_d(rational_lb, lb);
+ mpz_lcm(den_lcm, den_lcm, mpq_denref(rational_lb));
+ mpq_set_d(rational_ub, ub);
+ 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);
+ }
+
+ 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);
+
+ /*
+ 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) {
+
+ lpx_get_col_bnds(lp, column, &type, &lb, &ub);
+
+ mpq_set_d(rational_lb, lb);
+ mpq_set_d(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);
+
+ 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]);
+ mpq_set_d(objective[0], lpx_get_obj_coef(lp, 0));
+ for (i = 1; i <= dimension; ++i) {
+ mpq_init(objective[i]);
+ mpq_set_d(objective[i], lpx_get_obj_coef(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);
+ /* The inhomogeneous term is completely useless for our purpose. */
+ 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 (verbose) {
+ fprintf(output_file, "Objective function:\n");
+ ppl_io_fprint_Linear_Expression(output_file, ppl_objective_le);
+ }
+
+ for (i = 0; i <= dimension; ++i)
+ mpq_clear(objective[i]);
+ free(objective);
+
+ if (verbose) {
+ 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_value);
+
+ optimum_found = use_simplex
+ ? solve_with_simplex(ppl_cs,
+ ppl_objective_le,
+ optimum_n,
+ optimum_d,
+ optimum_value)
+ : solve_with_generators(ppl_cs,
+ ppl_objective_le,
+ optimum_n,
+ optimum_d,
+ optimum_value);
+
+ 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);
+ fprintf(output_file, "Optimum value: %.10g\n", mpq_get_d(optimum));
+ mpq_clear(optimum);
+ fprintf(output_file, "Optimum location:\n");
+ ppl_Generator_divisor(optimum_value, 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_value, 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));
+ }
+ if (check_optimum) {
+ // TODO: currently checking only feasibility.
+ // Find a way to also check for optimality.
+ check_feasibility(ppl_cs, optimum_value);
+ }
+ }
+
+ ppl_delete_Constraint_System(ppl_cs);
+ ppl_delete_Linear_Expression(ppl_objective_le);
+ ppl_delete_Coefficient(optimum_d);
+ ppl_delete_Coefficient(optimum_n);
+ ppl_delete_Generator(optimum_value);
+
+ lpx_delete_prob(lp);
+}
+
+static void
+error_handler(enum ppl_enum_error_code code,
+ const char* description) {
+ fatal("PPL error code %d\n%s", code, description);
+}
+
+#if !CXX_SUPPORTS_ATTRIBUTE_WEAK
+void
+set_GMP_memory_allocation_functions(void) {
+}
+#endif
+
+int
+main(int argc, char* argv[]) {
+ program_name = argv[0];
+ 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");
+
+ 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");
+
+ /* 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);
+
+ if (max_seconds_of_cpu_time > 0)
+ set_alarm_on_cpu_time(max_seconds_of_cpu_time, my_timeout);
+
+ if (max_bytes_of_virtual_memory > 0)
+ limit_virtual_memory(max_bytes_of_virtual_memory);
+
+ while (optind < argc)
+ solve(argv[optind++]);
+
+ /* 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(0);
+
+ return 0;
+}
diff --git a/depcomp b/depcomp
new file mode 100755
index 0000000..011ebd9
--- /dev/null
+++ b/depcomp
@@ -0,0 +1,530 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2005-07-09.11
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005 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, write to the Free Software Foundation,
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# 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 outputing 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
+
+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"
+
+# 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
+
+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.
+ "$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ mv "$tmpdepfile" "$depfile"
+ ;;
+
+gcc)
+## 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).
+## - 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 -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
+## 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.
+ tr ' ' '
+' < "$tmpdepfile" |
+## 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.
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ sed -e 's/^\\$//' -e '/^$/d' -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 -eq 0; then :
+ else
+ 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 ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
+ tr '
+' ' ' >> $depfile
+ echo >> $depfile
+
+ # The second pass generates a dummy entry for each header file.
+ tr ' ' '
+' < "$tmpdepfile" \
+ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
+ >> $depfile
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+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.
+ stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
+ tmpdepfile="$stripped.u"
+ if test "$libtool" = yes; then
+ "$@" -Wc,-M
+ else
+ "$@" -M
+ fi
+ stat=$?
+
+ if test -f "$tmpdepfile"; then :
+ else
+ stripped=`echo "$stripped" | sed 's,^.*/,,'`
+ tmpdepfile="$stripped.u"
+ fi
+
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile"
+ exit $stat
+ fi
+
+ if test -f "$tmpdepfile"; then
+ outname="$stripped.o"
+ # Each line is of the form `foo.o: dependent.h'.
+ # Do two passes, one to just change these to
+ # `$object: dependent.h' and one to simply `dependent.h:'.
+ sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
+ sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
+ else
+ # The sourcefile does not contain any dependencies, so just
+ # store a dummy comment line, to avoid errors with the Makefile
+ # "include basename.Plo" scheme.
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+icc)
+ # Intel's C compiler understands `-MD -MF file'. However on
+ # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+ # ICC 7.0 will fill foo.d with something like
+ # foo.o: sub/foo.c
+ # foo.o: sub/foo.h
+ # which is wrong. We want:
+ # sub/foo.o: sub/foo.c
+ # sub/foo.o: sub/foo.h
+ # sub/foo.c:
+ # sub/foo.h:
+ # ICC 7.1 will output
+ # foo.o: sub/foo.c sub/foo.h
+ # and will wrap long lines using \ :
+ # foo.o: sub/foo.c ... \
+ # sub/foo.h ... \
+ # ...
+
+ "$@" -MD -MF "$tmpdepfile"
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ 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"
+ ;;
+
+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.
+ dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+ test "x$dir" = "x$object" && dir=
+ base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+ if test "$libtool" = yes; then
+ # With Tru64 cc, shared objects can also be used to make a
+ # static library. This mecanism is used in libtool 1.4 series to
+ # handle both shared and static libraries in a single compilation.
+ # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+ #
+ # With libtool 1.5 this exception was removed, and libtool now
+ # generates 2 separate objects for the 2 libraries. These two
+ # compilations output dependencies in 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.libs/$base.lo.d # libtool 1.4
+ tmpdepfile2=$dir$base.o.d # libtool 1.5
+ tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
+ tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
+ "$@" -Wc,-MD
+ else
+ tmpdepfile1=$dir$base.o.d
+ tmpdepfile2=$dir$base.d
+ tmpdepfile3=$dir$base.d
+ tmpdepfile4=$dir$base.d
+ "$@" -MD
+ fi
+
+ stat=$?
+ if test $stat -eq 0; then :
+ else
+ rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ exit $stat
+ fi
+
+ for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+ do
+ test -f "$tmpdepfile" && break
+ done
+ if test -f "$tmpdepfile"; then
+ sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+ # That's a tab and a space in the [].
+ sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+ else
+ echo "#dummy" > "$depfile"
+ fi
+ rm -f "$tmpdepfile"
+ ;;
+
+#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 $1 != '--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:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
+ rm -f "$depfile"
+ cat < "$tmpdepfile" > "$depfile"
+ tr ' ' '
+' < "$tmpdepfile" | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--mode=compile'; do
+ shift
+ done
+ shift
+ fi
+ # X makedepend
+ shift
+ cleared=no
+ for arg in "$@"; do
+ case $cleared in
+ no)
+ set ""; shift
+ cleared=yes ;;
+ esac
+ 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.
+ -*|$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"
+ cat < "$tmpdepfile" > "$depfile"
+ sed '1,2d' "$tmpdepfile" | tr ' ' '
+' | \
+## Some versions of the HPUX 10.20 sed can't process this invocation
+## correctly. Breaking it into two sed invocations is a workaround.
+ 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 $1 != '--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, regardless of -o,
+ # because we must use -o when running libtool.
+ "$@" || exit $?
+ IFS=" "
+ for arg
+ do
+ case "$arg" in
+ "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+ set fnord "$@"
+ shift
+ shift
+ ;;
+ *)
+ set fnord "$@" "$arg"
+ shift
+ shift
+ ;;
+ esac
+ done
+ "$@" -E |
+ sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
+ rm -f "$depfile"
+ echo "$object : \\" > "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
+ echo " " >> "$depfile"
+ . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+ rm -f "$tmpdepfile"
+ ;;
+
+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-end: "$"
+# End:
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..bae44e2
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,284 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+abs_srcdir = @abs_srcdir@
+
+# 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)
+
+HTML_MANUALS = \
+ppl-user- at VERSION@-html.tar.gz \
+ppl-devref- at VERSION@-html.tar.gz
+
+PDF_MANUALS = \
+ppl-user- at VERSION@.pdf \
+ppl-devref- at VERSION@.pdf
+
+PS_MANUALS = \
+ppl-user- at VERSION@.ps.gz \
+ppl-devref- at VERSION@.ps.gz
+
+MANUALS = \
+$(HTML_MANUALS) \
+$(PDF_MANUALS) \
+$(PS_MANUALS)
+
+HTML_DIRS = \
+ppl-user- at VERSION@-html \
+ppl-devref- at VERSION@-html
+
+TEMP_HTML_DIRS = \
+user.html-dir \
+devref.html-dir
+
+DIST_HTML_DOCS = \
+ppl-user- at VERSION@-html.tar.gz
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+ppl-user- at VERSION@.pdf
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+ppl-user- at VERSION@.ps.gz
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+# We distribute some preprocessed user's documentation.
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+ALL_TARGETS = \
+$(HTML_DIRS) \
+$(PDF_LICENSES) \
+$(PS_LICENSES) \
+$(MANUALS)
+
+dist_man_MANS = \
+ppl-config.1 \
+ppl_lcdd.1 \
+ppl_lpsol.1
+
+# Do nothing by default.
+all:
+
+user: ppl-user- at VERSION@.pdf
+
+world: $(ALL_TARGETS)
+
+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 $(DIST_HTML_DOCS); do \
+ test -f $$ball || test -f $(srcdir)/$$ball || $(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 - ; \
+ for file in $$dir/*; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+ done; \
+ done
+
+installdirs-html:
+ for ball in $(DIST_HTML_DOCS); do \
+ dir=`basename $$ball .tar.gz`; \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+ done
+
+uninstall-html:
+ for ball in $(DIST_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 $(DIST_PDF_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file || $(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:
+ rm -f $(DESTDIR)$(pdfdir)/*.pdf
+
+# Installation and uninstallation of PostScript documentation.
+install-ps:
+ $(mkinstalldirs) $(DESTDIR)$(psdir)
+ for file in $(DIST_PS_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file || $(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:
+ rm -f $(DESTDIR)$(psdir)/*.ps.gz
+
+# 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 ; 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 ; do \
+ rm -f $(DESTDIR)$(txtdir)/$$file; \
+ done
+
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+
+DOX_FILES = \
+definitions.dox \
+../interfaces/Prolog/Prolog_interface.dox \
+gpl.dox \
+fdl.dox
+
+USER_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+$(top_builddir)/src/ppl.hh \
+../interfaces/C/ppl_c.h
+
+DEVREF_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) $<
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) $<
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+ $(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+ $(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user- at VERSION@-html: user.doxyconf-html $(DEVREF_STUFF)
+ rm -rf user.html-dir
+ $(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f user.html-dir $@
+
+ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
+ rm -rf devref.html-dir
+ $(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f devref.html-dir $@
+
+%.tar: %
+ tar cf $@ $<
+
+%.gz: %
+ gzip --best --force $<
+
+%.pdf: %.tex
+ $(TEX_ENV) pdflatex $<
+
+%.ps: %.pdf
+ pdftops $< $@
+
+EXTRA_DIST= \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+user.doxyconf-latex \
+devref.doxyconf-latex \
+user.doxyconf-html \
+devref.doxyconf-html \
+user.tex \
+devref.tex \
+gpl.tex \
+fdl.tex \
+ppl.sty \
+README.doc
+
+mostlyclean-local:
+ rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(TEMP_HTML_DIRS) *.aux *.log
+
+CLEANFILES = $(DIST_HTML_DOCS) $(DIST_PDF_DOCS) $(DIST_PS_DOCS)
diff --git a/doc/Makefile.in b/doc/Makefile.in
new file mode 100644
index 0000000..6eb3fae
--- /dev/null
+++ b/doc/Makefile.in
@@ -0,0 +1,766 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(dist_man_MANS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/devref.doxyconf-html.in \
+ $(srcdir)/devref.doxyconf-latex.in \
+ $(srcdir)/user.doxyconf-html.in \
+ $(srcdir)/user.doxyconf-latex.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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
+SOURCES =
+DIST_SOURCES =
+man1dir = $(mandir)/man1
+am__installdirs = "$(DESTDIR)$(man1dir)"
+NROFF = nroff
+MANS = $(dist_man_MANS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+
+# All the documentation in docdir.
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+abs_srcdir = @abs_srcdir@
+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)
+
+HTML_MANUALS = \
+ppl-user- at VERSION@-html.tar.gz \
+ppl-devref- at VERSION@-html.tar.gz
+
+PDF_MANUALS = \
+ppl-user- at VERSION@.pdf \
+ppl-devref- at VERSION@.pdf
+
+PS_MANUALS = \
+ppl-user- at VERSION@.ps.gz \
+ppl-devref- at VERSION@.ps.gz
+
+MANUALS = \
+$(HTML_MANUALS) \
+$(PDF_MANUALS) \
+$(PS_MANUALS)
+
+HTML_DIRS = \
+ppl-user- at VERSION@-html \
+ppl-devref- at VERSION@-html
+
+TEMP_HTML_DIRS = \
+user.html-dir \
+devref.html-dir
+
+DIST_HTML_DOCS = \
+ppl-user- at VERSION@-html.tar.gz
+
+DIST_PDF_DOCS = \
+$(PDF_LICENSES) \
+ppl-user- at VERSION@.pdf
+
+DIST_PS_DOCS = \
+$(PS_LICENSES) \
+ppl-user- at VERSION@.ps.gz
+
+DIST_TXT_DOCS = \
+$(TXT_LICENSES)
+
+
+# We distribute some preprocessed user's documentation.
+DIST_DOCS = \
+$(DIST_HTML_DOCS) \
+$(DIST_PDF_DOCS) \
+$(DIST_PS_DOCS) \
+$(DIST_TXT_DOCS)
+
+ALL_TARGETS = \
+$(HTML_DIRS) \
+$(PDF_LICENSES) \
+$(PS_LICENSES) \
+$(MANUALS)
+
+dist_man_MANS = \
+ppl-config.1 \
+ppl_lcdd.1 \
+ppl_lpsol.1
+
+PPL_SOURCE_FILES = $(wildcard $(srcdir)/../src/*.hh $(srcdir)/../src/*.cc)
+DOX_FILES = \
+definitions.dox \
+../interfaces/Prolog/Prolog_interface.dox \
+gpl.dox \
+fdl.dox
+
+USER_STUFF = \
+$(DOX_FILES) \
+user.tex \
+ppl.sty \
+$(top_builddir)/src/ppl.hh \
+../interfaces/C/ppl_c.h
+
+DEVREF_STUFF = \
+$(DOX_FILES) \
+devref.tex \
+ppl.sty \
+$(PPL_SOURCE_FILES)
+
+LATEX_DIRS = \
+user.latex-dir \
+devref.latex-dir
+
+TEX_ENV = TEXINPUTS=$(abs_srcdir):$(TEXINPUTS)
+EXTRA_DIST = \
+$(DIST_DOCS) \
+$(DOX_FILES) \
+user.doxyconf-latex \
+devref.doxyconf-latex \
+user.doxyconf-html \
+devref.doxyconf-html \
+user.tex \
+devref.tex \
+gpl.tex \
+fdl.tex \
+ppl.sty \
+README.doc
+
+CLEANFILES = $(DIST_HTML_DOCS) $(DIST_PDF_DOCS) $(DIST_PS_DOCS)
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \
+ 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
+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)/$@
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-man1: $(man1_MANS) $(man_MANS)
+ @$(NORMAL_INSTALL)
+ test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)"
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
+ else file=$$i; fi; \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \
+ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+uninstall-man1:
+ @$(NORMAL_UNINSTALL)
+ @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \
+ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \
+ for i in $$l2; do \
+ case "$$i" in \
+ *.1*) list="$$list $$i" ;; \
+ esac; \
+ done; \
+ for i in $$list; do \
+ ext=`echo $$i | sed -e 's/^.*\\.//'`; \
+ case "$$ext" in \
+ 1*) ;; \
+ *) ext='1' ;; \
+ esac; \
+ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \
+ inst=`echo $$inst | sed -e 's/^.*\///'`; \
+ inst=`echo $$inst | sed '$(transform)'`.$$ext; \
+ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \
+ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ $(mkdir_p) $(distdir)/../interfaces/Prolog
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-man
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man: install-man1
+
+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-info-am uninstall-local uninstall-man
+
+uninstall-man: uninstall-man1
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ 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-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-man1 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 \
+ uninstall uninstall-am uninstall-info-am uninstall-local \
+ uninstall-man uninstall-man1
+
+
+# Do nothing by default.
+all:
+
+user: ppl-user- at VERSION@.pdf
+
+world: $(ALL_TARGETS)
+
+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 $(DIST_HTML_DOCS); do \
+ test -f $$ball || test -f $(srcdir)/$$ball || $(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 - ; \
+ for file in $$dir/*; do \
+ $(INSTALL_DATA) $$file $(DESTDIR)$(htmldir)/$$dir/`basename $$file`; \
+ done; \
+ done
+
+installdirs-html:
+ for ball in $(DIST_HTML_DOCS); do \
+ dir=`basename $$ball .tar.gz`; \
+ $(mkinstalldirs) $(DESTDIR)$(htmldir)/$$dir; \
+ done
+
+uninstall-html:
+ for ball in $(DIST_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 $(DIST_PDF_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file || $(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:
+ rm -f $(DESTDIR)$(pdfdir)/*.pdf
+
+# Installation and uninstallation of PostScript documentation.
+install-ps:
+ $(mkinstalldirs) $(DESTDIR)$(psdir)
+ for file in $(DIST_PS_DOCS); do \
+ test -f $$file || test -f $(srcdir)/$$file || $(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:
+ rm -f $(DESTDIR)$(psdir)/*.ps.gz
+
+# 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 ; 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 ; do \
+ rm -f $(DESTDIR)$(txtdir)/$$file; \
+ done
+
+.SECONDARY: $(LATEX_DIRS)
+
+user.latex-dir: user.doxyconf-latex $(USER_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) $<
+
+devref.latex-dir: devref.doxyconf-latex $(DEVREF_STUFF)
+ rm -rf $@
+ $(TEX_ENV) $(DOXYGEN) $<
+
+ppl-user- at VERSION@.pdf: user.latex-dir
+ $(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-devref- at VERSION@.pdf: devref.latex-dir
+ $(TEX_ENV) make -C $< refman.pdf && mv -f $</refman.pdf $@
+
+ppl-user- at VERSION@-html: user.doxyconf-html $(DEVREF_STUFF)
+ rm -rf user.html-dir
+ $(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f user.html-dir $@
+
+ppl-devref- at VERSION@-html: devref.doxyconf-html $(DEVREF_STUFF)
+ rm -rf devref.html-dir
+ $(TEX_ENV) $(DOXYGEN) $< && rm -rf $@ && mv -f devref.html-dir $@
+
+%.tar: %
+ tar cf $@ $<
+
+%.gz: %
+ gzip --best --force $<
+
+%.pdf: %.tex
+ $(TEX_ENV) pdflatex $<
+
+%.ps: %.pdf
+ pdftops $< $@
+
+mostlyclean-local:
+ rm -rf $(ALL_TARGETS) $(LATEX_DIRS) $(TEMP_HTML_DIRS) *.aux *.log
+# 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..7dcd420
--- /dev/null
+++ b/doc/README.doc
@@ -0,0 +1,139 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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://www.cs.unipr.it/ppl/Documentation/ .
+
+
+The Documentation You May Build Yourself
+========================================
+
+When all else fails (which is the case, for example, when you are
+using a CVS 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.
+
+--------
+
+[1] http://www.cs.unipr.it/ppl/Download/cvs
+[2] http://www.doxygen.org/
+[3] http://www.research.att.com/sw/tools/graphviz/
+
+
+--------
+
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 called `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 2 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 are called `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://www.cs.unipr.it/ppl/ .
diff --git a/doc/definitions.dox b/doc/definitions.dox
new file mode 100644
index 0000000..00dd01e
--- /dev/null
+++ b/doc/definitions.dox
@@ -0,0 +1,3502 @@
+// Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+//
+// 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.1 or
+// any later version published by the Free Software Foundation; with no
+// Invariant Sections, with no Front-Cover Texts, and with no Back-Cover
+// Texts.
+//
+// The PPL is free software; you can 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.
+//
+// The PPL is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+// for more details.
+//
+// For the most up-to-date information see the Parma Polyhedra Library
+// site: http://www.cs.unipr.it/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 and a number of
+ Prolog systems;
+- it is free software: distributed under the terms of the
+ GNU General Public License.
+
+In addition to the basic domains, we also provide generic support for
+constructing new domains from pre-existing domains.
+The following domains and domain constructors are provided by the PPL:
+- the domain of topologically closed, rational convex polyhedra;
+- the domain of rational convex polyhedra that are not necessarily closed;
+- the domain of topologically closed, rational bounded difference shapes;
+- the powerset construction;
+- the powerset construction, instantiated for convex polyhedra.
+
+In the following sections we describe these domains and domain
+constructors together with their representations and operations
+that are available to the PPL user.
+
+In the final section of this chapter (Section \ref use_of_library),
+we provide some additional advice on the use of the library.
+
+\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\f$-dimensional 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\f$-th 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 and (rational) bounding boxes.
+
+
+\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 GDMDRS04 "[GDMDRS04]".
+
+
+\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 GDMDRS04 "[GDMDRS04]".
+
+
+\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 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 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, if \f$\cP,\cQ \in \CPset_n\f$ are closed polyhedra,
+the above set is also a closed polyhedron.
+In contrast, when \f$\cQ\f$ is not topologically closed,
+the above set might not be an NNC polyhedron.
+
+\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$.
+
+\anchor bounding_boxes
+\subsection Intervals_Boxes_and_Bounding_Boxes Intervals, Boxes and Bounding Boxes
+
+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$.
+An \f$n\f$-dimensional <EM>box</EM> \f$\cB\f$ in \f$\Rset^n\f$
+is a sequence of \f$n\f$ intervals in \f$\Rset\f$.
+
+The polyhedron \f$\cP\f$ <EM>represents a box \f$\cB\f$</EM> in \f$\Rset^n\f$
+if \f$\cP\f$
+is described by a constraint system in \f$\Rset^n\f$ that
+consists of one constraint for each bounded bound (lower and upper)
+in an interval in \f$\cB\f$:
+Letting \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 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 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.
+
+If every bound in the intervals
+defining a box \f$\cB\f$ is either closed and bounded
+or open and unbounded, then
+\f$\cB\f$ represents a closed polyhedron.
+
+The <EM>bounding box</EM> of an NNC polyhedron \f$\cP\f$ is
+the smallest \f$n\f$-dimensional box
+containing \f$\cP\f$.
+
+The library provides operations for computing the bounding box
+of an NNC polyhedron and conversely, for obtaining the NNC polyhedron
+representing a given bounding box.
+
+\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 foreign
+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 wildcard 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.
+
+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.
+
+The <EM>bounded</EM> extrapolation operators further enhance each one
+of the limited extrapolation operators described above, by ensuring
+that their results cannot be worse than the smallest
+\ref bounding_boxes "bounding box" enclosing the two argument polyhedra.
+
+
+\section 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$.
+
+By construction, a BDS is always topologically closed.
+Under the usual set inclusion ordering, the set of all BDSs 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$, meaning
+that the intersection of a finite set of BDSs is still a BDS; on the other
+hand, in general the poly-hull of two BDSs is not a BDS. The smallest BDS
+containing a finite set of BDSs is said to be their <EM>bds-hull</EM>.
+
+The PPL provides support for computations on the domain of rational
+bounded difference shapes that, in selected contexts, can achieve a
+better precision/efficiency ratio with respect to the corresponding
+computations on a domain of convex polyhedra.
+As far as the representation of the rational inhomogeneous term of
+each bounded difference 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 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 domain of BDSs,
+even though they are typically characterized by a lower degree of precision.
+
+\subsection Widening_and_Extrapolation_Operators_on_BD_Shapes Widening and Extrapolation Operators on BD Shapes
+
+\anchor BHMZ05_widening
+For the domain of BDSs, the library provides a variant of the widening
+operator for convex polyhedra defined in \ref CH78 "[CH78]".
+The implementation follows the specification in \ref BHMZ05 "[BHMZ05]",
+resulting in an operator which is well-defined on the domain of BDSs
+(i.e., it does not depend on the internal representation of BDSs),
+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,
+is not provided with a convergence guarantee and is therefore an
+extrapolation operator.
+
+
+\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 instantiation of this construction by the
+domain of convex polyhedra and described in Section \ref poly_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 poly_powerset The Polyhedra Powerset Domain
+
+The Polyhedra powerset domain \f$(\Pset_n)_{\smallP}\f$
+provided by the PPL is the finite
+powerset domain (defined in Section \ref powerset) over the domain of
+NNC polyhedra \f$\Pset_n\f$.
+
+In addition to the operations described for the generic powerset
+domain in Section \ref ps_operations, we provide some operations that
+are specific to this instantiation. Of these, most correspond to the
+application of the equivalent operation on each of the NNC polyhedra
+that are in the given set. Here we just describe those operations that
+are particular to the polyhedra powerset domain.
+
+\anchor pps_geometric
+\subsection Geometric_Comparisons Geometric Comparisons
+
+Given the sets \f$\cS_1, \cS_2 \in (\Pset_n)_{\smallP}\f$, then
+we say that \f$\cS_1\f$ <EM>geometrically covers</EM> \f$\cS_2\f$
+if every point (in some element) in a polyhedron in \f$\cS_2\f$ is also
+a point in a polyhedron in \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 powerset \f$\cS \in (\Pset_n)_{\smallP}\f$, then the
+<EM>pairwise merge</EM> operator takes pairs of distinct elements in
+\f$\cS\f$ whose poly-hull 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$\cP, \cQ\f$ of distinct
+polyhedra in the result set, we have
+\f$\cP \uplus \cQ \neq \cP \union \cQ\f$.
+
+\anchor pps_bgp99_extrapolation
+\subsection Powerset_Extrapolation_Operators 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 a base-level extrapolation operator
+different from the H79 widening (e.g., the BHRZ03 widening can be used).
+Note that, in the general case, this 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 powerset domain of convex polyhedra. 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, together with the corresponding convergence certificate,
+the BHZ03 framework shows how it is possible to lift this widening
+so as to work on the finite powerset domain, while still 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 least upper bound 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 poly-hulls of the two arguments, possibly improving the result
+obtained by means of the \ref Convex_Polyhedral_Difference "poly-difference"
+operator.
+For more details and a justification of the overall approach,
+see \ref BHZ03b "[BHZ03b]" and \ref BHZ04 "[BHZ04]".
+
+The library provides two convergence certificates: while
+\ref Parma_Polyhedra_Library::BHRZ03_Certificate "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 sect_rational_grids Rational Grids
+
+In this section we introduce rational grids
+as provided by the library.
+See also \ref BDHMZ05 "[BDHMZ05]" for a detailed description of this domain.
+
+The libary 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>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>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 BDHMZ05 "[BDHMZ05]").
+The 3-tuple \f$(L, Q, P)\f$
+is said to be a <EM>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 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> generator system
+\f$\cG = (L, Q, P)\f$ for \f$\cL\f$
+is such that, if \f$\cG' = (L', Q', P')\f$ is
+another 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 generator system for a grid
+has no more than a total of \f$n+1\f$ 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 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, 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 this section we briefly describe operations on rational grids
+that are provided by the library.
+These are similar to those described in Section \ref Operations_on_Convex_Polyhedra.
+
+\subsection Grid_Intersection_and_Join Grid Intersection and Grid Join
+
+For any pair of grids \f$\cL_1, \cL_2 \in \Gset_n\f$,
+the <EM>intersection</EM> of \f$\cL_1\f$ and \f$\cL_2\f$,
+defined as the set intersection \f$\cL_1 \inters \cL_2\f$,
+is the largest grid included in both \f$\cL_1\f$ and \f$\cL_2\f$;
+similarly, the <EM>grid join</EM>
+of \f$\cL_1\f$ and \f$\cL_2\f$, denoted by \f$\cL_1 \uplus \cL_2\f$,
+is the smallest grid that includes both
+\f$\cL_1\f$ and \f$\cL_2\f$.
+
+In theoretical terms,
+the intersection and grid join operators defined above
+are the binary <EM>meet</EM> and the binary <EM>join</EM>
+operators on the lattice \f$\Gset_n\f$.
+
+\subsection Grid_Difference Grid Difference
+
+For any pair of grids \f$\cL_1, \cL_2 \in \Gset_n\f$,
+the <EM>grid difference</EM>
+of \f$\cL_1\f$ and \f$\cL_2\f$ is defined as the smallest
+grid containing the set-theoretic difference
+of \f$\cL_1\f$ and \f$\cL_2\f$.
+
+\subsection Grid_Concatenate Concatenating Grids
+
+Viewing a grid as a set of tuples (its points), it is sometimes
+useful to consider the set of tuples obtained by concatenating
+an ordered pair of grids.
+Formally, the <EM>concatenation</EM> of the grids
+\f$\cL_1 \in \Gset_n\f$ and \f$\cL_2 \in \Gset_m\f$ (taken in this order)
+is the grid in \f$\Gset_{n+m}\f$ defined as
+\f[
+ \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 \cL_1,
+ (y_0, \ldots, y_{m-1})^\transpose \in \cL_2
+ \,\Bigl\}.
+\f]
+Another way of seeing it is as follows: first embed grid \f$\cL_1\f$
+into a vector space of dimension \f$n+m\f$ and then add a suitably
+renamed-apart version of the congruence relations defining \f$\cL_2\f$.
+
+\subsection Grid_Add_Space_Dimensions Adding New Dimensions to the Vector Space
+
+The library provides two operators for adding a number \f$i\f$ of
+space dimensions to a grid \f$\cL \in \Gset_n\f$,
+therefore transforming it into a new grid in
+\f$\Gset_{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 grid \f$\cL\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the grid
+defined by all and only the congruences defining \f$\cL\f$
+(the variables corresponding to the added dimensions are unconstrained).
+For instance, when starting from a grid \f$\cL \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the grid
+\f[
+ \bigl\{\,
+ (x_0, x_1, x_2)^\transpose \in \Rset^3
+ \bigm|
+ (x_0, x_1)^\transpose \in \cL
+ \,\bigr\}.
+\f]
+
+In contrast, the operator <CODE>add_space_dimensions_and_project</CODE>
+\e projects the grid \f$\cL\f$ into the new vector space of
+dimension \f$i+n\f$ and returns the grid
+whose congruence system, besides the congruence relations defining \f$\cL\f$,
+will include additional equalities on the added dimensions.
+Namely, the corresponding variables are all constrained to be equal to 0.
+For instance, when starting from a grid \f$\cL \sseq \Rset^2\f$
+and adding a third space dimension, the result will be the grid
+\f[
+ \bigl\{\,
+ (x_0, x_1, 0)^\transpose \in \Rset^3
+ \bigm|
+ (x_0, x_1)^\transpose \in \cL
+ \,\bigr\}.
+\f]
+
+\subsection Grid_Remove_Space_Dimensions Removing Dimensions from the Vector Space
+
+The library provides two operators for removing
+space dimensions from a grid \f$\cL \in \Gset_n\f$,
+therefore transforming it into a new grid in
+\f$\Gset_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.
+
+Given a space dimension \f$m\f$ less than or equal to that of the grid,
+the operator <CODE>remove_higher_space_dimensions</CODE> removes
+the space dimensions having indices greater than or equal to \f$m\f$.
+
+\subsection Grid_Map_Space_Dimensions 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 grid \f$\cL \in \Gset_n\f$
+onto the zero-dimension space \f$\Rset^0\f$;
+otherwise the result is a grid in \f$\Gset_m\f$ given by
+\f[
+ \Bigl\{\,
+ \bigl(v_{\rho^{-1}(0)}, \ldots, v_{\rho^{-1}(m-1)}\bigr)^\transpose
+ \Bigm|
+ (v_0, \ldots, v_{n-1})^\transpose \in \cL
+ \,\Bigr\}.
+\f]
+
+\subsection Grid_Expand_Space_Dimension 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 grid \f$\cL \in \Gset_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 resulting grid are exact copies of the \f$i\f$-th space dimension
+of \f$\cL\f$. More formally, the result is a grid in \f$\Gset_m\f$ given by
+\f[
+ \sset{
+ \vect{u} \in \Rset^{n+m}
+ }{
+ \exists \vect{v}, \vect{w} \in \cL
+ \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]
+
+\subsection Grid_Fold_Space_Dimensions Folding Multiple Dimensions of the Vector Space into One Dimension
+
+The operator <CODE>fold_space_dimensions</CODE> provided by the library,
+given a grid \f$\cL \in \Gset_n\f$, with \f$n > 0\f$,
+folds a subset \f$J\f$ of the set of space dimensions \f$\{0, \ldots, n-1\}\f$
+into a space dimension \f$i < n\f$, where \f$i \notin J\f$.
+Letting \f$m = \card J\f$, the result is given by the grid join
+\f[
+ \cL_0 \uplus \cdots \uplus \cL_m
+\f]
+where
+\f[
+ \cL_m
+ \defeq
+ \sset{
+ \vect{u} \in \Rset^{n-m}
+ }{
+ \exists \vect{v} \in \cL
+ \st u_{i'} = v_i \\
+ \qquad \mathord{} \land \forall k = 0, \ldots, n-1
+ \itc k \neq i \implies u_{k'} = v_k
+ },
+\f]
+for \f$ d = 0 \f$, \f$ \ldots \f$, \f$ m-1 \f$,
+\f[
+ \cL_d
+ \defeq
+ \sset{
+ \vect{u} \in \Rset^{n-m}
+ }{
+ \exists \vect{v} \in \cL
+ \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, for \f$ k = 0 \f$, \f$ \ldots \f$, \f$ n-1 \f$,
+\f[
+ k'
+ \defeq
+ k - \card \{\, j \in J \mid k > j \,\}.
+\f]
+
+\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 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 points
+\f$\bigl\{
+ (1, 0)^\transpose,
+ (7, 3)^\transpose,
+ (10, 0)^\transpose
+ \bigr\}\f$
+which is the grid generated by the 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_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
+either a congruence or a 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.
+
+A grid \f$\cL\f$ <EM>subsumes</EM> a generator \f$g\f$ if
+adding \f$g\f$ to any generator system representing \f$\cL\f$
+does not change \f$\cL\f$.
+
+\subsection Rectilinear_Grids Rectilinear Grids and Covering Boxes
+
+Consider again the \ref bounding_boxes "boxes" used for convex polyhedra.
+An \f$n\f$-dimensional <EM>rational box</EM> is a box
+\f$\cB\f$ in \f$\Qset^n\f$;
+that is, where the bounded bounds in the intervals are each in \f$\Qset\f$.
+We will say that an interval is <EM>bounded</EM> if both its bounds
+are bounded.
+
+Each bounded interval in \f$\cB\f$ determines a congruence \f$\cg\f$
+in \f$\Qset^n\f$.
+Letting \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 both the bounds of the interval
+are closed, then the congruence \f$\cg\f$ is defined as
+\f$\bigl(\langle \vect{e}_i, \vect{x} \rangle \equiv_f b\bigr)\f$,
+where \f$b\f$ is the value of the lower bound and
+\f$f\f$ is the (non-negative) difference between the lower and upper bounds.
+If one of the bounds is open,
+then \f$\cg\f$ is the congruence
+\f$\bigl(\langle \vect{0}, \vect{x} \rangle \equiv_0 1\bigr)\f$
+representing the inconsistent equality \f$(0 = 1)\f$.
+
+Let \f$\cC\f$ be the set of congruences defined by
+the bounded intervals in a rational box \f$\cB\f$;
+then we say that \f$B\f$ <EM>represents</EM> the rational grid
+\f$\cL = \gcon(\cC)\f$.
+Any grid \f$\cL \in \Gset_n\f$ that can be represented by
+a box is said to be <EM>rectilinear</EM>.
+
+A <EM>covering box</EM> of a grid \f$\cL\f$ is a rational box
+representing the smallest rectilinear grid that contains \f$\cL\f$.
+
+As for convex polyhedra, the library will provide
+operations for computing the rectilinear grid corresponding to a given box
+and, also, a covering box for any given grid.
+
+\subsection Grid_Widening Widening Operators
+
+The library provides a <EM>grid widening</EM> operator for the domain of grids.
+This follows the specification provided in \ref BDHMZ05 "[BDHMZ05]".
+Note that, as for the widenings provided for convex polyhedra,
+the widening \f$\cL_1 \widen \cL_2\f$ of two
+grids \f$\cL_1, \cL_2 \in \Gset_n\f$ requires 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, if grid \f$\cL_1\f$
+and \f$\cL_2\f$ (where \f$\cL_1 \sseq \cL_2\f$) are identified by program
+variables <CODE>l_1</CODE> and <CODE>l_2</CODE>, respectively, then the
+call <CODE>l_2.grid_widening_assign(l_1)</CODE> will assign the grid
+\f$\cL_1 \widen \cL_2\f$ to variable <CODE>l_2</CODE>. Namely, it is the
+bigger grid\f$\cL_2\f$ which is overwritten by the result of the
+widening. The smaller grid 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 foreign
+language interfaces.
+
+\subsection Grid_Widening_with_Tokens Widening with Tokens
+
+This will be as for \ref Widening_with_Tokens "widening with tokens"
+for convex polyhedra.
+
+\subsection Grid_Extrapolation 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.
+
+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.
+
+The <EM>bounded</EM> extrapolation operators further enhance each one
+of the limited extrapolation operators described above, by ensuring
+that their results cannot be worse than the smallest
+\ref Rectilinear_Grids "rectilinear grid" that contains the two argument grids.
+
+\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 still makes 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.
+
+\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> [Bag98] </DT>
+<DD>
+\anchor Bag98
+R. Bagnara.
+ A hierarchy of constraint systems for data-flow analysis of
+ constraint logic-based languages.
+ <i>Science of Computer Programming</i>, 30(1-2):119-155, 1998.
+
+</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.
+ <i>ACM Transactions on Programming Languages and Systems</i>,
+ 21(4):747-789, 1999.
+
+</DD>
+
+
+<DT> [BDHMZ05] </DT>
+<DD>
+\anchor BDHMZ05
+R. Bagnara, K. Dobson, P. M. Hill, M. Mundell, and E. Zaffanella.
+ A Linear Domain for Analyzing the Distribution of Numerical Values.
+ Technical report 2005.06, School of Computing, University of Leeds, UK, 2005.
+ Available at
+ <A HREF="http://www.comp.leeds.ac.uk/research/pubs/reports.shtml">http://www.comp.leeds.ac.uk/research/pubs/reports.shtml</A>.
+
+</DD>
+
+<DT> [BHMZ05] </DT>
+<DD>
+\anchor BHMZ05
+R. Bagnara, P. M. Hill, E. Mazzi, and E. Zaffanella.
+ Widening Operators for Weakly-Relational Numeric Abstractions.
+ In C. Hankin and I. Silveroni, editors, <i>Static Analysis:
+ Proceedings of the 12th International Symposium</i>, volume 3672 of
+ <i>Lecture Notes in Computer Science</i>, 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, <i>Static Analysis: Proceedings of the 10th
+ International Symposium</i>, volume 2694 of <i>Lecture Notes in Computer
+ Science</i>, 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> [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, <i>Proceedings of
+ the 1st CoLogNet Workshop on Component-based Software Development and
+ Implementation Technology for Computational Logic Systems</i>, 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, <i>
+ Proceedings of the 3rd Workshop on Automated Verification of Critical
+ Systems</i>, 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, <i>Proceedings of the Fifth
+ International Conference on Verification, Model Checking and Abstract
+ Interpretation (VMCAI 2004)</i>, volume 2937 of <i>Lecture Notes in Computer
+ Science</i>, 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> [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, <i>Static Analysis:
+ Proceedings of the 6th International Symposium</i>, volume 1694 of <i>Lecture
+ Notes in Computer Science</i>, pages 51-68, Venice, Italy, 1999.
+ Springer-Verlag, Berlin.
+
+</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, <i>Static Analysis:
+ Proceedings of the 9th International Symposium</i>, volume 2477 of <i>Lecture
+ Notes in Computer Science</i>, 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, <i>Proceedings of the 2nd International
+ Symposium on Programming</i>, pages 106-130, Paris, France, 1976.
+
+</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, <i>Proceedings of the 4th
+ International Symposium on Programming Language Implementation and Logic
+ Programming</i>, volume 631 of <i>Lecture Notes in Computer Science</i>, 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 <i>Conference Record of the Fifth Annual ACM Symposium on
+ Principles of Programming Languages</i>, 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.
+ <i>U.S.S.R. Computational Mathematics and Mathematical Physics</i>,
+ 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.
+ <i>U.S.S.R. Computational Mathematics and Mathematical Physics</i>,
+ 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.
+ <i>U.S.S.R. Computational Mathematics and Mathematical Physics</i>,
+ 8(6):282-293, 1968.
+
+</DD>
+
+
+<DT> [Dan63] </DT>
+<DD>
+\anchor Dan63
+G. B. Dantzig.
+ <i>Linear Programming and Extensions</i>.
+ Princeton University Press, Princeton, NJ, 1963.
+
+</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, <i>Combinatorics
+ and Computer Science, 8th Franco-Japanese and 4th Franco-Chinese Conference,
+ Brest, France, July 3-5, 1995, Selected Papers</i>, volume 1120 of <i>Lecture
+ Notes in Computer Science</i>, 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/fukuda.html">http://www.ifor.math.ethz.ch/~fukuda/fukuda.html</A>, 1998.
+
+</DD>
+
+
+<DT> [GDD<sup>+</sup>04] </DT>
+<DD>
+\anchor GDMDRS04
+D. Gopan, F. DiMaio, N. Dor, T. Reps, and M. Sagiv.
+ Numeric domains with summarized dimensions.
+ In K. Jensen and A. Podelski, editors, <i>Tools and Algorithms for
+ the Construction and Analysis of Systems, 10th International Conference,
+ TACAS 2004</i>, volume 2988 of <i>Lecture Notes in Computer Science</i>, pages
+ 512-529. Springer-Verlag, Berlin, 2004.
+
+</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, <i>Polytopes -
+ Combinatorics and Computation</i>, 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 <i>Proceedings of the 17th Annual Symposium on Computational
+ Geometry</i>, pages 222-231, Medford, MA, USA, 2001. ACM.
+
+</DD>
+
+
+<DT> [Hal79] </DT>
+<DD>
+\anchor Hal79
+N. Halbwachs.
+ <i>D�termination Automatique de Relations Lin�aires
+ V�rifi�es par les Variables d'un Programme</i>.
+ 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, <i>Computer Aided Verification:
+ Proceedings of the 5th International Conference</i>, volume 697 of <i>Lecture
+ Notes in Computer Science</i>, 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, <i>
+ Hybrid Systems II</i>, volume 999 of <i>Lecture Notes in Computer Science</i>,
+ pages 252-264. Springer-Verlag, Berlin, 1995.
+
+</DD>
+
+
+<DT> [HKP95] </DT>
+<DD>
+\anchor HKP95
+N. Halbwachs, A. Kerbrat, and Y.-E. Proy.
+ <i>POLyhedra INtegrated Environment</i>.
+ 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> [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, <i>Static Analysis: Proceedings of the
+ 1st International Symposium</i>, volume 864 of <i>Lecture Notes in Computer
+ Science</i>, 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.
+ <i>Formal Methods in System Design</i>, 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 <i>Proceedings of the 40th Annual Conference on Decision and
+ Control</i>, pages 2887-2892. IEEE Computer Society Press, 2001.
+
+</DD>
+
+
+<DT> [Jea02] </DT>
+<DD>
+\anchor Jea02
+B. Jeannet.
+ <i>Convex Polyhedra Library</i>, release 1.1.3c edition, March 2002.
+ Documentation of the ``New Polka'' library available at
+ <A HREF="http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html">http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html</A>.
+
+</DD>
+
+
+<DT> [Kuh56] </DT>
+<DD>
+\anchor Kuh56
+H. W. Kuhn.
+ Solvability and consistency for linear equations and inequalities.
+ <i>American Mathematical Monthly</i>, 63:217-232, 1956.
+
+</DD>
+
+
+<DT> [Le 92] </DT>
+<DD>
+\anchor Le92
+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.
+ <i>International Journal of Parallel Programming</i>, 25(6):525-549,
+ 1997.
+
+</DD>
+
+
+<DT> [Mas92] </DT>
+<DD>
+\anchor Mas92
+F. Masdupuy.
+ Array operations abstraction using semantic analysis of trapezoid
+ congruences.
+ In <i>Proceedings of the 6th ACM International Conference on
+ Supercomputing</i>, pages 226-235, Washington, DC, USA, 1992. ACM Press.
+
+</DD>
+
+
+<DT> [Mas93] </DT>
+<DD>
+\anchor Mas93
+F. Masdupuy.
+ <i>Array Indices Relational Semantic Analysis Using Rational Cosets
+ and Trapezoids</i>.
+ Th�se d'informatique, �cole Polytechnique, Palaiseau, France,
+ December 1993.
+
+</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, <i>Contributions to the
+ Theory of Games - Volume II</i>, number 28 in Annals of Mathematics Studies,
+ pages 51-73. Princeton University Press, Princeton, New Jersey, 1953.
+
+</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.
+ <i>Integer and Combinatorial Optimization</i>.
+ Wiley Interscience Series in Discrete Mathematics and Optimization.
+ John Wiley & Sons, 1988.
+
+</DD>
+
+
+<DT> [Sch99] </DT>
+<DD>
+\anchor Sch99
+A. Schrijver.
+ <i>Theory of Linear and Integer Programming</i>.
+ Wiley Interscience Series in Discrete Mathematics and Optimization.
+ John Wiley & Sons, 1999.
+
+</DD>
+
+
+<DT> [Sri93] </DT>
+<DD>
+\anchor Sri93
+D. Srivastava.
+ Subsumption and indexing in constraint query languages with linear
+ arithmetic constraints.
+ <i>Annals of Mathematics and Artificial Intelligence</i>,
+ 8(3-4):315-343, 1993.
+
+</DD>
+
+
+<DT> [SW70] </DT>
+<DD>
+\anchor SW70
+J. Stoer and C. Witzgall.
+ <i>Convexity and Optimization in Finite Dimensions I</i>.
+ Springer-Verlag, Berlin, 1970.
+
+</DD>
+
+
+<DT> [Wey35] </DT>
+<DD>
+\anchor Wey35
+H. Weyl.
+ Elementare theorie der konvexen polyeder.
+ <i>Commentarii Mathematici Helvetici</i>, 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, <i>Contributions to the Theory of Games -
+ Volume I</i>, 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 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
+Boolean matrix that represent the connection between constraints and
+generators of a polyhedron.
+There are two kinds of saturation matrix 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 |y|, & \text{if $x \ge 0$;} \\
+ -(|x| \brem |y|), & \text{if $x < 0$.}
+ \end{cases}
+\f]
+
+<B><EM>Proof</EM></B>
+Throughout the proof we write \f$x_0 = |x|\f$ and \f$y_0 = |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.doxyconf-html b/doc/devref.doxyconf-html
new file mode 100644
index 0000000..4a11633
--- /dev/null
+++ b/doc/devref.doxyconf-html
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ./definitions.dox \
+ ./../src/namespaces.hh \
+ ../src/version.hh \
+ ./../src/version.cc \
+ ./../src/Float.defs.hh \
+ ./../src/Float.inlines.hh \
+ ./../src/Float.cc \
+ ./../src/Checked_Number.types.hh \
+ ./../src/Checked_Number.defs.hh \
+ ./../src/Checked_Number.inlines.hh \
+ ./../src/Checked_Number.cc \
+ ./../src/GMP_Integer.types.hh \
+ ./../src/GMP_Integer.defs.hh \
+ ./../src/GMP_Integer.inlines.hh \
+ ./../src/Coefficient_traits_template.hh \
+ ./../src/Coefficient.types.hh \
+ ./../src/Coefficient.defs.hh \
+ ./../src/Coefficient.inlines.hh \
+ ./../src/Coefficient.cc \
+ ./../src/Limits.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.cc \
+ ./../src/Init.types.hh \
+ ./../src/Init.defs.hh \
+ ./../src/Init.cc \
+ ./../src/initializer.hh \
+ ./../src/globals.types.hh \
+ ./../src/globals.defs.hh \
+ ./../src/globals.inlines.hh \
+ ./../src/globals.cc \
+ ./../src/Topology.hh \
+ ./../src/Row.types.hh \
+ ./../src/Row.defs.hh \
+ ./../src/Row.inlines.hh \
+ ./../src/Row.cc \
+ ./../src/Matrix.types.hh \
+ ./../src/Matrix.defs.hh \
+ ./../src/Matrix.inlines.hh \
+ ./../src/Matrix.cc \
+ ./../src/Linear_Row.types.hh \
+ ./../src/Linear_Row.defs.hh \
+ ./../src/Linear_Row.inlines.hh \
+ ./../src/Linear_Row.cc \
+ ./../src/Linear_System.types.hh \
+ ./../src/Linear_System.defs.hh \
+ ./../src/Linear_System.inlines.hh \
+ ./../src/Linear_System.cc \
+ ./../src/Saturation_Row.types.hh \
+ ./../src/Saturation_Row.defs.hh \
+ ./../src/Saturation_Row.inlines.hh \
+ ./../src/Saturation_Row.cc \
+ ./../src/Saturation_Matrix.types.hh \
+ ./../src/Saturation_Matrix.defs.hh \
+ ./../src/Saturation_Matrix.inlines.hh \
+ ./../src/Saturation_Matrix.cc \
+ ./../src/Variable.types.hh \
+ ./../src/Variable.defs.hh \
+ ./../src/Variable.inlines.hh \
+ ./../src/Variable.cc \
+ ./../src/Linear_Expression.types.hh \
+ ./../src/Linear_Expression.defs.hh \
+ ./../src/Linear_Expression.inlines.hh \
+ ./../src/Linear_Expression.cc \
+ ./../src/Constraint.types.hh \
+ ./../src/Constraint.defs.hh \
+ ./../src/Constraint.inlines.hh \
+ ./../src/Constraint.cc \
+ ./../src/Congruence.types.hh \
+ ./../src/Congruence.defs.hh \
+ ./../src/Congruence.inlines.hh \
+ ./../src/Congruence.cc \
+ ./../src/Generator.types.hh \
+ ./../src/Generator.defs.hh \
+ ./../src/Generator.inlines.hh \
+ ./../src/Generator.cc \
+ ./../src/Grid_Generator.types.hh \
+ ./../src/Grid_Generator.defs.hh \
+ ./../src/Grid_Generator.inlines.hh \
+ ./../src/Grid_Generator.cc \
+ ./../src/Constraint_System.types.hh \
+ ./../src/Constraint_System.defs.hh \
+ ./../src/Constraint_System.inlines.hh \
+ ./../src/Constraint_System.cc \
+ ./../src/Congruence_System.types.hh \
+ ./../src/Congruence_System.defs.hh \
+ ./../src/Congruence_System.inlines.hh \
+ ./../src/Congruence_System.cc \
+ ./../src/Generator_System.defs.hh \
+ ./../src/Generator_System.types.hh \
+ ./../src/Generator_System.inlines.hh \
+ ./../src/Generator_System.cc \
+ ./../src/Grid_Generator_System.defs.hh \
+ ./../src/Grid_Generator_System.types.hh \
+ ./../src/Grid_Generator_System.inlines.hh \
+ ./../src/Grid_Generator_System.cc \
+ ./../src/Scalar_Products.types.hh \
+ ./../src/Scalar_Products.defs.hh \
+ ./../src/Scalar_Products.inlines.hh \
+ ./../src/Scalar_Products.cc \
+ ./../src/Ph_Status.idefs.hh \
+ ./../src/Ph_Status.inlines.hh \
+ ./../src/Ph_Status.cc \
+ ./../src/Polyhedron.types.hh \
+ ./../src/Polyhedron.defs.hh \
+ ./../src/Polyhedron.inlines.hh \
+ ./../src/Polyhedron.templates.hh \
+ ./../src/Polyhedron_public.cc \
+ ./../src/Polyhedron_nonpublic.cc \
+ ./../src/Polyhedron_widenings.cc \
+ ./../src/Polyhedron_chdims.cc \
+ ./../src/conversion.cc \
+ ./../src/minimize.cc \
+ ./../src/simplify.cc \
+ ./../src/Grid.types.hh \
+ ./../src/Grid.defs.hh \
+ ./../src/Grid.inlines.hh \
+ ./../src/Grid.templates.hh \
+ ./../src/Grid_public.cc \
+ ./../src/Grid_nonpublic.cc \
+ ./../src/Grid_conversion.cc \
+ ./../src/Grid_simplify.cc \
+ ./../src/Grid_widenings.cc \
+ ./../src/Grid_chdims.cc \
+ ./../src/Poly_Con_Relation.types.hh \
+ ./../src/Poly_Con_Relation.defs.hh \
+ ./../src/Poly_Con_Relation.inlines.hh \
+ ./../src/Poly_Con_Relation.cc \
+ ./../src/Poly_Gen_Relation.types.hh \
+ ./../src/Poly_Gen_Relation.defs.hh \
+ ./../src/Poly_Gen_Relation.inlines.hh \
+ ./../src/Poly_Gen_Relation.cc \
+ ./../src/Interval.types.hh \
+ ./../src/Interval.defs.hh \
+ ./../src/Interval.inlines.hh \
+ ./../src/Interval.cc \
+ ./../src/Bounding_Box.types.hh \
+ ./../src/Bounding_Box.defs.hh \
+ ./../src/Bounding_Box.inlines.hh \
+ ./../src/Bounding_Box.cc \
+ ./../src/C_Polyhedron.types.hh \
+ ./../src/C_Polyhedron.defs.hh \
+ ./../src/C_Polyhedron.inlines.hh \
+ ./../src/C_Polyhedron.cc \
+ ./../src/NNC_Polyhedron.types.hh \
+ ./../src/NNC_Polyhedron.defs.hh \
+ ./../src/NNC_Polyhedron.inlines.hh \
+ ./../src/NNC_Polyhedron.cc \
+ ./../src/Widening_Function.types.hh \
+ ./../src/Widening_Function.defs.hh \
+ ./../src/Widening_Function.inlines.hh \
+ ./../src/BHRZ03_Certificate.types.hh \
+ ./../src/BHRZ03_Certificate.defs.hh \
+ ./../src/BHRZ03_Certificate.inlines.hh \
+ ./../src/BHRZ03_Certificate.cc \
+ ./../src/H79_Certificate.types.hh \
+ ./../src/H79_Certificate.defs.hh \
+ ./../src/H79_Certificate.inlines.hh \
+ ./../src/H79_Certificate.cc \
+ ./../src/Grid_Certificate.types.hh \
+ ./../src/Grid_Certificate.defs.hh \
+ ./../src/Grid_Certificate.inlines.hh \
+ ./../src/Grid_Certificate.cc \
+ ./../src/Determinate.defs.hh \
+ ./../src/Determinate.inlines.hh \
+ ./../src/Powerset.defs.hh \
+ ./../src/Powerset.inlines.hh \
+ ./../src/Powerset.templates.hh \
+ ./../src/Polyhedra_Powerset.types.hh \
+ ./../src/Polyhedra_Powerset.defs.hh \
+ ./../src/Polyhedra_Powerset.inlines.hh \
+ ./../src/Polyhedra_Powerset.templates.hh \
+ ./../src/Polyhedra_Powerset.cc \
+ ./../src/algorithms.hh \
+ ./../src/LP_Problem.types.hh \
+ ./../src/LP_Problem.defs.hh \
+ ./../src/LP_Problem.inlines.hh \
+ ./../src/LP_Problem.cc \
+ ./../src/DB_Row.types.hh \
+ ./../src/DB_Row.defs.hh \
+ ./../src/DB_Row.inlines.hh \
+ ./../src/DB_Matrix.types.hh \
+ ./../src/DB_Matrix.defs.hh \
+ ./../src/DB_Matrix.inlines.hh \
+ ./../src/BD_Shape.types.hh \
+ ./../src/BD_Shape.defs.hh \
+ ./../src/BD_Shape.inlines.hh \
+ ./../src/BD_Shape.templates.hh \
+ ./../src/BD_Shape.cc \
+ ../interfaces/C/ppl_c.h \
+ ./../interfaces/C/ppl_c.cc \
+ ./../interfaces/Prolog/Prolog_interface.dox \
+ ./../interfaces/Prolog/exceptions.hh \
+ ./../interfaces/Prolog/track_allocation.hh \
+ ./../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/YAP/ppl_yap.cc \
+ ./gpl.dox \
+ ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS = *.hh \
+ *.cc \
+ *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = devref.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = ./devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+ PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = CATCH_ALL \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/devref.doxyconf-html.in b/doc/devref.doxyconf-html.in
new file mode 100644
index 0000000..e1a868b
--- /dev/null
+++ b/doc/devref.doxyconf-html.in
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @srcdir@/definitions.dox \
+ @srcdir@/../src/namespaces.hh \
+ ../src/version.hh \
+ @srcdir@/../src/version.cc \
+ @srcdir@/../src/Float.defs.hh \
+ @srcdir@/../src/Float.inlines.hh \
+ @srcdir@/../src/Float.cc \
+ @srcdir@/../src/Checked_Number.types.hh \
+ @srcdir@/../src/Checked_Number.defs.hh \
+ @srcdir@/../src/Checked_Number.inlines.hh \
+ @srcdir@/../src/Checked_Number.cc \
+ @srcdir@/../src/GMP_Integer.types.hh \
+ @srcdir@/../src/GMP_Integer.defs.hh \
+ @srcdir@/../src/GMP_Integer.inlines.hh \
+ @srcdir@/../src/Coefficient_traits_template.hh \
+ @srcdir@/../src/Coefficient.types.hh \
+ @srcdir@/../src/Coefficient.defs.hh \
+ @srcdir@/../src/Coefficient.inlines.hh \
+ @srcdir@/../src/Coefficient.cc \
+ @srcdir@/../src/Limits.hh \
+ @srcdir@/../src/checked.defs.hh \
+ @srcdir@/../src/checked.inlines.hh \
+ @srcdir@/../src/checked_float.inlines.hh \
+ @srcdir@/../src/checked_int.inlines.hh \
+ @srcdir@/../src/checked_mpq.inlines.hh \
+ @srcdir@/../src/checked_mpz.inlines.hh \
+ @srcdir@/../src/checked.cc \
+ @srcdir@/../src/Init.types.hh \
+ @srcdir@/../src/Init.defs.hh \
+ @srcdir@/../src/Init.cc \
+ @srcdir@/../src/initializer.hh \
+ @srcdir@/../src/globals.types.hh \
+ @srcdir@/../src/globals.defs.hh \
+ @srcdir@/../src/globals.inlines.hh \
+ @srcdir@/../src/globals.cc \
+ @srcdir@/../src/Topology.hh \
+ @srcdir@/../src/Row.types.hh \
+ @srcdir@/../src/Row.defs.hh \
+ @srcdir@/../src/Row.inlines.hh \
+ @srcdir@/../src/Row.cc \
+ @srcdir@/../src/Matrix.types.hh \
+ @srcdir@/../src/Matrix.defs.hh \
+ @srcdir@/../src/Matrix.inlines.hh \
+ @srcdir@/../src/Matrix.cc \
+ @srcdir@/../src/Linear_Row.types.hh \
+ @srcdir@/../src/Linear_Row.defs.hh \
+ @srcdir@/../src/Linear_Row.inlines.hh \
+ @srcdir@/../src/Linear_Row.cc \
+ @srcdir@/../src/Linear_System.types.hh \
+ @srcdir@/../src/Linear_System.defs.hh \
+ @srcdir@/../src/Linear_System.inlines.hh \
+ @srcdir@/../src/Linear_System.cc \
+ @srcdir@/../src/Saturation_Row.types.hh \
+ @srcdir@/../src/Saturation_Row.defs.hh \
+ @srcdir@/../src/Saturation_Row.inlines.hh \
+ @srcdir@/../src/Saturation_Row.cc \
+ @srcdir@/../src/Saturation_Matrix.types.hh \
+ @srcdir@/../src/Saturation_Matrix.defs.hh \
+ @srcdir@/../src/Saturation_Matrix.inlines.hh \
+ @srcdir@/../src/Saturation_Matrix.cc \
+ @srcdir@/../src/Variable.types.hh \
+ @srcdir@/../src/Variable.defs.hh \
+ @srcdir@/../src/Variable.inlines.hh \
+ @srcdir@/../src/Variable.cc \
+ @srcdir@/../src/Linear_Expression.types.hh \
+ @srcdir@/../src/Linear_Expression.defs.hh \
+ @srcdir@/../src/Linear_Expression.inlines.hh \
+ @srcdir@/../src/Linear_Expression.cc \
+ @srcdir@/../src/Constraint.types.hh \
+ @srcdir@/../src/Constraint.defs.hh \
+ @srcdir@/../src/Constraint.inlines.hh \
+ @srcdir@/../src/Constraint.cc \
+ @srcdir@/../src/Congruence.types.hh \
+ @srcdir@/../src/Congruence.defs.hh \
+ @srcdir@/../src/Congruence.inlines.hh \
+ @srcdir@/../src/Congruence.cc \
+ @srcdir@/../src/Generator.types.hh \
+ @srcdir@/../src/Generator.defs.hh \
+ @srcdir@/../src/Generator.inlines.hh \
+ @srcdir@/../src/Generator.cc \
+ @srcdir@/../src/Grid_Generator.types.hh \
+ @srcdir@/../src/Grid_Generator.defs.hh \
+ @srcdir@/../src/Grid_Generator.inlines.hh \
+ @srcdir@/../src/Grid_Generator.cc \
+ @srcdir@/../src/Constraint_System.types.hh \
+ @srcdir@/../src/Constraint_System.defs.hh \
+ @srcdir@/../src/Constraint_System.inlines.hh \
+ @srcdir@/../src/Constraint_System.cc \
+ @srcdir@/../src/Congruence_System.types.hh \
+ @srcdir@/../src/Congruence_System.defs.hh \
+ @srcdir@/../src/Congruence_System.inlines.hh \
+ @srcdir@/../src/Congruence_System.cc \
+ @srcdir@/../src/Generator_System.defs.hh \
+ @srcdir@/../src/Generator_System.types.hh \
+ @srcdir@/../src/Generator_System.inlines.hh \
+ @srcdir@/../src/Generator_System.cc \
+ @srcdir@/../src/Grid_Generator_System.defs.hh \
+ @srcdir@/../src/Grid_Generator_System.types.hh \
+ @srcdir@/../src/Grid_Generator_System.inlines.hh \
+ @srcdir@/../src/Grid_Generator_System.cc \
+ @srcdir@/../src/Scalar_Products.types.hh \
+ @srcdir@/../src/Scalar_Products.defs.hh \
+ @srcdir@/../src/Scalar_Products.inlines.hh \
+ @srcdir@/../src/Scalar_Products.cc \
+ @srcdir@/../src/Ph_Status.idefs.hh \
+ @srcdir@/../src/Ph_Status.inlines.hh \
+ @srcdir@/../src/Ph_Status.cc \
+ @srcdir@/../src/Polyhedron.types.hh \
+ @srcdir@/../src/Polyhedron.defs.hh \
+ @srcdir@/../src/Polyhedron.inlines.hh \
+ @srcdir@/../src/Polyhedron.templates.hh \
+ @srcdir@/../src/Polyhedron_public.cc \
+ @srcdir@/../src/Polyhedron_nonpublic.cc \
+ @srcdir@/../src/Polyhedron_widenings.cc \
+ @srcdir@/../src/Polyhedron_chdims.cc \
+ @srcdir@/../src/conversion.cc \
+ @srcdir@/../src/minimize.cc \
+ @srcdir@/../src/simplify.cc \
+ @srcdir@/../src/Grid.types.hh \
+ @srcdir@/../src/Grid.defs.hh \
+ @srcdir@/../src/Grid.inlines.hh \
+ @srcdir@/../src/Grid.templates.hh \
+ @srcdir@/../src/Grid_public.cc \
+ @srcdir@/../src/Grid_nonpublic.cc \
+ @srcdir@/../src/Grid_conversion.cc \
+ @srcdir@/../src/Grid_simplify.cc \
+ @srcdir@/../src/Grid_widenings.cc \
+ @srcdir@/../src/Grid_chdims.cc \
+ @srcdir@/../src/Poly_Con_Relation.types.hh \
+ @srcdir@/../src/Poly_Con_Relation.defs.hh \
+ @srcdir@/../src/Poly_Con_Relation.inlines.hh \
+ @srcdir@/../src/Poly_Con_Relation.cc \
+ @srcdir@/../src/Poly_Gen_Relation.types.hh \
+ @srcdir@/../src/Poly_Gen_Relation.defs.hh \
+ @srcdir@/../src/Poly_Gen_Relation.inlines.hh \
+ @srcdir@/../src/Poly_Gen_Relation.cc \
+ @srcdir@/../src/Interval.types.hh \
+ @srcdir@/../src/Interval.defs.hh \
+ @srcdir@/../src/Interval.inlines.hh \
+ @srcdir@/../src/Interval.cc \
+ @srcdir@/../src/Bounding_Box.types.hh \
+ @srcdir@/../src/Bounding_Box.defs.hh \
+ @srcdir@/../src/Bounding_Box.inlines.hh \
+ @srcdir@/../src/Bounding_Box.cc \
+ @srcdir@/../src/C_Polyhedron.types.hh \
+ @srcdir@/../src/C_Polyhedron.defs.hh \
+ @srcdir@/../src/C_Polyhedron.inlines.hh \
+ @srcdir@/../src/C_Polyhedron.cc \
+ @srcdir@/../src/NNC_Polyhedron.types.hh \
+ @srcdir@/../src/NNC_Polyhedron.defs.hh \
+ @srcdir@/../src/NNC_Polyhedron.inlines.hh \
+ @srcdir@/../src/NNC_Polyhedron.cc \
+ @srcdir@/../src/Widening_Function.types.hh \
+ @srcdir@/../src/Widening_Function.defs.hh \
+ @srcdir@/../src/Widening_Function.inlines.hh \
+ @srcdir@/../src/BHRZ03_Certificate.types.hh \
+ @srcdir@/../src/BHRZ03_Certificate.defs.hh \
+ @srcdir@/../src/BHRZ03_Certificate.inlines.hh \
+ @srcdir@/../src/BHRZ03_Certificate.cc \
+ @srcdir@/../src/H79_Certificate.types.hh \
+ @srcdir@/../src/H79_Certificate.defs.hh \
+ @srcdir@/../src/H79_Certificate.inlines.hh \
+ @srcdir@/../src/H79_Certificate.cc \
+ @srcdir@/../src/Grid_Certificate.types.hh \
+ @srcdir@/../src/Grid_Certificate.defs.hh \
+ @srcdir@/../src/Grid_Certificate.inlines.hh \
+ @srcdir@/../src/Grid_Certificate.cc \
+ @srcdir@/../src/Determinate.defs.hh \
+ @srcdir@/../src/Determinate.inlines.hh \
+ @srcdir@/../src/Powerset.defs.hh \
+ @srcdir@/../src/Powerset.inlines.hh \
+ @srcdir@/../src/Powerset.templates.hh \
+ @srcdir@/../src/Polyhedra_Powerset.types.hh \
+ @srcdir@/../src/Polyhedra_Powerset.defs.hh \
+ @srcdir@/../src/Polyhedra_Powerset.inlines.hh \
+ @srcdir@/../src/Polyhedra_Powerset.templates.hh \
+ @srcdir@/../src/Polyhedra_Powerset.cc \
+ @srcdir@/../src/algorithms.hh \
+ @srcdir@/../src/LP_Problem.types.hh \
+ @srcdir@/../src/LP_Problem.defs.hh \
+ @srcdir@/../src/LP_Problem.inlines.hh \
+ @srcdir@/../src/LP_Problem.cc \
+ @srcdir@/../src/DB_Row.types.hh \
+ @srcdir@/../src/DB_Row.defs.hh \
+ @srcdir@/../src/DB_Row.inlines.hh \
+ @srcdir@/../src/DB_Matrix.types.hh \
+ @srcdir@/../src/DB_Matrix.defs.hh \
+ @srcdir@/../src/DB_Matrix.inlines.hh \
+ @srcdir@/../src/BD_Shape.types.hh \
+ @srcdir@/../src/BD_Shape.defs.hh \
+ @srcdir@/../src/BD_Shape.inlines.hh \
+ @srcdir@/../src/BD_Shape.templates.hh \
+ @srcdir@/../src/BD_Shape.cc \
+ ../interfaces/C/ppl_c.h \
+ @srcdir@/../interfaces/C/ppl_c.cc \
+ @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+ @srcdir@/../interfaces/Prolog/exceptions.hh \
+ @srcdir@/../interfaces/Prolog/track_allocation.hh \
+ @srcdir@/../interfaces/Prolog/ppl_prolog.icc \
+ @srcdir@/../interfaces/Prolog/Ciao/ppl_ciao.cc \
+ @srcdir@/../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
+ @srcdir@/../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
+ @srcdir@/../interfaces/Prolog/SWI/ppl_swiprolog.cc \
+ @srcdir@/../interfaces/Prolog/YAP/ppl_yap.cc \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS = *.hh \
+ *.cc \
+ *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = devref.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = @srcdir@/devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+ PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = CATCH_ALL \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/devref.doxyconf-latex b/doc/devref.doxyconf-latex
new file mode 100644
index 0000000..7aca310
--- /dev/null
+++ b/doc/devref.doxyconf-latex
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ./definitions.dox \
+ ./../src/namespaces.hh \
+ ../src/version.hh \
+ ./../src/version.cc \
+ ./../src/Float.defs.hh \
+ ./../src/Float.inlines.hh \
+ ./../src/Float.cc \
+ ./../src/Checked_Number.types.hh \
+ ./../src/Checked_Number.defs.hh \
+ ./../src/Checked_Number.inlines.hh \
+ ./../src/Checked_Number.cc \
+ ./../src/GMP_Integer.types.hh \
+ ./../src/GMP_Integer.defs.hh \
+ ./../src/GMP_Integer.inlines.hh \
+ ./../src/Coefficient_traits_template.hh \
+ ./../src/Coefficient.types.hh \
+ ./../src/Coefficient.defs.hh \
+ ./../src/Coefficient.inlines.hh \
+ ./../src/Coefficient.cc \
+ ./../src/Limits.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.cc \
+ ./../src/Init.types.hh \
+ ./../src/Init.defs.hh \
+ ./../src/Init.cc \
+ ./../src/initializer.hh \
+ ./../src/globals.defs.hh \
+ ./../src/globals.types.hh \
+ ./../src/globals.inlines.hh \
+ ./../src/globals.cc \
+ ./../src/Topology.hh \
+ ./../src/Row.types.hh \
+ ./../src/Row.defs.hh \
+ ./../src/Row.inlines.hh \
+ ./../src/Row.cc \
+ ./../src/Matrix.types.hh \
+ ./../src/Matrix.defs.hh \
+ ./../src/Matrix.inlines.hh \
+ ./../src/Matrix.cc \
+ ./../src/Linear_Row.types.hh \
+ ./../src/Linear_Row.defs.hh \
+ ./../src/Linear_Row.inlines.hh \
+ ./../src/Linear_Row.cc \
+ ./../src/Linear_System.types.hh \
+ ./../src/Linear_System.defs.hh \
+ ./../src/Linear_System.inlines.hh \
+ ./../src/Linear_System.cc \
+ ./../src/Saturation_Row.types.hh \
+ ./../src/Saturation_Row.defs.hh \
+ ./../src/Saturation_Row.inlines.hh \
+ ./../src/Saturation_Row.cc \
+ ./../src/Saturation_Matrix.types.hh \
+ ./../src/Saturation_Matrix.defs.hh \
+ ./../src/Saturation_Matrix.inlines.hh \
+ ./../src/Saturation_Matrix.cc \
+ ./../src/Variable.types.hh \
+ ./../src/Variable.defs.hh \
+ ./../src/Variable.inlines.hh \
+ ./../src/Variable.cc \
+ ./../src/Linear_Expression.types.hh \
+ ./../src/Linear_Expression.defs.hh \
+ ./../src/Linear_Expression.inlines.hh \
+ ./../src/Linear_Expression.cc \
+ ./../src/Constraint.types.hh \
+ ./../src/Constraint.defs.hh \
+ ./../src/Constraint.inlines.hh \
+ ./../src/Constraint.cc \
+ ./../src/Congruence.types.hh \
+ ./../src/Congruence.defs.hh \
+ ./../src/Congruence.inlines.hh \
+ ./../src/Congruence.cc \
+ ./../src/Generator.types.hh \
+ ./../src/Generator.defs.hh \
+ ./../src/Generator.inlines.hh \
+ ./../src/Generator.cc \
+ ./../src/Grid_Generator.types.hh \
+ ./../src/Grid_Generator.defs.hh \
+ ./../src/Grid_Generator.inlines.hh \
+ ./../src/Grid_Generator.cc \
+ ./../src/Constraint_System.types.hh \
+ ./../src/Constraint_System.defs.hh \
+ ./../src/Constraint_System.inlines.hh \
+ ./../src/Constraint_System.cc \
+ ./../src/Congruence_System.types.hh \
+ ./../src/Congruence_System.defs.hh \
+ ./../src/Congruence_System.inlines.hh \
+ ./../src/Congruence_System.cc \
+ ./../src/Generator_System.defs.hh \
+ ./../src/Generator_System.types.hh \
+ ./../src/Generator_System.inlines.hh \
+ ./../src/Generator_System.cc \
+ ./../src/Grid_Generator_System.defs.hh \
+ ./../src/Grid_Generator_System.types.hh \
+ ./../src/Grid_Generator_System.inlines.hh \
+ ./../src/Grid_Generator_System.cc \
+ ./../src/Scalar_Products.types.hh \
+ ./../src/Scalar_Products.defs.hh \
+ ./../src/Scalar_Products.inlines.hh \
+ ./../src/Scalar_Products.cc \
+ ./../src/Ph_Status.idefs.hh \
+ ./../src/Ph_Status.inlines.hh \
+ ./../src/Ph_Status.cc \
+ ./../src/Polyhedron.types.hh \
+ ./../src/Polyhedron.defs.hh \
+ ./../src/Polyhedron.inlines.hh \
+ ./../src/Polyhedron.templates.hh \
+ ./../src/Polyhedron_public.cc \
+ ./../src/Polyhedron_nonpublic.cc \
+ ./../src/Polyhedron_widenings.cc \
+ ./../src/Polyhedron_chdims.cc \
+ ./../src/conversion.cc \
+ ./../src/minimize.cc \
+ ./../src/simplify.cc \
+ ./../src/Grid.types.hh \
+ ./../src/Grid.defs.hh \
+ ./../src/Grid.inlines.hh \
+ ./../src/Grid.templates.hh \
+ ./../src/Grid_public.cc \
+ ./../src/Grid_nonpublic.cc \
+ ./../src/Grid_widenings.cc \
+ ./../src/Grid_chdims.cc \
+ ./../src/Grid_conversion.cc \
+ ./../src/Grid_simplify.cc \
+ ./../src/Poly_Con_Relation.types.hh \
+ ./../src/Poly_Con_Relation.defs.hh \
+ ./../src/Poly_Con_Relation.inlines.hh \
+ ./../src/Poly_Con_Relation.cc \
+ ./../src/Poly_Gen_Relation.types.hh \
+ ./../src/Poly_Gen_Relation.defs.hh \
+ ./../src/Poly_Gen_Relation.inlines.hh \
+ ./../src/Poly_Gen_Relation.cc \
+ ./../src/Interval.types.hh \
+ ./../src/Interval.defs.hh \
+ ./../src/Interval.inlines.hh \
+ ./../src/Interval.cc \
+ ./../src/Bounding_Box.types.hh \
+ ./../src/Bounding_Box.defs.hh \
+ ./../src/Bounding_Box.inlines.hh \
+ ./../src/Bounding_Box.cc \
+ ./../src/C_Polyhedron.types.hh \
+ ./../src/C_Polyhedron.defs.hh \
+ ./../src/C_Polyhedron.inlines.hh \
+ ./../src/C_Polyhedron.cc \
+ ./../src/NNC_Polyhedron.types.hh \
+ ./../src/NNC_Polyhedron.defs.hh \
+ ./../src/NNC_Polyhedron.inlines.hh \
+ ./../src/NNC_Polyhedron.cc \
+ ./../src/Widening_Function.types.hh \
+ ./../src/Widening_Function.defs.hh \
+ ./../src/Widening_Function.inlines.hh \
+ ./../src/BHRZ03_Certificate.types.hh \
+ ./../src/BHRZ03_Certificate.defs.hh \
+ ./../src/BHRZ03_Certificate.inlines.hh \
+ ./../src/BHRZ03_Certificate.cc \
+ ./../src/H79_Certificate.types.hh \
+ ./../src/H79_Certificate.defs.hh \
+ ./../src/H79_Certificate.inlines.hh \
+ ./../src/H79_Certificate.cc \
+ ./../src/Grid_Certificate.types.hh \
+ ./../src/Grid_Certificate.defs.hh \
+ ./../src/Grid_Certificate.inlines.hh \
+ ./../src/Grid_Certificate.cc \
+ ./../src/Determinate.defs.hh \
+ ./../src/Determinate.inlines.hh \
+ ./../src/Powerset.defs.hh \
+ ./../src/Powerset.inlines.hh \
+ ./../src/Powerset.templates.hh \
+ ./../src/Polyhedra_Powerset.types.hh \
+ ./../src/Polyhedra_Powerset.defs.hh \
+ ./../src/Polyhedra_Powerset.inlines.hh \
+ ./../src/Polyhedra_Powerset.templates.hh \
+ ./../src/Polyhedra_Powerset.cc \
+ ./../src/algorithms.hh \
+ ./../src/LP_Problem.types.hh \
+ ./../src/LP_Problem.defs.hh \
+ ./../src/LP_Problem.inlines.hh \
+ ./../src/LP_Problem.cc \
+ ./../src/DB_Row.types.hh \
+ ./../src/DB_Row.defs.hh \
+ ./../src/DB_Row.inlines.hh \
+ ./../src/DB_Matrix.types.hh \
+ ./../src/DB_Matrix.defs.hh \
+ ./../src/DB_Matrix.inlines.hh \
+ ./../src/BD_Shape.types.hh \
+ ./../src/BD_Shape.defs.hh \
+ ./../src/BD_Shape.inlines.hh \
+ ./../src/BD_Shape.templates.hh \
+ ./../src/BD_Shape.cc \
+ ../interfaces/C/ppl_c.h \
+ ./../interfaces/C/ppl_c.cc \
+ ./../interfaces/Prolog/Prolog_interface.dox \
+ ./../interfaces/Prolog/exceptions.hh \
+ ./../interfaces/Prolog/track_allocation.hh \
+ ./../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/YAP/ppl_yap.cc \
+ ./gpl.dox \
+ ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS = *.hh \
+ *.cc \
+ *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = devref.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = ./devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+ PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = CATCH_ALL \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/devref.doxyconf-latex.in b/doc/devref.doxyconf-latex.in
new file mode 100644
index 0000000..51884ad
--- /dev/null
+++ b/doc/devref.doxyconf-latex.in
@@ -0,0 +1,1446 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = YES
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = YES
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = YES
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = NO
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = YES
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS = Include_Implementation_Details
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = YES
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @srcdir@/definitions.dox \
+ @srcdir@/../src/namespaces.hh \
+ ../src/version.hh \
+ @srcdir@/../src/version.cc \
+ @srcdir@/../src/Float.defs.hh \
+ @srcdir@/../src/Float.inlines.hh \
+ @srcdir@/../src/Float.cc \
+ @srcdir@/../src/Checked_Number.types.hh \
+ @srcdir@/../src/Checked_Number.defs.hh \
+ @srcdir@/../src/Checked_Number.inlines.hh \
+ @srcdir@/../src/Checked_Number.cc \
+ @srcdir@/../src/GMP_Integer.types.hh \
+ @srcdir@/../src/GMP_Integer.defs.hh \
+ @srcdir@/../src/GMP_Integer.inlines.hh \
+ @srcdir@/../src/Coefficient_traits_template.hh \
+ @srcdir@/../src/Coefficient.types.hh \
+ @srcdir@/../src/Coefficient.defs.hh \
+ @srcdir@/../src/Coefficient.inlines.hh \
+ @srcdir@/../src/Coefficient.cc \
+ @srcdir@/../src/Limits.hh \
+ @srcdir@/../src/checked.defs.hh \
+ @srcdir@/../src/checked.inlines.hh \
+ @srcdir@/../src/checked_float.inlines.hh \
+ @srcdir@/../src/checked_int.inlines.hh \
+ @srcdir@/../src/checked_mpq.inlines.hh \
+ @srcdir@/../src/checked_mpz.inlines.hh \
+ @srcdir@/../src/checked.cc \
+ @srcdir@/../src/Init.types.hh \
+ @srcdir@/../src/Init.defs.hh \
+ @srcdir@/../src/Init.cc \
+ @srcdir@/../src/initializer.hh \
+ @srcdir@/../src/globals.defs.hh \
+ @srcdir@/../src/globals.types.hh \
+ @srcdir@/../src/globals.inlines.hh \
+ @srcdir@/../src/globals.cc \
+ @srcdir@/../src/Topology.hh \
+ @srcdir@/../src/Row.types.hh \
+ @srcdir@/../src/Row.defs.hh \
+ @srcdir@/../src/Row.inlines.hh \
+ @srcdir@/../src/Row.cc \
+ @srcdir@/../src/Matrix.types.hh \
+ @srcdir@/../src/Matrix.defs.hh \
+ @srcdir@/../src/Matrix.inlines.hh \
+ @srcdir@/../src/Matrix.cc \
+ @srcdir@/../src/Linear_Row.types.hh \
+ @srcdir@/../src/Linear_Row.defs.hh \
+ @srcdir@/../src/Linear_Row.inlines.hh \
+ @srcdir@/../src/Linear_Row.cc \
+ @srcdir@/../src/Linear_System.types.hh \
+ @srcdir@/../src/Linear_System.defs.hh \
+ @srcdir@/../src/Linear_System.inlines.hh \
+ @srcdir@/../src/Linear_System.cc \
+ @srcdir@/../src/Saturation_Row.types.hh \
+ @srcdir@/../src/Saturation_Row.defs.hh \
+ @srcdir@/../src/Saturation_Row.inlines.hh \
+ @srcdir@/../src/Saturation_Row.cc \
+ @srcdir@/../src/Saturation_Matrix.types.hh \
+ @srcdir@/../src/Saturation_Matrix.defs.hh \
+ @srcdir@/../src/Saturation_Matrix.inlines.hh \
+ @srcdir@/../src/Saturation_Matrix.cc \
+ @srcdir@/../src/Variable.types.hh \
+ @srcdir@/../src/Variable.defs.hh \
+ @srcdir@/../src/Variable.inlines.hh \
+ @srcdir@/../src/Variable.cc \
+ @srcdir@/../src/Linear_Expression.types.hh \
+ @srcdir@/../src/Linear_Expression.defs.hh \
+ @srcdir@/../src/Linear_Expression.inlines.hh \
+ @srcdir@/../src/Linear_Expression.cc \
+ @srcdir@/../src/Constraint.types.hh \
+ @srcdir@/../src/Constraint.defs.hh \
+ @srcdir@/../src/Constraint.inlines.hh \
+ @srcdir@/../src/Constraint.cc \
+ @srcdir@/../src/Congruence.types.hh \
+ @srcdir@/../src/Congruence.defs.hh \
+ @srcdir@/../src/Congruence.inlines.hh \
+ @srcdir@/../src/Congruence.cc \
+ @srcdir@/../src/Generator.types.hh \
+ @srcdir@/../src/Generator.defs.hh \
+ @srcdir@/../src/Generator.inlines.hh \
+ @srcdir@/../src/Generator.cc \
+ @srcdir@/../src/Grid_Generator.types.hh \
+ @srcdir@/../src/Grid_Generator.defs.hh \
+ @srcdir@/../src/Grid_Generator.inlines.hh \
+ @srcdir@/../src/Grid_Generator.cc \
+ @srcdir@/../src/Constraint_System.types.hh \
+ @srcdir@/../src/Constraint_System.defs.hh \
+ @srcdir@/../src/Constraint_System.inlines.hh \
+ @srcdir@/../src/Constraint_System.cc \
+ @srcdir@/../src/Congruence_System.types.hh \
+ @srcdir@/../src/Congruence_System.defs.hh \
+ @srcdir@/../src/Congruence_System.inlines.hh \
+ @srcdir@/../src/Congruence_System.cc \
+ @srcdir@/../src/Generator_System.defs.hh \
+ @srcdir@/../src/Generator_System.types.hh \
+ @srcdir@/../src/Generator_System.inlines.hh \
+ @srcdir@/../src/Generator_System.cc \
+ @srcdir@/../src/Grid_Generator_System.defs.hh \
+ @srcdir@/../src/Grid_Generator_System.types.hh \
+ @srcdir@/../src/Grid_Generator_System.inlines.hh \
+ @srcdir@/../src/Grid_Generator_System.cc \
+ @srcdir@/../src/Scalar_Products.types.hh \
+ @srcdir@/../src/Scalar_Products.defs.hh \
+ @srcdir@/../src/Scalar_Products.inlines.hh \
+ @srcdir@/../src/Scalar_Products.cc \
+ @srcdir@/../src/Ph_Status.idefs.hh \
+ @srcdir@/../src/Ph_Status.inlines.hh \
+ @srcdir@/../src/Ph_Status.cc \
+ @srcdir@/../src/Polyhedron.types.hh \
+ @srcdir@/../src/Polyhedron.defs.hh \
+ @srcdir@/../src/Polyhedron.inlines.hh \
+ @srcdir@/../src/Polyhedron.templates.hh \
+ @srcdir@/../src/Polyhedron_public.cc \
+ @srcdir@/../src/Polyhedron_nonpublic.cc \
+ @srcdir@/../src/Polyhedron_widenings.cc \
+ @srcdir@/../src/Polyhedron_chdims.cc \
+ @srcdir@/../src/conversion.cc \
+ @srcdir@/../src/minimize.cc \
+ @srcdir@/../src/simplify.cc \
+ @srcdir@/../src/Grid.types.hh \
+ @srcdir@/../src/Grid.defs.hh \
+ @srcdir@/../src/Grid.inlines.hh \
+ @srcdir@/../src/Grid.templates.hh \
+ @srcdir@/../src/Grid_public.cc \
+ @srcdir@/../src/Grid_nonpublic.cc \
+ @srcdir@/../src/Grid_widenings.cc \
+ @srcdir@/../src/Grid_chdims.cc \
+ @srcdir@/../src/Grid_conversion.cc \
+ @srcdir@/../src/Grid_simplify.cc \
+ @srcdir@/../src/Poly_Con_Relation.types.hh \
+ @srcdir@/../src/Poly_Con_Relation.defs.hh \
+ @srcdir@/../src/Poly_Con_Relation.inlines.hh \
+ @srcdir@/../src/Poly_Con_Relation.cc \
+ @srcdir@/../src/Poly_Gen_Relation.types.hh \
+ @srcdir@/../src/Poly_Gen_Relation.defs.hh \
+ @srcdir@/../src/Poly_Gen_Relation.inlines.hh \
+ @srcdir@/../src/Poly_Gen_Relation.cc \
+ @srcdir@/../src/Interval.types.hh \
+ @srcdir@/../src/Interval.defs.hh \
+ @srcdir@/../src/Interval.inlines.hh \
+ @srcdir@/../src/Interval.cc \
+ @srcdir@/../src/Bounding_Box.types.hh \
+ @srcdir@/../src/Bounding_Box.defs.hh \
+ @srcdir@/../src/Bounding_Box.inlines.hh \
+ @srcdir@/../src/Bounding_Box.cc \
+ @srcdir@/../src/C_Polyhedron.types.hh \
+ @srcdir@/../src/C_Polyhedron.defs.hh \
+ @srcdir@/../src/C_Polyhedron.inlines.hh \
+ @srcdir@/../src/C_Polyhedron.cc \
+ @srcdir@/../src/NNC_Polyhedron.types.hh \
+ @srcdir@/../src/NNC_Polyhedron.defs.hh \
+ @srcdir@/../src/NNC_Polyhedron.inlines.hh \
+ @srcdir@/../src/NNC_Polyhedron.cc \
+ @srcdir@/../src/Widening_Function.types.hh \
+ @srcdir@/../src/Widening_Function.defs.hh \
+ @srcdir@/../src/Widening_Function.inlines.hh \
+ @srcdir@/../src/BHRZ03_Certificate.types.hh \
+ @srcdir@/../src/BHRZ03_Certificate.defs.hh \
+ @srcdir@/../src/BHRZ03_Certificate.inlines.hh \
+ @srcdir@/../src/BHRZ03_Certificate.cc \
+ @srcdir@/../src/H79_Certificate.types.hh \
+ @srcdir@/../src/H79_Certificate.defs.hh \
+ @srcdir@/../src/H79_Certificate.inlines.hh \
+ @srcdir@/../src/H79_Certificate.cc \
+ @srcdir@/../src/Grid_Certificate.types.hh \
+ @srcdir@/../src/Grid_Certificate.defs.hh \
+ @srcdir@/../src/Grid_Certificate.inlines.hh \
+ @srcdir@/../src/Grid_Certificate.cc \
+ @srcdir@/../src/Determinate.defs.hh \
+ @srcdir@/../src/Determinate.inlines.hh \
+ @srcdir@/../src/Powerset.defs.hh \
+ @srcdir@/../src/Powerset.inlines.hh \
+ @srcdir@/../src/Powerset.templates.hh \
+ @srcdir@/../src/Polyhedra_Powerset.types.hh \
+ @srcdir@/../src/Polyhedra_Powerset.defs.hh \
+ @srcdir@/../src/Polyhedra_Powerset.inlines.hh \
+ @srcdir@/../src/Polyhedra_Powerset.templates.hh \
+ @srcdir@/../src/Polyhedra_Powerset.cc \
+ @srcdir@/../src/algorithms.hh \
+ @srcdir@/../src/LP_Problem.types.hh \
+ @srcdir@/../src/LP_Problem.defs.hh \
+ @srcdir@/../src/LP_Problem.inlines.hh \
+ @srcdir@/../src/LP_Problem.cc \
+ @srcdir@/../src/DB_Row.types.hh \
+ @srcdir@/../src/DB_Row.defs.hh \
+ @srcdir@/../src/DB_Row.inlines.hh \
+ @srcdir@/../src/DB_Matrix.types.hh \
+ @srcdir@/../src/DB_Matrix.defs.hh \
+ @srcdir@/../src/DB_Matrix.inlines.hh \
+ @srcdir@/../src/BD_Shape.types.hh \
+ @srcdir@/../src/BD_Shape.defs.hh \
+ @srcdir@/../src/BD_Shape.inlines.hh \
+ @srcdir@/../src/BD_Shape.templates.hh \
+ @srcdir@/../src/BD_Shape.cc \
+ ../interfaces/C/ppl_c.h \
+ @srcdir@/../interfaces/C/ppl_c.cc \
+ @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+ @srcdir@/../interfaces/Prolog/exceptions.hh \
+ @srcdir@/../interfaces/Prolog/track_allocation.hh \
+ @srcdir@/../interfaces/Prolog/ppl_prolog.icc \
+ @srcdir@/../interfaces/Prolog/Ciao/ppl_ciao.cc \
+ @srcdir@/../interfaces/Prolog/GNU/ppl_gprolog_sd.cc \
+ @srcdir@/../interfaces/Prolog/SICStus/ppl_sicstus_sd.cc \
+ @srcdir@/../interfaces/Prolog/SWI/ppl_swiprolog.cc \
+ @srcdir@/../interfaces/Prolog/YAP/ppl_yap.cc \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS = *.hh \
+ *.cc \
+ *.dox
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = YES
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = YES
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = devref.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = @srcdir@/devref.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS \
+ PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = CATCH_ALL \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = YES
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = YES
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/devref.tex b/doc/devref.tex
new file mode 100644
index 0000000..749320b
--- /dev/null
+++ b/doc/devref.tex
@@ -0,0 +1,135 @@
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% 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 called `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 2 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 are called `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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\nonstopmode
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{alltt}
+\usepackage{doxygen}
+\usepackage{times}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue
+ ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue
+ ]{hyperref}
+\fi
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library Developer's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+Developer'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''.
+ } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+ School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy.} \\
+\ \\
+based on previous work also by \\
+\ \\
+Elisa Ricci \\
+\ \\
+and \\
+\ \\
+Sara Bonini \\
+Andrea Pescetti \\
+Angela Stazzone \\
+Tatiana Zolo
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2006 Roberto Bagnara (bagnara at cs.unipr.it).
+
+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}{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 2
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/doc/fdl.dox b/doc/fdl.dox
new file mode 100644
index 0000000..d978fce
--- /dev/null
+++ b/doc/fdl.dox
@@ -0,0 +1,405 @@
+/*! \page GFDL GNU Free Documentation License
+
+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..01a1c3e
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..d00fa64
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..4a0fe1c
--- /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..42917c5
--- /dev/null
+++ b/doc/gpl.dox
@@ -0,0 +1,461 @@
+/*! \page GPL GNU General Public License
+
+Version 2, June 1991
+
+<P>
+<PRE>
+Copyright (C) 1989, 1991 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>
+
+<H1>Preamble</H1>
+
+<P>
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+</P>
+<P>
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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>
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+</P>
+<P>
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+</P>
+<P>
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+</P>
+<P>
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+</P>
+
+
+<H1>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</H1>
+
+
+<P>
+
+<STRONG>0.</STRONG>
+ This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+<P>
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+<P>
+
+<STRONG>1.</STRONG>
+ You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+<P>
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+<P>
+
+<STRONG>2.</STRONG>
+ You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+<P>
+
+<UL>
+
+<LI><STRONG>a)</STRONG>
+ You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+<P>
+<LI><STRONG>b)</STRONG>
+ You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+<P>
+<LI><STRONG>c)</STRONG>
+ If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+</UL>
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+<P>
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+<P>
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+<P>
+
+<STRONG>3.</STRONG>
+ You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+<!-- we use this doubled UL to get the sub-sections indented, -->
+<!-- while making the bullets as unobvious as possible. -->
+<UL>
+
+<LI><STRONG>a)</STRONG>
+ Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+<P>
+<LI><STRONG>b)</STRONG>
+ Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+<P>
+<LI><STRONG>c)</STRONG>
+ Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+</UL>
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+<P>
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+<P>
+
+<STRONG>4.</STRONG>
+ You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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>5.</STRONG>
+ You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+<P>
+
+<STRONG>6.</STRONG>
+ Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+<P>
+
+<STRONG>7.</STRONG>
+ If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+<P>
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+<P>
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+<P>
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+<P>
+
+<STRONG>8.</STRONG>
+ If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+<P>
+
+<STRONG>9.</STRONG>
+ The Free Software Foundation may publish revised and/or new versions
+of the 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>
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+<P>
+
+
+<STRONG>10.</STRONG>
+ If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+
+
+<P><STRONG>NO WARRANTY</STRONG></P>
+
+<P>
+
+<STRONG>11.</STRONG>
+ BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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>
+
+<STRONG>12.</STRONG>
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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>
+<STRONG>END OF TERMS AND CONDITIONS</STRONG>
+<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
+convey 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 an idea of what it does.</VAR>
+Copyright (C) <VAR>yyyy</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 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,
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307, USA.
+</PRE>
+
+<P>
+Also add information on how to contact you by electronic and paper mail.
+
+</P>
+<P>
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+</P>
+
+<PRE>
+Gnomovision version 69, Copyright (C) <VAR>year</VAR> <VAR>name of author</VAR>
+Gnomovision 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 <CODE>`show w'</CODE> and <CODE>`show c'</CODE> should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than <CODE>`show w'</CODE> and
+<CODE>`show c'</CODE>; they could even be mouse-clicks or menu items--whatever
+suits your program.
+
+</P>
+<P>
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+</P>
+
+<PRE>
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+<VAR>signature of Ty Coon</VAR>, 1 April 1989
+Ty Coon, President of Vice
+</PRE>
+
+<P>
+This 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 Library General
+Public License instead of this License.
+*/
diff --git a/doc/gpl.pdf b/doc/gpl.pdf
new file mode 100644
index 0000000..27b7a06
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..adbcd2a
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..95d0718
--- /dev/null
+++ b/doc/gpl.tex
@@ -0,0 +1,380 @@
+\documentclass[a4paper]{report}
+\begin{document}
+
+\chapter*{GNU General Public License}
+
+Version 2, June 1991\\
+
+\noindent
+ Copyright \copyright\ 1989, 1991 Free Software Foundation, Inc.\\
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+
+\noindent
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+\section*{Preamble}
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is intended
+to guarantee your freedom to share and change free software---to make sure
+the software is free for all its users. This General Public License applies
+to most of the Free Software Foundation's software and to any other program
+whose authors commit to using it. (Some other Free Software Foundation
+software is covered by the GNU Library General Public License instead.) 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 this service 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 make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have. 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.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If
+the software is modified by someone else and passed on, we want its
+recipients to know that what they have is not the original, so that any
+problems introduced by others will not reflect on the original authors'
+reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear that any patent must be
+licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+
+\section*{Terms and conditions for copying, distribution and modification}
+
+\begin{enumerate}
+
+\makeatletter \setcounter{\@listctr}{-1} \makeatother
+
+\item [0.] This License applies to any program or other work which contains a
+ notice placed by the copyright holder saying it may be distributed
+ under the terms of this General Public License. The ``Program'',
+ below, refers to any such program or work, and a ``work based on the
+ Program'' means either the Program or any derivative work under
+ copyright law: that is to say, a work containing the Program or a
+ portion of it, either verbatim or with modifications and/or translated
+ into another language. (Hereinafter, translation is included without
+ limitation in the term ``modification''.) Each licensee is addressed
+ as ``you''.
+
+ Activities other than copying, distribution and modification are not
+ covered by this License; they are outside its scope. The act of
+ running the Program is not restricted, and the output from the Program
+ is covered only if its contents constitute a work based on the Program
+ (independent of having been made by running the Program). Whether that
+ is true depends on what the Program does.
+
+\item [1.] You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+ notices that refer to this License and to the absence of any warranty;
+ and give any other recipients of the Program a copy of this License
+ along with the Program.
+
+ You may charge a fee for the physical act of transferring a copy, and
+ you may at your option offer warranty protection in exchange for a fee.
+
+\item [2.] You may modify your copy or copies of the Program or any portion
+ of it, thus forming a work based on the Program, and copy and
+ distribute such modifications or work under the terms of Section 1
+ above, provided that you also meet all of these conditions:
+
+ \begin{enumerate}
+
+ \item [(a)] You must cause the modified files to carry prominent
+ notices stating that you changed the files and the date of any
+ change.
+
+ \item [(b)] You must cause any work that you distribute or publish,
+ that in whole or in part contains or is derived from the Program
+ or any part thereof, to be licensed as a whole at no charge to
+ all third parties under the terms of this License.
+
+ \item [(c)] If the modified program normally reads commands
+ interactively when run, you must cause it, when started running
+ for such interactive use in the most ordinary way, to print or
+ display an announcement including an appropriate copyright notice
+ and a notice that there is no warranty (or else, saying that you
+ provide a warranty) and that users may redistribute the program
+ under these conditions, and telling the user how to view a copy
+ of this License. (Exception: if the Program itself is
+ interactive but does not normally print such an announcement,
+ your work based on the Program is not required to print an
+ announcement.)
+
+ \end{enumerate}
+
+ These requirements apply to the modified work as a whole. If
+ identifiable sections of that work are not derived from the Program,
+ and can be reasonably considered independent and separate works in
+ themselves, then this License, and its terms, do not apply to those
+ sections when you distribute them as separate works. But when you
+ distribute the same sections as part of a whole which is a work based
+ on the Program, the distribution of the whole must be on the terms of
+ this License, whose permissions for other licensees extend to the
+ entire whole, and thus to each and every part regardless of who wrote
+ it.
+
+ Thus, it is not the intent of this section to claim rights or contest
+ your rights to work written entirely by you; rather, the intent is to
+ exercise the right to control the distribution of derivative or
+ collective works based on the Program.
+
+ In addition, mere aggregation of another work not based on the Program
+ with the Program (or with a work based on the Program) on a volume of a
+ storage or distribution medium does not bring the other work under the
+ scope of this License.
+
+\item [3.] You may copy and distribute the Program (or a work based on it,
+ under Section 2) in object code or executable form under the terms of
+ Sections 1 and 2 above provided that you also do one of the following:
+
+ \begin{enumerate}
+
+ \item [(a)] Accompany it with the complete corresponding
+ machine-readable source code, which must be distributed under the
+ terms of Sections 1 and 2 above on a medium customarily used for
+ software interchange; or,
+
+ \item [(b)] Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ \item [(c)] Accompany it with the information you received as to the
+ offer to distribute corresponding source code. (This alternative
+ is allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+ \end{enumerate}
+
+ The source code for a work means the preferred form of the work for
+ making modifications to it. For an executable work, complete source
+ code means all the source code for all modules it contains, plus any
+ associated interface definition files, plus the scripts used to control
+ compilation and installation of the executable. However, as a special
+ exception, the source code distributed need not include anything that
+ is normally distributed (in either source or binary form) with the
+ major components (compiler, kernel, and so on) of the operating system
+ on which the executable runs, unless that component itself accompanies
+ the executable.
+
+ If distribution of executable or object code is made by offering access
+ to copy from a designated place, then offering equivalent access to
+ copy the source code from the same place counts as distribution of the
+ source code, even though third parties are not compelled to copy the
+ source along with the object code.
+
+\item [4.] You may not copy, modify, sublicense, or distribute the Program
+ except as expressly provided under this License. Any attempt otherwise
+ to copy, modify, sublicense or distribute the Program 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.
+
+\item [5.] You are not required to accept this License, since you have not
+ signed it. However, nothing else grants you permission to modify or
+ distribute the Program or its derivative works. These actions are
+ prohibited by law if you do not accept this License. Therefore, by
+ modifying or distributing the Program (or any work based on the
+ Program), you indicate your acceptance of this License to do so, and
+ all its terms and conditions for copying, distributing or modifying the
+ Program or works based on it.
+
+\item [6.] Each time you redistribute the Program (or any work based on the
+ Program), the recipient automatically receives a license from the
+ original licensor to copy, distribute or modify the Program subject to
+ these terms and conditions. You may not impose any further
+ restrictions on the recipients' exercise of the rights granted herein.
+ You are not responsible for enforcing compliance by third parties to
+ this License.
+
+\item [7.] If, as a consequence of a court judgment or allegation of patent
+ infringement or for any other reason (not limited to patent issues),
+ 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
+ distribute so as to satisfy simultaneously your obligations under this
+ License and any other pertinent obligations, then as a consequence you
+ may not distribute the Program at all. For example, if a patent
+ license would not permit royalty-free redistribution of the Program by
+ all those who receive copies directly or indirectly through you, then
+ the only way you could satisfy both it and this License would be to
+ refrain entirely from distribution of the Program.
+
+ If any portion of this section is held invalid or unenforceable under
+ any particular circumstance, the balance of the section is intended to
+ apply and the section as a whole is intended to apply in other
+ circumstances.
+
+ It is not the purpose of this section to induce you to infringe any
+ patents or other property right claims or to contest validity of any
+ such claims; this section has the sole purpose of protecting the
+ integrity of the free software distribution system, which is
+ implemented by public license practices. Many people have made
+ generous contributions to the wide range of software distributed
+ through that system in reliance on consistent application of that
+ system; it is up to the author/donor to decide if he or she is willing
+ to distribute software through any other system and a licensee cannot
+ impose that choice.
+
+ This section is intended to make thoroughly clear what is believed to
+ be a consequence of the rest of this License.
+
+\item [8.] If the distribution and/or use of the Program is restricted in
+ certain countries either by patents or by copyrighted interfaces, the
+ original copyright holder who places the Program under this License may
+ add an explicit geographical distribution limitation excluding those
+ countries, so that distribution is permitted only in or among countries
+ not thus excluded. In such case, this License incorporates the
+ limitation as if written in the body of this License.
+
+\item [9.] The Free Software Foundation may publish revised and/or new
+ versions of the 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 a version number of this License which applies to it and
+ ``any later version'', you have the option of following the terms and
+ conditions either of that version or of any later version published by
+ the Free Software Foundation. If the Program does not specify a
+ version number of this License, you may choose any version ever
+ published by the Free Software Foundation.
+
+\item [10.] If you wish to incorporate parts of the Program into other free
+ programs whose distribution conditions are different, write to the
+ author to ask for permission. For software which is copyrighted by the
+ Free Software Foundation, write to the Free Software Foundation; we
+ sometimes make exceptions for this. Our decision will be guided by the
+ two goals of preserving the free status of all derivatives of our free
+ software and of promoting the sharing and reuse of software generally.
+
+\begin{center}
+NO WARRANTY
+\end{center}
+
+\bfseries
+
+\item [11.] Because the Program is licensed free of charge, 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.
+
+\item [12.] In no event unless required by applicable law or agreed to in
+ writing will any copyright holder, or any other party who may modify
+ and/or redistribute 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.
+
+\end{enumerate}
+
+\begin{center}
+\textbf{END OF TERMS AND CONDITIONS}
+\end{center}
+
+
+\section*{Appendix: 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 convey 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{verbatim}
+<one line to give the program's name and a brief idea of what it does.>
+Copyright (C) 19yy <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 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,
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+\end{verbatim}
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when
+it starts in an interactive mode:
+
+\begin{verbatim}
+Gnomovision version 69, Copyright (C) 19yy name of author
+Gnomovision 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.
+\end{verbatim}
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a ``copyright disclaimer'' for the program, if
+necessary. Here is a sample; alter the names:
+
+\begin{verbatim}
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+`Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+<signature of Ty Coon>, 1 April 1989
+Ty Coon, President of Vice
+\end{verbatim}
+
+This 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 Library General Public
+License instead of this License.
+
+\end{document}
diff --git a/doc/gpl.txt b/doc/gpl.txt
new file mode 100644
index 0000000..3912109
--- /dev/null
+++ b/doc/gpl.txt
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 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.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) 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
+this service 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 make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. 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.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+ 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
+convey 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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision 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, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This 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 Library General
+Public License instead of this License.
diff --git a/doc/ppl-config.1 b/doc/ppl-config.1
new file mode 100644
index 0000000..8841b90
--- /dev/null
+++ b/doc/ppl-config.1
@@ -0,0 +1,106 @@
+.TH PPL-CONFIG "1" "January 2006" "ppl-config 0.8" "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
+.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://www.cs.unipr.it/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
+Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+.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-user-0.9-html.tar.gz b/doc/ppl-user-0.9-html.tar.gz
new file mode 100644
index 0000000..6a1cf9b
Binary files /dev/null and b/doc/ppl-user-0.9-html.tar.gz differ
diff --git a/doc/ppl-user-0.9.pdf b/doc/ppl-user-0.9.pdf
new file mode 100644
index 0000000..d754838
Binary files /dev/null and b/doc/ppl-user-0.9.pdf differ
diff --git a/doc/ppl-user-0.9.ps.gz b/doc/ppl-user-0.9.ps.gz
new file mode 100644
index 0000000..43a274a
Binary files /dev/null and b/doc/ppl-user-0.9.ps.gz differ
diff --git a/doc/ppl.sty b/doc/ppl.sty
new file mode 100644
index 0000000..8050a21
--- /dev/null
+++ b/doc/ppl.sty
@@ -0,0 +1,178 @@
+%% LaTeX package providing macros for typesetting the PPL manuals.
+%% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%%
+%% This file is part of the Parma Polyhedra Library (PPL).
+%%
+%% The PPL is free software; you can 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.
+%%
+%% The PPL is distributed in the hope that it will be useful, but WITHOUT
+%% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+%% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+%% for more details.
+%%
+%% You should have received a copy of the GNU General Public License
+%% along with this program; if not, write to the Free Software Foundation,
+%% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%%
+%% For the most up-to-date information see the Parma Polyhedra Library
+%% site: http://www.cs.unipr.it/ppl/ .
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{ppl}
+\RequirePackage{amsmath}
+\RequirePackage{amssymb}
+
+%% 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}}}
+
+% 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}}
diff --git a/doc/ppl_lcdd.1 b/doc/ppl_lcdd.1
new file mode 100644
index 0000000..ee8267a
--- /dev/null
+++ b/doc/ppl_lcdd.1
@@ -0,0 +1,50 @@
+.TH PPL_LCDD "1" "January 2006" "ppl_lcdd 0.8" "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
+.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\-V\fR, \fB\-\-version\fR
+prints version information 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\-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://www.cs.unipr.it/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
+Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+.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"
+ppl-config (1)
diff --git a/doc/ppl_lpsol.1 b/doc/ppl_lpsol.1
new file mode 100644
index 0000000..ca8fa44
--- /dev/null
+++ b/doc/ppl_lpsol.1
@@ -0,0 +1,60 @@
+.TH PPL_LPSOL "1" "January 2006" "ppl_lpsol 0.8" "User Commands"
+.SH NAME
+ppl_lpsol \- a PPL-based linear programming problem solver
+.SH SYNOPSIS
+.B ppl_lpsol
+[\fIOPTION\fR]... [\fIFILE\fR]...
+.SH DESCRIPTION
+.TP
+\fB\-c\fR, \fB\-\-check\fR
+checks plausibility of the optimum value found
+.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\-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\-V\fR, \fB\-\-version\fR
+prints version information 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\-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\-\-verbose\fR
+outputs also the constraints and objective function
+.SH AVAILABILITY
+The latest version of the Parma Polyhedra Library and all the documentation
+is available at
+
+ \fBhttp://www.cs.unipr.it/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 COPYRIGHT
+Copyright (C) 2001\-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+.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"
+ppl-config (1)
diff --git a/doc/user.doxyconf-html b/doc/user.doxyconf-html
new file mode 100644
index 0000000..040450d
--- /dev/null
+++ b/doc/user.doxyconf-html
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = YES
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = NO
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ./definitions.dox \
+ ../src/ppl.hh \
+ ../interfaces/C/ppl_c.h \
+ ./../interfaces/Prolog/Prolog_interface.dox \
+ ./gpl.dox \
+ ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = user.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = ./user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = PPL_TYPE_DECLARATION \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/user.doxyconf-html.in b/doc/user.doxyconf-html.in
new file mode 100644
index 0000000..86d92a0
--- /dev/null
+++ b/doc/user.doxyconf-html.in
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = YES
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = NO
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @srcdir@/definitions.dox \
+ ../src/ppl.hh \
+ ../interfaces/C/ppl_c.h \
+ @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = user.html-dir
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = @srcdir@/user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = PPL_TYPE_DECLARATION \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/user.doxyconf-latex b/doc/user.doxyconf-latex
new file mode 100644
index 0000000..914fb15
--- /dev/null
+++ b/doc/user.doxyconf-latex
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = 0.9
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = YES
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = NO
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = ./definitions.dox \
+ ../src/ppl.hh \
+ ../interfaces/C/ppl_c.h \
+ ./../interfaces/Prolog/Prolog_interface.dox \
+ ./gpl.dox \
+ ./fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = user.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = ./user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = PPL_TYPE_DECLARATION \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/user.doxyconf-latex.in b/doc/user.doxyconf-latex.in
new file mode 100644
index 0000000..eb06c0f
--- /dev/null
+++ b/doc/user.doxyconf-latex.in
@@ -0,0 +1,1243 @@
+# Doxyfile 1.4.6
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+# TAG = value [value, ...]
+# For lists items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
+# by quotes) that should identify the project.
+
+PROJECT_NAME = PPL
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number.
+# This could be handy for archiving the generated documentation or
+# if some version control system is used.
+
+PROJECT_NUMBER = @VERSION@
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
+# base path where the generated documentation will be put.
+# If a relative path is entered, it will be relative to the location
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY = .
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
+# 4096 sub-directories (in 2 levels) under the output directory of each output
+# format and will distribute the generated files over these directories.
+# Enabling this option can be useful when feeding doxygen a huge amount of
+# source files, where putting all generated files in the same directory would
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# The default language is English, other supported languages are:
+# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish,
+# Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese,
+# Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian,
+# Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
+# Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE = English
+
+# This tag can be used to specify the encoding used in the generated output.
+# The encoding is not always determined by the language that is chosen,
+# but also whether or not the output is meant for Windows or non-Windows users.
+# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
+# forces the Windows encoding (this is the default for the Windows binary),
+# whereas setting the tag to NO uses a Unix-style encoding (the default for
+# all platforms other than Windows).
+
+USE_WINDOWS_ENCODING = NO
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
+# include brief member descriptions after the members that are listed in
+# the file and class documentation (similar to JavaDoc).
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
+# the brief description of a member or function before the detailed description.
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator
+# that is used to form the text in various listings. Each string
+# in this list, if found as the leading text of the brief description, will be
+# stripped from the text and the result after processing the whole list, is
+# used as the annotated text. Otherwise, the brief description is used as-is.
+# If left blank, the following values are used ("$name" is automatically
+# replaced with the name of the entity): "The $name class" "The $name widget"
+# "The $name file" "is" "provides" "specifies" "contains"
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF =
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# Doxygen will generate a detailed section even if there is only a brief
+# description.
+
+ALWAYS_DETAILED_SEC = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
+# path before files name in the file list and in the header files. If set
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
+# can be used to strip a user-defined part of the path. Stripping is
+# only done if one of the specified strings matches the left-hand part of
+# the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the
+# path to strip.
+
+STRIP_FROM_PATH =
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
+# the path mentioned in the documentation of a class, which tells
+# the reader which header file to include in order to use a class.
+# If left blank only the name of the header file containing the class
+# definition is used. Otherwise one should specify the include paths that
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH =
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
+# (but less readable) file names. This can be useful is your file systems
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
+# will interpret the first line (until the first dot) of a JavaDoc-style
+# comment as the brief description. If set to NO, the JavaDoc
+# comments will behave just like the Qt-style comments (thus requiring an
+# explicit @brief command for a brief description.
+
+JAVADOC_AUTOBRIEF = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
+# treat a multi-line C++ special comment block (i.e. a block of //! or ///
+# comments) as a brief description. This used to be the default behaviour.
+# The new default is to treat a multi-line C++ comment block as a detailed
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member
+# documentation.
+
+DETAILS_AT_TOP = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
+# member inherits the documentation from any documented member that it
+# re-implements.
+
+INHERIT_DOCS = NO
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce
+# a new page for each member. If set to NO, the documentation of a member will
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab.
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE = 8
+
+# This tag can be used to specify a number of aliases that acts
+# as commands in the documentation. An alias has the form "name=value".
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to
+# put the command \sideeffect (or @sideeffect) in the documentation, which
+# will result in a user-defined paragraph with heading "Side Effects:".
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES =
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C
+# sources only. Doxygen will then generate output that is more tailored for C.
+# For instance, some of the names that are used will be different. The list
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
+# sources only. Doxygen will then generate output that is more tailored for Java.
+# For instance, namespaces will be presented as packages, qualified scopes
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
+# include (a tag file for) the STL sources as input, then you should
+# set this tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
+# func(std::string) {}). This also make the inheritance and collaboration
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES, then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
+# the same type (for instance a group of public functions) to be put as a
+# subgroup of that type (e.g. under the Public Functions section). Set it to
+# NO to prevent subgrouping. Alternatively, this can be done per class using
+# the \nosubgrouping command.
+
+SUBGROUPING = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
+# documentation are documented, even if no documentation was available.
+# Private class members and static file members will be hidden unless
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
+# will be included in the documentation.
+
+EXTRACT_PRIVATE = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file
+# will be included in the documentation.
+
+EXTRACT_STATIC = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
+# defined locally in source files will be included in the documentation.
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES = YES
+
+# This flag is only useful for Objective-C code. When set to YES local
+# methods, which are defined in the implementation section but not in
+# the interface are included in the documentation.
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
+# undocumented members of documented classes, files or namespaces.
+# If set to NO (the default) these members will be included in the
+# various overviews, but no documentation section is generated.
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS = YES
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy.
+# If set to NO (the default) these classes will be included in the various
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES = YES
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
+# friend (class|struct|union) declarations.
+# If set to NO (the default) these declarations will be included in the
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS = YES
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
+# documentation blocks found inside the body of a function.
+# If set to NO (the default) these blocks will be appended to the
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS = YES
+
+# The INTERNAL_DOCS tag determines if documentation
+# that is typed after a \internal command is included. If the tag is set
+# to NO (the default) then the documentation will be excluded.
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
+# file names in lower-case letters. If set to YES upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES = YES
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
+# will show members with their full class and namespace scopes in the
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
+# will put a list of the files that are included by a file in the documentation
+# of that file.
+
+SHOW_INCLUDE_FILES = NO
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
+# is inserted in the documentation for inline members.
+
+INLINE_INFO = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
+# will sort the (detailed) documentation of file and class members
+# alphabetically by member name. If set to NO the members will appear in
+# declaration order.
+
+SORT_MEMBER_DOCS = NO
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
+# brief documentation of file, namespace and class members alphabetically
+# by member name. If set to NO (the default) the members will appear in
+# declaration order.
+
+SORT_BRIEF_DOCS = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
+# sorted by fully-qualified names, including namespaces. If set to
+# NO (the default), the class list will be sorted only by class name,
+# not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or
+# disable (NO) the todo list. This list is created by putting \todo
+# commands in the documentation.
+
+GENERATE_TODOLIST = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or
+# disable (NO) the test list. This list is created by putting \test
+# commands in the documentation.
+
+GENERATE_TESTLIST = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or
+# disable (NO) the bug list. This list is created by putting \bug
+# commands in the documentation.
+
+GENERATE_BUGLIST = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
+# disable (NO) the deprecated list. This list is created by putting
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS =
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
+# the initial value of a variable or define consists of for it to appear in
+# the documentation. If the initializer consists of more lines than specified
+# here it will be hidden. Use a value of 0 to hide initializers completely.
+# The appearance of the initializer of individual variables and defines in the
+# documentation can be controlled using \showinitializer or \hideinitializer
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES = 5
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
+# at the bottom of the documentation of classes and structs. If set to YES the
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES = NO
+
+# If the sources in your project are distributed over multiple directories
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from the
+# version control system). Doxygen will invoke the program by executing (via
+# popen()) the command <command> <input-file>, where <command> is the value of
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file
+# provided by doxygen. Whatever the program writes to standard output
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER =
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET = YES
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated by doxygen. Possible values are YES and NO. If left blank
+# NO is used.
+
+WARNINGS = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED = NO
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some
+# parameters in a documented function, or documenting parameters that
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for
+# functions that are documented, but have no documentation for their parameters
+# or return value. If set to NO (the default) doxygen will only warn about
+# wrong or incomplete parameter documentation, but not about the absence of
+# documentation.
+
+WARN_NO_PARAMDOC = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that
+# doxygen can produce. The string should contain the $file, $line, and $text
+# tags, which will be replaced by the file and line number from which the
+# warning originated and the warning text. Optionally the format may contain
+# $version, which will be replaced by the version of the file (if it could
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning
+# and error messages should be written. If left blank the output is written
+# to stderr.
+
+WARN_LOGFILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain
+# documented source files. You may enter file names like "myfile.cpp" or
+# directories like "/usr/src/myproject". Separate the files or directories
+# with spaces.
+
+INPUT = @srcdir@/definitions.dox \
+ ../src/ppl.hh \
+ ../interfaces/C/ppl_c.h \
+ @srcdir@/../interfaces/Prolog/Prolog_interface.dox \
+ @srcdir@/gpl.dox \
+ @srcdir@/fdl.dox
+
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank the following patterns are tested:
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS =
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories
+# should be searched for input files as well. Possible values are YES and NO.
+# If left blank NO is used.
+
+RECURSIVE = NO
+
+# The EXCLUDE tag can be used to specify files and/or directories that should
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE =
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or
+# directories that are symbolic links (a Unix filesystem feature) are excluded
+# from the input.
+
+EXCLUDE_SYMLINKS = NO
+
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories. Note that the wildcards are matched
+# against the file with absolute path, so to exclude all test directories
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS =
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or
+# directories that contain example code fragments that are included (see
+# the \include command).
+
+EXAMPLE_PATH =
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
+# and *.h) to filter out the source-files in the directories. If left
+# blank all files are included.
+
+EXAMPLE_PATTERNS =
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude
+# commands irrespective of the value of the RECURSIVE tag.
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or
+# directories that contain image that are included in the documentation (see
+# the \image command).
+
+IMAGE_PATH =
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command <filter> <input-file>, where <filter>
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
+# input file. Doxygen will then use the output that the filter program writes
+# to standard output. If FILTER_PATTERNS is specified, this tag will be
+# ignored.
+
+INPUT_FILTER =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form:
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER
+# is applied to all files.
+
+FILTER_PATTERNS =
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will be used to filter the input files when producing source
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will
+# be generated. Documented entities will be cross-referenced with these sources.
+# Note: To get rid of all source code in the generated output, make sure also
+# VERBATIM_HEADERS is set to NO.
+
+SOURCE_BROWSER = NO
+
+# Setting the INLINE_SOURCES tag to YES will include the body
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
+# doxygen to hide any special comment blocks from generated source code
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS = NO
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default)
+# then for each documented function all documented
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = NO
+
+# If the REFERENCES_RELATION tag is set to YES (the default)
+# then for each documented function all documented entities
+# called/used by that function will be listed.
+
+REFERENCES_RELATION = NO
+
+# If the USE_HTAGS tag is set to YES then the references to source code
+# will point to the HTML generated by the htags(1) tool instead of doxygen
+# built-in source browser. The htags tool is part of GNU's global source
+# tagging system (see http://www.gnu.org/software/global/global.html). You
+# will need version 4.8.6 or higher.
+
+USE_HTAGS = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
+# will generate a verbatim copy of the header file for each class for
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
+# of all compounds will be generated. Enable this if the project
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX = 5
+
+# In case all classes in a project start with a common prefix, all
+# classes will be put under the same header in the alphabetical index.
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX =
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
+# generate HTML output.
+
+GENERATE_HTML = NO
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard header.
+
+HTML_HEADER =
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for
+# each generated HTML page. If it is left blank doxygen will generate a
+# standard footer.
+
+HTML_FOOTER =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
+# style sheet that is used by each HTML page. It can be used to
+# fine-tune the look of the HTML output. If the tag is left blank doxygen
+# will generate a default style sheet. Note that doxygen will try to copy
+# the style sheet file to the HTML output directory, so don't put your own
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET =
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
+# files or namespaces will be aligned in HTML using tables. If set to
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files
+# will be generated that can be used as input for tools like the
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
+# be used to specify the file name of the resulting .chm file. You
+# can add a path in front of the file if the result should not be
+# written to the html output directory.
+
+CHM_FILE =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
+# be used to specify the location (absolute path including file name) of
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION =
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
+# controls if a separate .chi index file is generated (YES) or that
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
+# controls whether a binary table of contents is generated (YES) or a
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
+# top of each HTML page. The value NO (the default) enables the index and
+# the value YES disables it.
+
+DISABLE_INDEX = NO
+
+# This tag can be used to set the number of enum values (range [1..20])
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that
+# is generated for HTML Help). For this to work a browser that supports
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
+# used to set the initial width (in pixels) of the frame in which the tree
+# is shown.
+
+TREEVIEW_WIDTH = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
+# generate Latex output.
+
+GENERATE_LATEX = YES
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT = user.latex-dir
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
+# generate index for LaTeX. If left blank `makeindex' will be used as the
+# default command name.
+
+MAKEINDEX_CMD_NAME = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
+# LaTeX documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_LATEX = YES
+
+# The PAPER_TYPE tag can be used to set the paper type that is used
+# by the printer. Possible values are: a4, a4wide, letter, legal and
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES = ppl
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
+# the generated latex document. The header should contain everything until
+# the first chapter. If it is left blank doxygen will generate a
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER = @srcdir@/user.tex
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will
+# contain links (just like the HTML output) instead of page references
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS = YES
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
+# plain latex in the generated Makefile. Set this option to YES to get a
+# higher quality PDF documentation.
+
+USE_PDFLATEX = YES
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
+# command to the generated LaTeX files. This will instruct LaTeX to keep
+# running if errors occur, instead of asking the user for help.
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE = YES
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not
+# include the index chapters (such as File Index, Compound Index, etc.)
+# in the output.
+
+LATEX_HIDE_INDICES = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
+# The RTF output is optimized for Word 97 and may not look very pretty with
+# other RTF readers or editors.
+
+GENERATE_RTF = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
+# RTF documents. This may be useful for small projects and may help to
+# save some trees in general.
+
+COMPACT_RTF = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
+# will contain hyperlink fields. The RTF file will
+# contain links (just like the HTML output) instead of page references.
+# This makes the output suitable for online browsing using WORD or other
+# programs which support those fields.
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS = YES
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
+# config file, i.e. a series of assignments. You only have to provide
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE =
+
+# Set optional variables used in the generation of an rtf document.
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE =
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
+# generate man pages
+
+GENERATE_MAN = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT = man
+
+# The MAN_EXTENSION tag determines the extension that is added to
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
+# then it will generate one additional man file for each entity
+# documented in the real man page(s). These additional files
+# only source the real man page, but without them the man command
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will
+# generate an XML file that captures the structure of
+# the code including all documentation.
+
+GENERATE_XML = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_SCHEMA =
+
+# The XML_DTD tag can be used to specify an XML DTD,
+# which can be used by a validating XML parser to check the
+# syntax of the XML files.
+
+XML_DTD =
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
+# dump the program listings (including syntax highlighting
+# and cross-referencing information) to the XML output. Note that
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
+# generate an AutoGen Definitions (see autogen.sf.net) file
+# that captures the structure of the code including all
+# documentation. Note that this feature is still experimental
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will
+# generate a Perl module file that captures the structure of
+# the code including all documentation. Note that this
+# feature is still experimental and incomplete at the
+# moment.
+
+GENERATE_PERLMOD = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
+# nicely formatted so it can be parsed by a human reader. This is useful
+# if you want to understand what is going on. On the other hand, if this
+# tag is set to NO the size of the Perl module output will be much smaller
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY = YES
+
+# The names of the make variables in the generated doxyrules.make file
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
+# This is useful so different doxyrules.make files included by the same
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX =
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
+# evaluate all C-preprocessor directives found in the sources and include
+# files.
+
+ENABLE_PREPROCESSING = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
+# names in the source code. If set to NO (the default) only conditional
+# compilation will be performed. Macro expansion can be done in a controlled
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION = YES
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
+# then the macro expansion is limited to the macros specified with the
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF = YES
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by
+# the preprocessor.
+
+INCLUDE_PATH =
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will
+# be used.
+
+INCLUDE_FILE_PATTERNS =
+
+# The PREDEFINED tag can be used to specify one or more macro names that
+# are defined before the preprocessor is started (similar to the -D option of
+# gcc). The argument of the tag is a list of macros of the form: name
+# or name=definition (no spaces). If the definition and the = are
+# omitted =1 is assumed. To prevent a macro definition from being
+# undefined via #undef or recursively expanded use the := operator
+# instead of the = operator.
+
+PREDEFINED = PPL_PROTO(protos):=protos
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
+# this tag can be used to specify a list of macro names that should be expanded.
+# The macro definition that is found in the sources will be used.
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED = PPL_TYPE_DECLARATION \
+ PPL_OUTPUT_DECLARATIONS
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
+# doxygen's preprocessor will remove all function-like macros that are alone
+# on a line, have an all uppercase name, and do not end with a semicolon. Such
+# function macros are typically used for boiler-plate code, and will confuse
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles.
+# Optionally an initial location of the external documentation
+# can be added for each tagfile. The format of a tag file without
+# this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where "loc1" and "loc2" can be relative or absolute paths or
+# URLs. If a location is present for each tag, the installdox tool
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES =
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE =
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed
+# in the class index. If set to NO only the inherited external classes
+# will be listed.
+
+ALLEXTERNALS = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will
+# be listed.
+
+EXTERNAL_GROUPS = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH = @PERL@
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base
+# or super classes. Setting the tag to NO turns the diagrams off. Note that
+# this option is superseded by the HAVE_DOT option below. This is only a
+# fallback. It is recommended to install and use dot, since it yields more
+# powerful graphs.
+
+CLASS_DIAGRAMS = NO
+
+# If set to YES, the inheritance and collaboration graphs will hide
+# inheritance and usage relations if the target is undocumented
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz, a graph visualization
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT = YES
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect inheritance relations. Setting this tag to YES will force the
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH = NO
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for each documented class showing the direct and
+# indirect implementation dependencies (inheritance, containment, and
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH = NO
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
+# Language.
+
+UML_LOOK = NO
+
+# If set to YES, the inheritance and collaboration graphs will show the
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
+# tags are set to YES then doxygen will generate a graph for each documented
+# file showing the direct and indirect include dependencies of the file with
+# other documented files.
+
+INCLUDE_GRAPH = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
+# documented header file showing the documented files that directly or
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH = NO
+
+# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
+# generate a call dependency graph for every global function or class method.
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command.
+
+CALL_GRAPH = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY = NO
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES
+# then doxygen will show the dependencies a directory has on other directories
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH = NO
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH =
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the
+# \dotfile command).
+
+DOTFILE_DIRS =
+
+# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_WIDTH = 1024
+
+# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
+# (in pixels) of the graphs generated by dot. If a graph becomes larger than
+# this value, doxygen will try to truncate the graph, so that it fits within
+# the specified constraint. Beware that most browsers cannot cope with very
+# large images.
+
+MAX_DOT_GRAPH_HEIGHT = 1024
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
+# graphs generated by dot. A depth value of 3 means that only nodes reachable
+# from the root by following a path via at most 3 edges will be shown. Nodes
+# that lay further from the root node will be omitted. Note that setting this
+# option to 1 or 2 may greatly reduce the computation time needed for large
+# code bases. Also note that a graph may be further truncated if the graph's
+# image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH
+# and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default),
+# the graph is not depth-constrained.
+
+MAX_DOT_GRAPH_DEPTH = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, which results in a white background.
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+
+DOT_TRANSPARENT = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10)
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
+# generate a legend page explaining the meaning of the various boxes and
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
+# remove the intermediate dot files that are used to generate
+# the various graphs.
+
+DOT_CLEANUP = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE = NO
diff --git a/doc/user.tex b/doc/user.tex
new file mode 100644
index 0000000..be0b302
--- /dev/null
+++ b/doc/user.tex
@@ -0,0 +1,135 @@
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% 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 called `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 2 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 are called `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.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/ppl/ .
+
+\documentclass[a4paper]{article}
+\nonstopmode
+\usepackage{a4wide}
+\usepackage{makeidx}
+\usepackage{fancyhdr}
+\usepackage{graphicx}
+\usepackage{float}
+\usepackage{alltt}
+\usepackage{doxygen}
+\usepackage{times}
+\ifx\pdfoutput\undefined
+\usepackage[ps2pdf,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue
+ ]{hyperref}
+\usepackage{pspicture}
+\else
+\usepackage[pdftex,
+ pagebackref=true,
+ colorlinks=true,
+ linkcolor=blue
+ ]{hyperref}
+\fi
+\usepackage{ppl}
+\makeindex
+\setcounter{tocdepth}{1}
+\renewcommand{\footrulewidth}{0.4pt}
+
+\rfoot[\fancyplain{}{\scriptsize The Parma Polyhedra Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}]{}
+\lfoot[]{\fancyplain{}{\scriptsize The Parma Polyhedra Library User's Manual (version $projectnumber). See \url{http://www.cs.unipr.it/ppl/} for more information.}}
+
+\begin{document}
+\title{
+The Parma Polyhedra Library \\
+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''.
+ } \\
+(version $projectnumber)
+}
+\author{
+Roberto Bagnara\thanks{bagnara at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy.} \\
+Patricia M. Hill\thanks{hill at comp.leeds.ac.uk,
+ School of Computing, University of Leeds, U.K.} \\
+Enea Zaffanella\thanks{zaffanella at cs.unipr.it,
+ Department of Mathematics, University of Parma, Italy.} \\
+\ \\
+based on previous work also by \\
+\ \\
+Elisa Ricci \\
+\ \\
+and \\
+\ \\
+Sara Bonini \\
+Andrea Pescetti \\
+Angela Stazzone \\
+Tatiana Zolo
+}
+\maketitle
+
+\newpage
+Copyright \copyright\ 2001--2006 Roberto Bagnara (bagnara at cs.unipr.it).
+
+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}{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 2
+of the License, or (at your option) any later version.
+A copy of the license is included in the section entitled
+``\hyperlink{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.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site:
+\begin{center}
+\href{http://www.cs.unipr.it/ppl/}{\tt http://www.cs.unipr.it/ppl/}
+\end{center}
+
+\pagenumbering{roman}
+\tableofcontents
+\pagenumbering{arabic}
diff --git a/install-sh b/install-sh
new file mode 100755
index 0000000..0ae12c0
--- /dev/null
+++ b/install-sh
@@ -0,0 +1,401 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2005-11-07.23
+
+# 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. It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+posix_glob=
+posix_mkdir=
+
+# Symbolic mode for testing mkdir with directories.
+# It is the same as 755, but also tests that "u+" works.
+test_mode=u=rwx,g=rx,o=rx,u+wx
+
+# Desired mode of installed file.
+mode=0755
+
+# Desired mode of newly created intermediate directories.
+# It is empty if not known yet.
+intermediate_mode=
+
+chmodcmd=$chmodprog
+chowncmd=
+chgrpcmd=
+stripcmd=
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=
+dst=
+dir_arg=
+dstarg=
+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:
+-c (ignored)
+-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.
+--help display this help and exit.
+--version display version info and exit.
+
+Environment variables override the default commands:
+ CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
+"
+
+while test -n "$1"; do
+ case $1 in
+ -c) shift
+ continue;;
+
+ -d) dir_arg=true
+ shift
+ continue;;
+
+ -g) chgrpcmd="$chgrpprog $2"
+ shift
+ shift
+ continue;;
+
+ --help) echo "$usage"; exit $?;;
+
+ -m) mode=$2
+ shift
+ shift
+ continue;;
+
+ -o) chowncmd="$chownprog $2"
+ shift
+ shift
+ continue;;
+
+ -s) stripcmd=$stripprog
+ shift
+ continue;;
+
+ -t) dstarg=$2
+ shift
+ shift
+ continue;;
+
+ -T) no_target_directory=true
+ shift
+ continue;;
+
+ --version) echo "$0 $scriptversion"; exit $?;;
+
+ *) # When -d is used, all remaining arguments are directories to create.
+ # When -t is used, the destination is already specified.
+ test -n "$dir_arg$dstarg" && break
+ # Otherwise, the last argument is the destination. Remove it from $@.
+ for arg
+ do
+ if test -n "$dstarg"; then
+ # $@ is not empty: it contains at least $arg.
+ set fnord "$@" "$dstarg"
+ shift # fnord
+ fi
+ shift # arg
+ dstarg=$arg
+ done
+ break;;
+ esac
+done
+
+if test -z "$1"; 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
+
+test -n "$dir_arg" || trap '(exit $?); exit' 1 2 13 15
+
+for src
+do
+ # Protect names starting with `-'.
+ 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 "$dstarg"; then
+ echo "$0: no destination specified." >&2
+ exit 1
+ fi
+
+ dst=$dstarg
+ # Protect names starting with `-'.
+ case $dst in
+ -*) dst=./$dst ;;
+ esac
+
+ # 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: $dstarg: 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
+ '')
+ posix_mkdir=false
+ if $mkdirprog -m $test_mode -p -- / >/dev/null 2>&1; then
+ posix_mkdir=true
+ else
+ # Remove any dirs left behind by ancient mkdir implementations.
+ rmdir ./-m "$test_mode" ./-p ./-- 2>/dev/null
+ fi ;;
+ esac
+
+ if
+ $posix_mkdir && {
+
+ # With -d, create the new directory with the user-specified mode.
+ # Otherwise, create it using the same intermediate mode that
+ # mkdir -p would use when creating intermediate directories.
+ # POSIX says that this mode is "$(umask -S),u+wx", so use that
+ # if umask -S works.
+
+ if test -n "$dir_arg"; then
+ mkdir_mode=$mode
+ else
+ case $intermediate_mode in
+ '')
+ if umask_S=`(umask -S) 2>/dev/null`; then
+ intermediate_mode=$umask_S,u+wx
+ else
+ intermediate_mode=$test_mode
+ fi ;;
+ esac
+ mkdir_mode=$intermediate_mode
+ fi
+
+ $mkdirprog -m "$mkdir_mode" -p -- "$dstdir"
+ }
+ then :
+ else
+
+ # 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
+ /*) pathcomp=/ ;;
+ -*) pathcomp=./ ;;
+ *) pathcomp= ;;
+ esac
+
+ case $posix_glob in
+ '')
+ if (set -f) 2>/dev/null; then
+ posix_glob=true
+ else
+ posix_glob=false
+ fi ;;
+ esac
+
+ oIFS=$IFS
+ IFS=/
+ $posix_glob && set -f
+ set fnord $dstdir
+ shift
+ $posix_glob && set +f
+ IFS=$oIFS
+
+ for d
+ do
+ test "x$d" = x && continue
+
+ pathcomp=$pathcomp$d
+ if test ! -d "$pathcomp"; then
+ $mkdirprog "$pathcomp"
+ # Don't fail if two instances are running concurrently.
+ test -d "$pathcomp" || exit 1
+ fi
+ pathcomp=$pathcomp/
+ done
+ obsolete_mkdir_used=true
+ 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.
+ $doit $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"; } &&
+
+ # Now 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.
+ {
+ if test -f "$dst"; then
+ $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
+ }
+ else
+ :
+ fi
+ } &&
+
+ # Now rename the file to the real destination.
+ $doit $mvcmd "$dsttmp" "$dst"
+ }
+ } || 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-end: "$"
+# End:
diff --git a/instchk.hh b/instchk.hh
new file mode 100644
index 0000000..bd4ad1e
--- /dev/null
+++ b/instchk.hh
@@ -0,0 +1,81 @@
+/* Fake declarations to test the validity of the arguments of the
+ --enabled-instantiations option defined in configure.ac.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+class Polyhedron {
+public:
+ static bool valid_instantiation() {
+ return true;
+ }
+ static bool valid_Polyhedra_Powerset_argument() {
+ return true;
+ }
+};
+
+template <typename T>
+bool
+valid_BD_Shape_argument(void);
+
+template <>
+bool
+valid_BD_Shape_argument<char>() {
+ return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<int>() {
+ return true;
+}
+
+template <>
+bool
+valid_BD_Shape_argument<int8_t>() {
+ return true;
+}
+
+template <typename T>
+class BD_Shape {
+public:
+ static bool valid_instantiation() {
+ return valid_BD_Shape_argument<T>();
+ }
+};
+
+template <typename PH>
+class Polyhedra_Powerset {
+public:
+ static bool valid_instantiation() {
+ return PH::valid_Polyhedra_Powerset_argument();
+ }
+};
+
+} // namespace Parma_Polyhedra_Library
diff --git a/interfaces/C/Makefile.am b/interfaces/C/Makefile.am
new file mode 100644
index 0000000..2012751
--- /dev/null
+++ b/interfaces/C/Makefile.am
@@ -0,0 +1,70 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = ppl_c.h.in ppl_c.cc
+
+if BUILD_C_INTERFACE
+
+# 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:0
+
+LIBPPL_C_LT_CURRENT = 1
+LIBPPL_C_LT_REVISION = 0
+LIBPPL_C_LT_AGE = 1
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+ at extra_includes@
+
+lib_LTLIBRARIES = libppl_c.la
+libppl_c_la_SOURCES = ppl_c.cc
+libppl_c_la_LDFLAGS = \
+-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+include_HEADERS = ppl_c.h
+
+endif BUILD_C_INTERFACE
diff --git a/interfaces/C/Makefile.in b/interfaces/C/Makefile.in
new file mode 100644
index 0000000..71db98a
--- /dev/null
+++ b/interfaces/C/Makefile.in
@@ -0,0 +1,644 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(am__include_HEADERS_DIST) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/ppl_c.h.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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.h
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libppl_c_la_LIBADD =
+am__libppl_c_la_SOURCES_DIST = ppl_c.cc
+ at BUILD_C_INTERFACE_TRUE@am_libppl_c_la_OBJECTS = ppl_c.lo
+libppl_c_la_OBJECTS = $(am_libppl_c_la_OBJECTS)
+ at BUILD_C_INTERFACE_TRUE@am_libppl_c_la_rpath = -rpath $(libdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_c_la_SOURCES)
+DIST_SOURCES = $(am__libppl_c_la_SOURCES_DIST)
+am__include_HEADERS_DIST = ppl_c.h
+includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(include_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = ppl_c.h.in ppl_c.cc
+
+# 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:0
+ at BUILD_C_INTERFACE_TRUE@LIBPPL_C_LT_CURRENT = 1
+ at BUILD_C_INTERFACE_TRUE@LIBPPL_C_LT_REVISION = 0
+ at BUILD_C_INTERFACE_TRUE@LIBPPL_C_LT_AGE = 1
+ at BUILD_C_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_C_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_C_INTERFACE_TRUE@lib_LTLIBRARIES = libppl_c.la
+ at BUILD_C_INTERFACE_TRUE@libppl_c_la_SOURCES = ppl_c.cc
+ at BUILD_C_INTERFACE_TRUE@libppl_c_la_LDFLAGS = \
+ at BUILD_C_INTERFACE_TRUE@-version-info $(LIBPPL_C_LT_CURRENT):$(LIBPPL_C_LT_REVISION):$(LIBPPL_C_LT_AGE)
+
+ at BUILD_C_INTERFACE_TRUE@include_HEADERS = ppl_c.h
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/C/Makefile'; \
+ 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
+ppl_c.h: $(top_builddir)/config.status $(srcdir)/ppl_c.h.in
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libppl_c.la: $(libppl_c_la_OBJECTS) $(libppl_c_la_DEPENDENCIES)
+ $(CXXLINK) $(am_libppl_c_la_rpath) $(libppl_c_la_LDFLAGS) $(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.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-includeHEADERS: $(include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+uninstall-includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 $(LTLIBRARIES) $(HEADERS)
+installdirs:
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includedir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libLTLIBRARIES clean-libtool \
+ mostlyclean-am
+
+distclean: distclean-am
+ -rm -rf ./$(DEPDIR)
+ -rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+ distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-exec-am: install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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-includeHEADERS uninstall-info-am \
+ uninstall-libLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libLTLIBRARIES clean-libtool ctags 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-exec \
+ install-exec-am install-includeHEADERS install-info \
+ install-info-am install-libLTLIBRARIES install-man \
+ 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 uninstall uninstall-am \
+ uninstall-includeHEADERS uninstall-info-am \
+ uninstall-libLTLIBRARIES
+
+# 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.cc b/interfaces/C/ppl_c.cc
new file mode 100644
index 0000000..55a55fc
--- /dev/null
+++ b/interfaces/C/ppl_c.cc
@@ -0,0 +1,2524 @@
+/* Implementation of the C interface.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "ppl_c.h"
+#include <stdexcept>
+#include <limits>
+#include <sstream>
+#include <cstdio>
+#include <cerrno>
+#include <climits>
+
+using namespace Parma_Polyhedra_Library;
+
+//! Reinterpret an mpz_t as mpz_class.
+mpz_class&
+reinterpret_mpz_class(mpz_t n) {
+ return reinterpret_cast<mpz_class&>(*n);
+}
+
+#define DECLARE_CONVERSIONS(Type) \
+inline const Type* \
+to_const(ppl_const_ ## Type ## _t x) { \
+ return reinterpret_cast<const Type*>(x); \
+} \
+ \
+inline Type* \
+to_nonconst(ppl_ ## Type ## _t x) { \
+ return reinterpret_cast<Type*>(x); \
+} \
+ \
+inline ppl_const_ ## Type ## _t \
+to_const(const Type* x) { \
+ return reinterpret_cast<ppl_const_ ## Type ## _t>(x); \
+} \
+ \
+inline ppl_ ## Type ## _t \
+to_nonconst(Type* x) { \
+ return reinterpret_cast<ppl_ ## Type ## _t>(x); \
+}
+
+namespace {
+
+extern "C" typedef void
+(*error_handler_type)(enum ppl_enum_error_code code, const char* description);
+
+error_handler_type user_error_handler = 0;
+
+void
+notify_error(enum ppl_enum_error_code code, const char* description) {
+ if (user_error_handler != 0)
+ user_error_handler(code, description);
+}
+
+} // namespace
+
+int
+ppl_set_error_handler(error_handler_type h) {
+ user_error_handler = h;
+ return 0;
+}
+
+#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(overflow_error, PPL_ARITHMETIC_OVERFLOW) \
+CATCH_STD_EXCEPTION(runtime_error, PPL_ERROR_INTERNAL_ERROR) \
+CATCH_STD_EXCEPTION(exception, PPL_ERROR_UNKNOWN_STANDARD_EXCEPTION) \
+catch (...) { \
+ notify_error(PPL_ERROR_UNEXPECTED_ERROR, \
+ "completely unexpected error: a bug in the PPL"); \
+ return PPL_ERROR_UNEXPECTED_ERROR; \
+}
+
+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_LP_PROBLEM_STATUS_UNFEASIBLE;
+int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
+int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
+
+int PPL_LP_PROBLEM_MINIMIZATION;
+int PPL_LP_PROBLEM_MAXIMIZATION;
+
+namespace {
+
+// Holds a pointer to the init object.
+Init* init_object_ptr = 0;
+
+} // namespace
+
+
+
+namespace {
+
+extern "C" const char*
+c_variable_default_output_function(ppl_dimension_type var) {
+#if SIZEOF_SIZE_T == SIZEOF_UNSIGNED
+# define FORMAT "%u"
+# define CONVERSION (unsigned)
+#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_LONG
+# define FORMAT "%lu"
+# define CONVERSION (unsigned long)
+#elif SIZEOF_SIZE_T == SIZEOF_UNSIGNED_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;
+
+} // namespace
+
+
+int
+ppl_initialize(void) try {
+ if (init_object_ptr != 0)
+ // Already initialized: error.
+ return PPL_ERROR_INVALID_ARGUMENT;
+
+ init_object_ptr = new Init();
+
+ 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_LP_PROBLEM_STATUS_UNFEASIBLE = UNFEASIBLE_LP_PROBLEM;
+ PPL_LP_PROBLEM_STATUS_UNBOUNDED = UNBOUNDED_LP_PROBLEM;
+ PPL_LP_PROBLEM_STATUS_OPTIMIZED = OPTIMIZED_LP_PROBLEM;
+
+ PPL_LP_PROBLEM_MINIMIZATION = MINIMIZATION;
+ PPL_LP_PROBLEM_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 {
+ if (init_object_ptr == 0)
+ // Not initialized or already finalized: error.
+ return PPL_ERROR_INVALID_ARGUMENT;
+
+ delete init_object_ptr;
+ init_object_ptr = 0;
+
+ Variable::set_output_function(saved_cxx_Variable_output_function);
+
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_version_major(void) try {
+ return version_major();
+}
+CATCH_ALL
+
+int
+ppl_version_minor(void) try {
+ return version_minor();
+}
+CATCH_ALL
+
+int
+ppl_version_revision(void) try {
+ return version_revision();
+}
+CATCH_ALL
+
+int
+ppl_version_beta(void) try {
+ return 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
+
+DECLARE_CONVERSIONS(Coefficient)
+
+DECLARE_CONVERSIONS(Linear_Expression)
+
+DECLARE_CONVERSIONS(Constraint)
+
+DECLARE_CONVERSIONS(Constraint_System)
+
+typedef Constraint_System::const_iterator Constraint_System_const_iterator;
+DECLARE_CONVERSIONS(Constraint_System_const_iterator)
+
+DECLARE_CONVERSIONS(Generator)
+
+DECLARE_CONVERSIONS(Generator_System)
+
+typedef Generator_System::const_iterator Generator_System_const_iterator;
+DECLARE_CONVERSIONS(Generator_System_const_iterator)
+
+DECLARE_CONVERSIONS(Polyhedron)
+
+DECLARE_CONVERSIONS(LP_Problem)
+
+
+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
+
+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);
+ 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 1;
+}
+CATCH_ALL
+
+
+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_THAN_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_THAN_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_THAN_OR_EQUAL;
+ case Constraint::STRICT_INEQUALITY:
+ return PPL_CONSTRAINT_TYPE_GREATER_THAN;
+ default:
+ throw std::runtime_error("ppl_Constraint_type()");
+ }
+}
+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 1;
+}
+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));
+ return 0;
+}
+CATCH_ALL
+
+
+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_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
+
+
+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
+
+
+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;
+ default:
+ throw std::runtime_error("ppl_Generator_type()");
+ }
+}
+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 1;
+}
+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));
+ return 0;
+}
+CATCH_ALL
+
+
+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_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
+
+
+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
+
+
+int
+ppl_new_C_Polyhedron_from_dimension(ppl_Polyhedron_t* pph,
+ ppl_dimension_type d) try {
+ *pph = to_nonconst(new C_Polyhedron(d, UNIVERSE));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_dimension(ppl_Polyhedron_t* pph,
+ ppl_dimension_type d) try {
+ *pph = to_nonconst(new NNC_Polyhedron(d, UNIVERSE));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_empty_from_dimension(ppl_Polyhedron_t* pph,
+ ppl_dimension_type d) try {
+ *pph = to_nonconst(new C_Polyhedron(d, EMPTY));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_empty_from_dimension(ppl_Polyhedron_t* pph,
+ ppl_dimension_type d) try {
+ *pph = to_nonconst(new NNC_Polyhedron(d, EMPTY));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph) try {
+ const C_Polyhedron& phh = *static_cast<const C_Polyhedron*>(to_const(ph));
+ *pph = to_nonconst(new C_Polyhedron(phh));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph) try {
+ const NNC_Polyhedron& phh
+ = *static_cast<const NNC_Polyhedron*>(to_const(ph));
+ *pph = to_nonconst(new C_Polyhedron(phh));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph) try {
+ const C_Polyhedron& phh = *static_cast<const C_Polyhedron*>(to_const(ph));
+ *pph = to_nonconst(new NNC_Polyhedron(phh));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph) try {
+ const NNC_Polyhedron& phh
+ = *static_cast<const NNC_Polyhedron*>(to_const(ph));
+ *pph = to_nonconst(new NNC_Polyhedron(phh));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ *pph = to_nonconst(new C_Polyhedron(ccs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs) try {
+ Constraint_System& ccs = *to_nonconst(cs);
+ *pph = to_nonconst(new C_Polyhedron(ccs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ *pph = to_nonconst(new NNC_Polyhedron(ccs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_recycle_Constraint_System
+(ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs) try {
+ Constraint_System& ccs = *to_nonconst(cs);
+ *pph = to_nonconst(new NNC_Polyhedron(ccs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs) try {
+ const Generator_System& ggs = *to_const(gs);
+ *pph = to_nonconst(new C_Polyhedron(ggs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_C_Polyhedron_recycle_Generator_System(ppl_Polyhedron_t* pph,
+ ppl_Generator_System_t gs) try {
+ Generator_System& ggs = *to_nonconst(gs);
+ *pph = to_nonconst(new C_Polyhedron(ggs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_Generator_System
+(ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs) try {
+ const Generator_System& ggs = *to_const(gs);
+ *pph = to_nonconst(new C_Polyhedron(ggs));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_recycle_Generator_System
+(ppl_Polyhedron_t* pph, ppl_Generator_System_t gs) try {
+ Generator_System& ggs = *to_nonconst(gs);
+ *pph = to_nonconst(new C_Polyhedron(ggs));
+ return 0;
+}
+CATCH_ALL
+
+namespace {
+
+class C_Build_Box {
+private:
+ ppl_dimension_type (*s_d)(void);
+ int (*i_e)(void);
+ int (*g_l_b)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d);
+ int (*g_u_b)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d);
+
+public:
+ C_Build_Box(ppl_dimension_type (*sd)(void),
+ int (*ie)(void),
+ int (*glb)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d),
+ int (*gub)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d))
+ : s_d(sd), i_e(ie), g_l_b(glb), g_u_b(gub) {
+ }
+
+ ppl_dimension_type space_dimension() const {
+ return s_d();
+ }
+
+ bool is_empty(void) const {
+ return i_e() != 0;
+ }
+
+ bool get_lower_bound(ppl_dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const {
+ return g_l_b(k, closed, to_nonconst(&n), to_nonconst(&d)) != 0;
+ }
+
+ bool get_upper_bound(ppl_dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const {
+ return g_u_b(k, closed, to_nonconst(&n), to_nonconst(&d)) != 0;
+ }
+};
+
+} // namespace
+
+int
+ppl_new_C_Polyhedron_from_bounding_box
+(ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d)) try {
+ C_Build_Box cbbox(space_dimension, is_empty,
+ get_lower_bound, get_upper_bound);
+ *pph = to_nonconst(new C_Polyhedron(cbbox, From_Bounding_Box()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_NNC_Polyhedron_from_bounding_box
+(ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d)) try {
+ C_Build_Box cbbox(space_dimension, is_empty,
+ get_lower_bound, get_upper_bound);
+ *pph = to_nonconst(new NNC_Polyhedron(cbbox, From_Bounding_Box()));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_Polyhedron(ppl_const_Polyhedron_t ph) try {
+ delete to_const(ph);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_C_Polyhedron_from_C_Polyhedron(ppl_Polyhedron_t dst,
+ ppl_const_Polyhedron_t src) try {
+ const C_Polyhedron& ssrc
+ = *static_cast<const C_Polyhedron*>(to_const(src));
+ C_Polyhedron& ddst = *static_cast<C_Polyhedron*>(to_nonconst(dst));
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_NNC_Polyhedron_from_NNC_Polyhedron(ppl_Polyhedron_t dst,
+ ppl_const_Polyhedron_t src) try {
+ const NNC_Polyhedron& ssrc
+ = *static_cast<const NNC_Polyhedron*>(to_const(src));
+ NNC_Polyhedron& ddst = *static_cast<NNC_Polyhedron*>(to_nonconst(dst));
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_space_dimension(ppl_const_Polyhedron_t ph,
+ ppl_dimension_type* m) try {
+ *m = to_const(ph)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_affine_dimension(ppl_const_Polyhedron_t ph,
+ ppl_dimension_type* m) try {
+ *m = to_const(ph)->affine_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_intersection_assign(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ xx.intersection_assign(yy);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_intersection_assign_and_minimize(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ return xx.intersection_assign_and_minimize(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_concatenate_assign(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ xx.concatenate_assign(yy);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_poly_hull_assign(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ xx.poly_hull_assign(yy);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_poly_hull_assign_and_minimize(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ return xx.poly_hull_assign_and_minimize(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_poly_difference_assign(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ xx.poly_difference_assign(yy);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ xx.BHRZ03_widening_assign(yy, tp);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_BHRZ03_widening_assign(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ return ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ const Constraint_System& ccs = *to_const(cs);
+ xx.limited_BHRZ03_extrapolation_assign(yy, ccs, tp);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+ return ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(x, y,
+ cs, 0);
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ const Constraint_System& ccs = *to_const(cs);
+ xx.bounded_BHRZ03_extrapolation_assign(yy, ccs, tp);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+ return ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(x, y,
+ cs, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_H79_widening_assign_with_tokens(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ xx.H79_widening_assign(yy, tp);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_H79_widening_assign(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ return ppl_Polyhedron_H79_widening_assign_with_tokens(x, y, 0);
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ const Constraint_System& ccs = *to_const(cs);
+ xx.limited_H79_extrapolation_assign(yy, ccs, tp);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_limited_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+ return ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(x, y,
+ cs, 0);
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ const Constraint_System& ccs = *to_const(cs);
+ xx.bounded_H79_extrapolation_assign(yy, ccs, tp);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounded_H79_extrapolation_assign
+(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs) try {
+ return ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(x, y,
+ cs, 0);
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_time_elapse_assign(ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ Polyhedron& xx = *to_nonconst(x);
+ const Polyhedron& yy = *to_const(y);
+ xx.time_elapse_assign(yy);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_constraints(ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_System_t* pcs) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Constraint_System& cs = pph.constraints();
+ *pcs = to_const(&cs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_minimized_constraints(ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_System_t* pcs) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Constraint_System& cs = pph.minimized_constraints();
+ *pcs = to_const(&cs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_generators(ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_System_t* pgs) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Generator_System& gs = pph.generators();
+ *pgs = to_const(&gs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_minimized_generators(ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_System_t* pgs) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Generator_System& gs = pph.minimized_generators();
+ *pgs = to_const(&gs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraint(ppl_Polyhedron_t ph,
+ ppl_const_Constraint_t c) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Constraint& cc = *to_const(c);
+ pph.add_constraint(cc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraint_and_minimize(ppl_Polyhedron_t ph,
+ ppl_const_Constraint_t c) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Constraint& cc = *to_const(c);
+ pph.add_constraint_and_minimize(cc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generator(ppl_Polyhedron_t ph,
+ ppl_const_Generator_t g) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Generator& gg = *to_const(g);
+ pph.add_generator(gg);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generator_and_minimize(ppl_Polyhedron_t ph,
+ ppl_const_Generator_t g) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Generator& gg = *to_const(g);
+ pph.add_generator_and_minimize(gg);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraints(ppl_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Constraint_System& ccs = *to_const(cs);
+ pph.add_constraints(ccs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_constraints_and_minimize
+(ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Constraint_System& ccs = *to_const(cs);
+ return pph.add_constraints_and_minimize(ccs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generators(ppl_Polyhedron_t ph,
+ ppl_const_Generator_System_t gs) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Generator_System& ggs = *to_const(gs);
+ pph.add_generators(ggs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_generators_and_minimize
+(ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Generator_System& ggs = *to_const(gs);
+ return pph.add_generators_and_minimize(ggs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_constraints(ppl_Polyhedron_t ph,
+ ppl_Constraint_System_t cs) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ Constraint_System& ccs = *to_nonconst(cs);
+ pph.add_recycled_constraints(ccs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_constraints_and_minimize
+(ppl_Polyhedron_t ph, ppl_Constraint_System_t cs) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ Constraint_System& ccs = *to_nonconst(cs);
+ return pph.add_recycled_constraints_and_minimize(ccs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_generators(ppl_Polyhedron_t ph,
+ ppl_Generator_System_t gs) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ Generator_System& ggs = *to_nonconst(gs);
+ pph.add_recycled_generators(ggs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_recycled_generators_and_minimize(ppl_Polyhedron_t ph,
+ ppl_Generator_System_t gs)
+try {
+ Polyhedron& pph = *to_nonconst(ph);
+ Generator_System& ggs = *to_nonconst(gs);
+ return pph.add_recycled_generators_and_minimize(ggs) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_space_dimensions_and_embed(ppl_Polyhedron_t ph,
+ ppl_dimension_type d) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ pph.add_space_dimensions_and_embed(d);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_add_space_dimensions_and_project(ppl_Polyhedron_t ph,
+ ppl_dimension_type d) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ pph.add_space_dimensions_and_project(d);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_remove_space_dimensions(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ Variables_Set to_be_removed;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ to_be_removed.insert(Variable(ds[i]));
+ pph.remove_space_dimensions(to_be_removed);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_remove_higher_space_dimensions(ppl_Polyhedron_t ph,
+ ppl_dimension_type d) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ pph.remove_higher_space_dimensions(d);
+ return 0;
+}
+CATCH_ALL
+
+namespace {
+
+class PIFunc {
+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;
+
+public:
+ PIFunc(dimension_type* v, size_t n)
+ : vec(v), vec_size(n), max_in_codomain_(not_a_dimension()), empty(-1) {
+ }
+
+ bool 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;
+ }
+
+ dimension_type 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_;
+ }
+
+ bool 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
+
+int
+ppl_Polyhedron_map_space_dimensions(ppl_Polyhedron_t ph,
+ ppl_dimension_type maps[],
+ size_t n) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ PIFunc pifunc(maps, n);
+ pph.map_space_dimensions(pifunc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_expand_space_dimension(ppl_Polyhedron_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ pph.expand_space_dimension(Variable(d), m);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_fold_space_dimensions(ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ Variables_Set to_be_folded;
+ for (ppl_dimension_type i = n; i-- > 0; )
+ to_be_folded.insert(Variable(ds[i]));
+ pph.fold_space_dimensions(to_be_folded, Variable(d));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_affine_image(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ pph.affine_image(Variable(var), lle, dd);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_affine_preimage(ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ pph.affine_preimage(Variable(var), lle, dd);
+ return 0;
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& 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_affine_image(Variable(var), llb, uub, dd);
+ return 0;
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& 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_affine_preimage(Variable(var), llb, uub, dd);
+ return 0;
+}
+CATCH_ALL
+
+namespace {
+
+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_THAN_OR_EQUAL:
+ return LESS_THAN_OR_EQUAL;
+ case PPL_CONSTRAINT_TYPE_EQUAL:
+ return EQUAL;
+ case PPL_CONSTRAINT_TYPE_GREATER_THAN_OR_EQUAL:
+ return GREATER_THAN_OR_EQUAL;
+ case PPL_CONSTRAINT_TYPE_GREATER_THAN:
+ return GREATER_THAN;
+ default:
+ return static_cast<Relation_Symbol>(t);
+ }
+}
+
+} // namespace
+
+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) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ pph.generalized_affine_image(Variable(var), relation_symbol(relsym), lle,
+ dd);
+ return 0;
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Linear_Expression& lle = *to_const(le);
+ const Coefficient& dd = *to_const(d);
+ pph.generalized_affine_preimage(Variable(var), relation_symbol(relsym), lle,
+ dd);
+ return 0;
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Linear_Expression& llhs = *to_const(lhs);
+ const Linear_Expression& rrhs = *to_const(rhs);
+ pph.generalized_affine_image(llhs, relation_symbol(relsym), rrhs);
+ return 0;
+}
+CATCH_ALL
+
+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) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ const Linear_Expression& llhs = *to_const(lhs);
+ const Linear_Expression& rrhs = *to_const(rhs);
+ pph.generalized_affine_preimage(llhs, relation_symbol(relsym), rrhs);
+ return 0;
+}
+CATCH_ALL
+
+
+namespace {
+
+class C_Shrink_Box {
+private:
+ void (*s_e)(void);
+ void (*r_l_b)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d);
+ void (*l_u_b)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d);
+
+public:
+ C_Shrink_Box(void (*se)(void),
+ void (*rlb)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d),
+ void (*lub)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d))
+ : s_e(se), r_l_b(rlb), l_u_b(lub) {
+ }
+
+ void set_empty() {
+ s_e();
+ }
+
+ void raise_lower_bound(ppl_dimension_type k, bool closed,
+ const Coefficient& n, const Coefficient& d) {
+ r_l_b(k, closed, to_const(&n), to_const(&d));
+ }
+
+ void lower_upper_bound(ppl_dimension_type k, bool closed,
+ const Coefficient& n, const Coefficient& d) {
+ l_u_b(k, closed, to_const(&n), to_const(&d));
+ }
+};
+
+} // namespace
+
+int
+ppl_Polyhedron_shrink_bounding_box
+(ppl_const_Polyhedron_t ph,
+ unsigned int complexity,
+ void (*set_empty)(void),
+ void (*raise_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d),
+ void (*lower_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d)) try {
+ if (complexity != POLYNOMIAL_COMPLEXITY
+ && complexity != SIMPLEX_COMPLEXITY
+ && complexity != ANY_COMPLEXITY)
+ return PPL_ERROR_INVALID_ARGUMENT;
+
+ const Polyhedron& pph = *to_const(ph);
+ C_Shrink_Box csbox(set_empty, raise_lower_bound, lower_upper_bound);
+ pph.shrink_bounding_box(csbox, Complexity_Class(complexity));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_relation_with_Constraint(ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_t c) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Constraint& cc = *to_const(c);
+ return pph.relation_with(cc).get_flags();
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_relation_with_Generator(ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_t g) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Generator& gg = *to_const(g);
+ return pph.relation_with(gg).get_flags();
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_empty(ppl_const_Polyhedron_t ph) try {
+ const Polyhedron& pph = *to_const(ph);
+ return pph.is_empty() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_universe(ppl_const_Polyhedron_t ph) try {
+ const Polyhedron& pph = *to_const(ph);
+ return pph.is_universe() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_bounded(ppl_const_Polyhedron_t ph) try {
+ const Polyhedron& pph = *to_const(ph);
+ return pph.is_bounded() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounds_from_above(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Linear_Expression& lle = *to_const(le);
+ return pph.bounds_from_above(lle) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_bounds_from_below(ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Linear_Expression& lle = *to_const(le);
+ return pph.bounds_from_below(lle) ? 1 : 0;
+}
+CATCH_ALL
+
+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,
+ ppl_Generator_t point) try {
+ const Polyhedron& 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 maximum;
+ bool ok = pph.maximize(lle, ssup_n, ssup_d, maximum, ppoint);
+ if (ok)
+ *pmaximum = maximum ? 1 : 0;
+ return ok ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_minimize(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) try {
+ const Polyhedron& pph = *to_const(ph);
+ const Linear_Expression& lle = *to_const(le);
+ Coefficient& iinf_n = *to_nonconst(inf_n);
+ Coefficient& iinf_d = *to_nonconst(inf_d);
+ Generator& ppoint = *to_nonconst(point);
+ bool minimum;
+ bool ok = pph.minimize(lle, iinf_n, iinf_d, minimum, ppoint);
+ if (ok)
+ *pminimum = minimum ? 1 : 0;
+ return ok ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_topologically_closed(ppl_const_Polyhedron_t ph) try {
+ const Polyhedron& pph = *to_const(ph);
+ return pph.is_topologically_closed() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_topological_closure_assign(ppl_Polyhedron_t ph) try {
+ Polyhedron& pph = *to_nonconst(ph);
+ pph.topological_closure_assign();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_contains_Polyhedron(ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ const Polyhedron& xx = *to_const(x);
+ const Polyhedron& yy = *to_const(y);
+ return xx.contains(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_strictly_contains_Polyhedron(ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ const Polyhedron& xx = *to_const(x);
+ const Polyhedron& yy = *to_const(y);
+ return xx.strictly_contains(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_is_disjoint_from_Polyhedron(ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ const Polyhedron& xx = *to_const(x);
+ const Polyhedron& yy = *to_const(y);
+ return xx.is_disjoint_from(yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_equals_Polyhedron(ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y) try {
+ const Polyhedron& xx = *to_const(x);
+ const Polyhedron& yy = *to_const(y);
+ return (xx == yy) ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_Polyhedron_OK(ppl_const_Polyhedron_t ph) try {
+ return to_const(ph)->OK() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_new_LP_Problem_trivial(ppl_LP_Problem_t* plp) try {
+ *plp = to_nonconst(new LP_Problem());
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_LP_Problem(ppl_LP_Problem_t* plp, 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_LP_PROBLEM_MINIMIZATION)
+ ? MINIMIZATION : MAXIMIZATION;
+ *plp = to_nonconst(new LP_Problem(ccs, lle, mm));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_new_LP_Problem_from_LP_Problem(ppl_LP_Problem_t* plp,
+ ppl_const_LP_Problem_t lp) try {
+ const LP_Problem& llp = *to_const(lp);
+ *plp = to_nonconst(new LP_Problem(llp));
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_delete_LP_Problem(ppl_const_LP_Problem_t lp) try {
+ delete to_const(lp);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_assign_LP_Problem_from_LP_Problem(ppl_LP_Problem_t dst,
+ ppl_const_LP_Problem_t src) try {
+ const LP_Problem& ssrc = *to_const(src);
+ LP_Problem& ddst = *to_nonconst(dst);
+ ddst = ssrc;
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_space_dimension(ppl_const_LP_Problem_t lp,
+ ppl_dimension_type* m) try {
+ *m = to_const(lp)->space_dimension();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_constraints(ppl_const_LP_Problem_t lp,
+ ppl_const_Constraint_System_t* pcs) try {
+ const Constraint_System& cs = to_const(lp)->constraints();
+ *pcs = to_const(&cs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_objective_function(ppl_const_LP_Problem_t lp,
+ ppl_const_Linear_Expression_t* ple) try {
+ const Linear_Expression& le = to_const(lp)->objective_function();
+ *ple = to_const(&le);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_optimization_mode(ppl_const_LP_Problem_t lp) try {
+ return to_const(lp)->optimization_mode();
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_clear(ppl_LP_Problem_t lp) try {
+ to_nonconst(lp)->clear();
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_add_constraint(ppl_LP_Problem_t lp,
+ ppl_const_Constraint_t c) try {
+ const Constraint& cc = *to_const(c);
+ LP_Problem& llp = *to_nonconst(lp);
+ llp.add_constraint(cc);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_add_constraints(ppl_LP_Problem_t lp,
+ ppl_const_Constraint_System_t cs) try {
+ const Constraint_System& ccs = *to_const(cs);
+ LP_Problem& llp = *to_nonconst(lp);
+ llp.add_constraints(ccs);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_set_objective_function(ppl_LP_Problem_t lp,
+ ppl_const_Linear_Expression_t le) try {
+ const Linear_Expression& lle = *to_const(le);
+ LP_Problem& llp = *to_nonconst(lp);
+ llp.set_objective_function(lle);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_set_optimization_mode(ppl_LP_Problem_t lp, int mode) try {
+ LP_Problem& llp = *to_nonconst(lp);
+ Optimization_Mode m = (mode == PPL_LP_PROBLEM_MINIMIZATION)
+ ? MINIMIZATION : MAXIMIZATION;
+ llp.set_optimization_mode(m);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_is_satisfiable(ppl_const_LP_Problem_t lp) try {
+ return to_const(lp)->is_satisfiable() ? 1 : 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_solve(ppl_const_LP_Problem_t lp) try {
+ return to_const(lp)->solve();
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_evaluate_objective_function(ppl_const_LP_Problem_t lp,
+ ppl_const_Generator_t g,
+ ppl_Coefficient_t num,
+ ppl_Coefficient_t den) try {
+ const LP_Problem& llp = *to_const(lp);
+ const Generator& gg = *to_const(g);
+ Coefficient& nnum = *to_nonconst(num);
+ Coefficient& dden = *to_nonconst(den);
+ llp.evaluate_objective_function(gg, nnum, dden);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_feasible_point(ppl_const_LP_Problem_t lp,
+ ppl_const_Generator_t* pg) try {
+ const Generator& g = to_const(lp)->feasible_point();
+ *pg = to_const(&g);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_optimizing_point(ppl_const_LP_Problem_t lp,
+ ppl_const_Generator_t* pg) try {
+ const Generator& g = to_const(lp)->optimizing_point();
+ *pg = to_const(&g);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_optimal_value(ppl_const_LP_Problem_t lp,
+ ppl_Coefficient_t num,
+ ppl_Coefficient_t den) try {
+ Coefficient& nnum = *to_nonconst(num);
+ Coefficient& dden = *to_nonconst(den);
+ to_const(lp)->optimal_value(nnum, dden);
+ return 0;
+}
+CATCH_ALL
+
+int
+ppl_LP_Problem_OK(ppl_const_LP_Problem_t lp) try {
+ return to_const(lp)->OK() ? 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
+
+#define DEFINE_PRINT_FUNCTIONS(Type) \
+int \
+ppl_io_print_ ## Type(ppl_const_ ## Type ## _t x) try { \
+ using namespace IO_Operators; \
+ std::ostringstream s; \
+ s << *to_const(x); \
+ if (puts(s.str().c_str()) < 0) \
+ return PPL_STDIO_ERROR; \
+ return 0; \
+} \
+CATCH_ALL \
+ \
+int \
+ppl_io_fprint_ ## Type(FILE* stream, ppl_const_ ## Type ## _t x) try { \
+ using namespace IO_Operators; \
+ std::ostringstream s; \
+ s << *to_const(x); \
+ if (fputs(s.str().c_str(), stream) < 0) \
+ return PPL_STDIO_ERROR; \
+ return 0; \
+} \
+CATCH_ALL
+
+DEFINE_PRINT_FUNCTIONS(Coefficient)
+
+DEFINE_PRINT_FUNCTIONS(Linear_Expression)
+
+DEFINE_PRINT_FUNCTIONS(Constraint)
+
+DEFINE_PRINT_FUNCTIONS(Constraint_System)
+
+DEFINE_PRINT_FUNCTIONS(Generator)
+
+DEFINE_PRINT_FUNCTIONS(Generator_System)
+
+DEFINE_PRINT_FUNCTIONS(Polyhedron)
+
+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.h b/interfaces/C/ppl_c.h
new file mode 100644
index 0000000..0a7f51e
--- /dev/null
+++ b/interfaces/C/ppl_c.h
@@ -0,0 +1,2695 @@
+/* Header file for the C interface. -*- C -*-
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*! \defgroup PPL_C_interface C Language Interface
+
+\brief
+\ref CInterfaceDetails "Some details about the C Interface".
+
+\anchor CInterfaceDetails
+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).
+
+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>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.
+*/
+
+/*
+ For some reason, GMP up to and including version 4.1.3 requires
+ <stdio.h> to be included before <gmp.h>.
+*/
+/*@{*/ /* \defgroup PPL_C_interface */
+
+#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
+
+/*! \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
+};
+
+/*! \name Version Checking */
+/*@{*/
+
+/*! \brief
+ The major number of the PPL version.
+*/
+#define PPL_VERSION_MAJOR 0
+
+/*! \brief
+ The minor number of the PPL version.
+*/
+#define PPL_VERSION_MINOR 9
+
+/*! \brief
+ The revision number of the PPL 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.
+*/
+#define PPL_VERSION_BETA 0
+
+/*! \brief
+ A string containing the PPL 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 "0.9"
+
+/*! \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 */
+
+/*! \brief
+ An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \name Initialization, Error Handling and Auxiliary Functions */
+/*@{*/
+
+/*! \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
+ 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
+ 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)));
+
+/*@}*/ /* Initialization, Error Handling and Auxiliary Functions */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type) /*! \brief Opaque pointer. */ typedef struct ppl_ ## Type ## _tag* ppl_ ## Type ## _t; /*! \brief Opaque pointer to const object. */ typedef struct ppl_ ## Type ## _tag const* ppl_const_ ## Type ## _t
+
+PPL_TYPE_DECLARATION(Coefficient);
+
+PPL_TYPE_DECLARATION(Linear_Expression);
+
+PPL_TYPE_DECLARATION(Constraint);
+
+PPL_TYPE_DECLARATION(Constraint_System);
+
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Generator);
+
+PPL_TYPE_DECLARATION(Generator_System);
+
+PPL_TYPE_DECLARATION(Generator_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Polyhedron);
+
+PPL_TYPE_DECLARATION(LP_Problem);
+
+#undef PPL_TYPE_DECLARATION
+
+/*! \name Functions Related to Coefficients */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \brief
+ Returns a positive integer if coefficients are bounded; returns 0
+ otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Coefficients */
+
+/*! \name Functions Related to Linear Expressions */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Linear Expressions */
+
+/*! \brief
+ 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_THAN_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_THAN_OR_EQUAL,
+ /*! The constraint is of the form \f$e > 0\f$. */
+ PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+
+/*! \name Functions Related to Constraints */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \brief
+ Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 Related to Constraints */
+
+/*! \name Functions Related to Constraint Systems */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 c));
+
+
+/*! \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));
+
+/*! \brief
+ Builds a const iterator that is a copy of \p cit; writes an
+ 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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Constraint Systems */
+
+/*! \brief
+ 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
+};
+
+
+/*! \name Functions Related to Generators */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \brief
+ Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 Related to Generators */
+
+/*! \name Functions Related to Generator Systems */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 c));
+
+
+/*! \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));
+
+/*! \brief
+ Builds a const iterator that is a copy of \p git; writes an
+ 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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Generator Systems */
+
+/*! \brief
+ Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief
+ Code of the worst-case exponential but typically polynomial
+ complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief
+ Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief
+ Code of the "unfeasible LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \brief
+ Code of the "unbounded LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \brief
+ Code of the "optimized LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \brief
+ Code of the "maximization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MAXIMIZATION;
+
+/*! \brief
+ Code of the "minimization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MINIMIZATION;
+
+/*! \brief
+ 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
+ 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
+ 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
+ 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
+ Individual bit saying that adding the generator would not change the
+ polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+/*! \name Functions Related to Polyhedra */
+/*@{*/
+
+/*! \brief
+ Builds a universe C polyhedron of dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \brief
+ Builds a universe NNC polyhedron of dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \brief
+ Builds an empty C polyhedron of space dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \brief
+ Builds an empty NNC polyhedron of space dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Builds a C polyhedron that is a copy of 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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \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.
+
+ Since \p cs will be <EM>the</EM> system of constraints of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \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.
+
+ Since \p cs will be <EM>the</EM> system of constraints of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \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.
+
+ Since \p gs will be <EM>the</EM> system of generators of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \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.
+
+ Since \p gs will be <EM>the</EM> system of generators of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \brief
+ Builds a new C polyhedron corresponding to an interval-based
+ bounding box, writing a handle for the newly created polyhedron at
+ address \p pph.
+
+ If an interval of the bounding box is provided with any finite
+ but open bound, then the polyhedron is not built and the value
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> is returned.
+ The bounding box is accessed by using the following functions,
+ passed as arguments:
+ \code
+ ppl_dimension_type space_dimension()
+ \endcode
+ returns the dimension of the vector space enclosing the polyhedron
+ represented by the bounding box.
+ \code
+ int is_empty()
+ \endcode
+ returns 0 if and only if the bounding box describes a non-empty set.
+ The function <CODE>is_empty()</CODE> will always be called before the
+ other functions. However, if <CODE>is_empty()</CODE> does not
+ return 0, none of the functions below will be called.
+ \code
+ int get_lower_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ lower boundary of \f$I\f$ is open and is set to a value different
+ from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+ assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+ 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 if and only
+ if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+ positive, \f$0/1\f$ being the unique representation for zero.
+ \code
+ int get_upper_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ upper boundary of \f$I\f$ is open and is set to a value different
+ from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+ the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+ \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_C_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d)));
+
+/*! \brief
+ Builds a new NNC polyhedron corresponding to an interval-based
+ bounding box, writing a handle for the newly created polyhedron at
+ address \p pph.
+
+ The bounding box is accessed by using the following functions,
+ passed as arguments:
+ \code
+ ppl_dimension_type space_dimension()
+ \endcode
+ returns the dimension of the vector space enclosing the polyhedron
+ represented by the bounding box.
+ \code
+ int is_empty()
+ \endcode
+ returns 0 if and only if the bounding box describes a non-empty set.
+ The function <CODE>is_empty()</CODE> will always be called before the
+ other functions. However, if <CODE>is_empty()</CODE> does not
+ return 0, none of the functions below will be called.
+ \code
+ int get_lower_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ lower boundary of \f$I\f$ is open and is set to a value different
+ from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+ assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+ 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 if and only
+ if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+ positive, \f$0/1\f$ being the unique representation for zero.
+ \code
+ int get_upper_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ upper boundary of \f$I\f$ is open and is set to a value different
+ from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+ the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+ \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_NNC_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d)));
+
+/*! \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_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \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_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \brief
+ Invalidates the handle \p ph: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_dimension_type* m));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Writes a const handle to the constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_constraints PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+ Writes a const handle to the minimized constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_minimized_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+ Writes a const handle to the generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_generators PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_System_t* pgs));
+
+/*! \brief
+ Writes a const handle to the minimized generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_minimized_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_t g));
+
+/*! \brief
+ Use \p ph to shrink a generic, interval-based bounding box.
+ The bounding box is abstractly provided by means of the parameters.
+
+ \param ph
+ The polyhedron that is used to shrink the bounding box;
+
+ \param complexity
+ The code of the complexity class of the algorithm to be used.
+ Must be one of PPL_COMPLEXITY_CLASS_POLYNOMIAL,
+ PPL_COMPLEXITY_CLASS_SIMPLEX, or PPL_COMPLEXITY_CLASS_ANY;
+
+ \param set_empty
+ A pointer to a void function with no arguments that causes the bounding
+ box to become empty, i.e., to represent the empty set;
+
+ \param raise_lower_bound
+ A pointer to a void function with arguments
+ <CODE>(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+ that intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is non-zero,
+ with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is zero.
+ The fraction \f$n/d\f$ is in canonical form, that is, \f$n\f$
+ and \f$d\f$ have no common factors and \f$d\f$ is positive, \f$0/1\f$
+ being the unique representation for zero;
+
+ \param lower_upper_bound
+ a pointer to a void function with argument
+ <CODE>(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+ that intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is non-zero,
+ with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE> is zero.
+ The fraction \f$n/d\f$ is in canonical form.
+*/
+int
+ppl_Polyhedron_shrink_bounding_box
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ unsigned int complexity,
+ void (*set_empty)(void),
+ void (*raise_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d),
+ void (*lower_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d)));
+
+/*! \brief
+ Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+ not empty.
+*/
+int
+ppl_Polyhedron_is_empty PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Returns a positive integer if \p ph is a universe polyhedron;
+ returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+ unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \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 PPL_PROTO((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));
+
+/*! \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 PPL_PROTO((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));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Adds a copy of the constraint \p c to the system of constraints of
+ \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \brief
+ Adds a copy of the constraint \p c to the system of constraints of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraint_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_t c));
+
+/*! \brief
+ Adds a copy of the generator \p g to the system of generators of
+ \p ph.
+*/
+int
+ppl_Polyhedron_add_generator PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_t g));
+
+/*! \brief
+ Adds a copy of the generator \p g to the system of generators of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generator_and_minimize PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_t g));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ Adds a copy of the system of constraints \p cs to the system of
+ constraints of \p ph. Returns a positive integer if the resulting
+ polyhedron is non-empty; returns 0 if it is empty. Upon successful
+ return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraints_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_System_t gs));
+
+/*! \brief
+ Adds a copy of the system of generators \p gs to the system of
+ generators of \p ph. Returns a positive integer if the resulting
+ polyhedron is non-empty; returns 0 if it is empty. Upon successful
+ return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generators_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \brief
+ Adds the system of constraints \p cs to the system of constraints of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+
+ \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_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_Generator_System_t gs));
+
+/*! \brief
+ Adds the system of generators \p gs to the system of generators of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+
+ \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_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Generator_System_t gs));
+
+/*! \brief
+ Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Intersects \p x with polyhedron \p y and assigns the result to \p x.
+ Returns a positive integer if the resulting polyhedron is non-empty;
+ returns 0 if it is empty. Upon successful return, \p x is also
+ guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_intersection_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Assigns to \p x the poly-hull of \p x and \p y. Returns a positive
+ integer if the resulting polyhedron is non-empty; returns 0 if it is
+ empty. Upon successful return, \p x is also guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_poly_hull_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Assigns to \p x the \ref Convex_Polyhedral_Difference "poly-difference"
+ of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+ Assigns to \p x the \ref Time_Elapse_Operator "time-elapse" between
+ the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+ \p x and \p y. If \p tp is not the null pointer, the
+ \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+ \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+ and \p y. If \p tp is not the null pointer, the
+ \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+ and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign PPL_PROTO((ppl_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+ Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+ Remaps the dimensions of the vector space according to a
+ \ref 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
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+*/
+int
+ppl_Polyhedron_map_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+/*! \brief
+ \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+/*! \brief
+ Modifies \p ph by \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+/*@}*/ /* Functions Related to Polyhedra */
+
+
+/*! \name Functions Related to LP Problems */
+/*@{*/
+
+/*! \brief
+ Builds a trivial LP problem and writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem_trivial PPL_PROTO((ppl_LP_Problem_t* plp));
+
+/*! \brief
+ Builds an LP problem having feasible region \p cs, objective function
+ \p le and optimization mode \p m; writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem PPL_PROTO((ppl_LP_Problem_t* plp,
+ ppl_const_Constraint_System_t cs,
+ ppl_const_Linear_Expression_t le,
+ int m));
+
+/*! \brief
+ Builds an LP problem that is a copy of \p lp; writes a handle
+ for the newly created system at address \p plp.
+*/
+int
+ppl_new_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t* plp, ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Invalidates the handle \p lp: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_LP_Problem PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Assigns a copy of the LP problem \p src to \p dst.
+*/
+int
+ppl_assign_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t dst, ppl_const_LP_Problem_t src));
+
+/*! \brief
+ Writes to \p m the dimension of the vector space enclosing \p lp.
+*/
+int
+ppl_LP_Problem_space_dimension
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_dimension_type* m));
+
+/*! \brief
+ Writes a const handle to the constraint system defining the
+ feasible region of the LP problem \p lp at address \p pcs.
+*/
+int
+ppl_LP_Problem_constraints PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+ Writes a const handle to the linear expression defining the
+ objective function of the LP problem \p lp at address \p ple.
+*/
+int
+ppl_LP_Problem_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Linear_Expression_t* ple));
+
+/*! \brief
+ Returns the optimization mode of the LP problem \p lp.
+*/
+int
+ppl_LP_Problem_optimization_mode PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Resets the LP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_LP_Problem_clear PPL_PROTO((ppl_LP_Problem_t lp));
+
+/*! \brief
+ Modifies the feasible region of the LP problem \p lp by adding a copy
+ of the constraint \p c; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraint PPL_PROTO((ppl_LP_Problem_t lp,
+ ppl_const_Constraint_t c));
+
+/*! \brief
+ Modifies the feasible region of the LP problem \p lp by adding a copy
+ of the constraints in \p cs; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraints PPL_PROTO((ppl_LP_Problem_t lp,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ Sets the objective function of the LP problem \p lp to a copy of \p le.
+*/
+int
+ppl_LP_Problem_set_objective_function
+PPL_PROTO((ppl_LP_Problem_t lp, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+ Sets the optimization mode of the LP problem \p lp to \p mode.
+*/
+int
+ppl_LP_Problem_set_optimization_mode PPL_PROTO((ppl_LP_Problem_t lp,
+ int mode));
+
+/*! \brief
+ Returns a positive integer if \p lp is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_LP_Problem_is_satisfiable PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Solves the LP problem \p lp, returning an exit status.
+
+ \return
+ <CODE>PPL_LP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the LP problem
+ is not satisfiable;
+ <CODE>PPL_LP_PROBLEM_STATUS_UNBOUNDED</CODE> if the LP problem
+ is satisfiable but there is no finite bound to the value of
+ the objective function;
+ <CODE>PPL_LP_PROBLEM_STATUS_OPTIMIZED</CODE> if the LP problem
+ admits an optimal solution.
+*/
+int
+ppl_LP_Problem_solve PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Evaluates the objective function of \p lp on point \p g.
+
+ \param lp
+ The LP 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_LP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Generator_t g,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+ Writes a const handle to a feasible point for the LP problem \p lp
+ at address \p pg.
+*/
+int
+ppl_LP_Problem_feasible_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_const_Generator_t* pg));
+
+/*! \brief
+ Writes a const handle to an optimizing point for the LP problem \p lp
+ at address \p pg.
+*/
+int
+ppl_LP_Problem_optimizing_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_const_Generator_t* pg));
+
+/*! \brief
+ Returns the optimal value for \p lp.
+
+ \param lp
+ The LP 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_LP_Problem_optimal_value
+PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+ Returns a positive integer if \p lp is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p lp is broken. Useful for debugging purposes.
+*/
+int
+ppl_LP_Problem_OK PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*@}*/ /* Functions Related to LP Problems */
+
+
+/*! \name Simple I/O Functions */
+/*@{*/
+
+/*! \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));
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+/*! \brief Prints \p x to <CODE>stdout</CODE>. */ \
+int \
+ppl_io_print_ ## Type PPL_PROTO((ppl_const_ ## Type ## _t x)); \
+ \
+/*! \brief Prints \p x to the given output \p stream. */ \
+int \
+ppl_io_fprint_ ## Type PPL_PROTO((FILE* stream, ppl_const_ ## Type ## _t x));
+
+PPL_DECLARE_PRINT_FUNCTIONS(Coefficient)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Linear_Expression)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Polyhedron)
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+/*! \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);
+
+/*@}*/ /* Simple I/O Functions */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_PROTO
+
+/*@}*/ /* \defgroup PPL_C_interface */
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/C/ppl_c.h.in b/interfaces/C/ppl_c.h.in
new file mode 100644
index 0000000..ce466e7
--- /dev/null
+++ b/interfaces/C/ppl_c.h.in
@@ -0,0 +1,2695 @@
+/* Header file for the C interface. -*- C -*-
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_c_h
+#define PPL_ppl_c_h 1
+
+/*! \defgroup PPL_C_interface C Language Interface
+
+\brief
+\ref CInterfaceDetails "Some details about the C Interface".
+
+\anchor CInterfaceDetails
+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).
+
+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>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.
+*/
+
+/*
+ For some reason, GMP up to and including version 4.1.3 requires
+ <stdio.h> to be included before <gmp.h>.
+*/
+/*@{*/ /* \defgroup PPL_C_interface */
+
+#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
+
+/*! \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
+};
+
+/*! \name Version Checking */
+/*@{*/
+
+/*! \brief
+ The major number of the PPL version.
+*/
+#define PPL_VERSION_MAJOR @PPL_VERSION_MAJOR@
+
+/*! \brief
+ The minor number of the PPL version.
+*/
+#define PPL_VERSION_MINOR @PPL_VERSION_MINOR@
+
+/*! \brief
+ The revision number of the PPL 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.
+*/
+#define PPL_VERSION_BETA @PPL_VERSION_BETA@
+
+/*! \brief
+ A string containing the PPL 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
+ 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 */
+
+/*! \brief
+ An unsigned integral type for representing space dimensions.
+*/
+typedef size_t ppl_dimension_type;
+
+/*! \name Initialization, Error Handling and Auxiliary Functions */
+/*@{*/
+
+/*! \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
+ 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
+ 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)));
+
+/*@}*/ /* Initialization, Error Handling and Auxiliary Functions */
+
+#undef PPL_TYPE_DECLARATION
+
+#define PPL_TYPE_DECLARATION(Type) /*! \brief Opaque pointer. */ typedef struct ppl_ ## Type ## _tag* ppl_ ## Type ## _t; /*! \brief Opaque pointer to const object. */ typedef struct ppl_ ## Type ## _tag const* ppl_const_ ## Type ## _t
+
+PPL_TYPE_DECLARATION(Coefficient);
+
+PPL_TYPE_DECLARATION(Linear_Expression);
+
+PPL_TYPE_DECLARATION(Constraint);
+
+PPL_TYPE_DECLARATION(Constraint_System);
+
+PPL_TYPE_DECLARATION(Constraint_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Generator);
+
+PPL_TYPE_DECLARATION(Generator_System);
+
+PPL_TYPE_DECLARATION(Generator_System_const_iterator);
+
+PPL_TYPE_DECLARATION(Polyhedron);
+
+PPL_TYPE_DECLARATION(LP_Problem);
+
+#undef PPL_TYPE_DECLARATION
+
+/*! \name Functions Related to Coefficients */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \brief
+ Returns a positive integer if coefficients are bounded; returns 0
+ otherwise.
+*/
+int
+ppl_Coefficient_is_bounded PPL_PROTO((void));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Coefficients */
+
+/*! \name Functions Related to Linear Expressions */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Linear Expressions */
+
+/*! \brief
+ 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_THAN_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_THAN_OR_EQUAL,
+ /*! The constraint is of the form \f$e > 0\f$. */
+ PPL_CONSTRAINT_TYPE_GREATER_THAN
+};
+
+
+/*! \name Functions Related to Constraints */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \brief
+ Returns the type of constraint \p c.
+*/
+int
+ppl_Constraint_type PPL_PROTO((ppl_const_Constraint_t c));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 Related to Constraints */
+
+/*! \name Functions Related to Constraint Systems */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 c));
+
+
+/*! \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));
+
+/*! \brief
+ Builds a const iterator that is a copy of \p cit; writes an
+ 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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Constraint Systems */
+
+/*! \brief
+ 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
+};
+
+
+/*! \name Functions Related to Generators */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \brief
+ Returns the type of generator \p g.
+*/
+int
+ppl_Generator_type PPL_PROTO((ppl_const_Generator_t g));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 Related to Generators */
+
+/*! \name Functions Related to Generator Systems */
+/*@{*/
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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 c));
+
+
+/*! \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));
+
+/*! \brief
+ Builds a const iterator that is a copy of \p git; writes an
+ 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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*! \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));
+
+/*@}*/ /* Functions Related to Generator Systems */
+
+/*! \brief
+ Code of the worst-case polynomial complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_POLYNOMIAL;
+
+/*! \brief
+ Code of the worst-case exponential but typically polynomial
+ complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_SIMPLEX;
+
+/*! \brief
+ Code of the universal complexity class.
+*/
+extern unsigned int PPL_COMPLEXITY_CLASS_ANY;
+
+/*! \brief
+ Code of the "unfeasible LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNFEASIBLE;
+
+/*! \brief
+ Code of the "unbounded LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_UNBOUNDED;
+
+/*! \brief
+ Code of the "optimized LP problem" status.
+*/
+extern int PPL_LP_PROBLEM_STATUS_OPTIMIZED;
+
+/*! \brief
+ Code of the "maximization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MAXIMIZATION;
+
+/*! \brief
+ Code of the "minimization" optimization mode.
+*/
+extern int PPL_LP_PROBLEM_MINIMIZATION;
+
+/*! \brief
+ 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
+ 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
+ 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
+ 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
+ Individual bit saying that adding the generator would not change the
+ polyhedron.
+*/
+extern unsigned int PPL_POLY_GEN_RELATION_SUBSUMES;
+
+/*! \name Functions Related to Polyhedra */
+/*@{*/
+
+/*! \brief
+ Builds a universe C polyhedron of dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \brief
+ Builds a universe NNC polyhedron of dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \brief
+ Builds an empty C polyhedron of space dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_C_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \brief
+ Builds an empty NNC polyhedron of space dimension \p d and writes an
+ handle to it at address \p pph.
+*/
+int
+ppl_new_NNC_Polyhedron_empty_from_dimension PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type d));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph,
+ ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Builds a C polyhedron that is a copy of 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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \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.
+
+ Since \p cs will be <EM>the</EM> system of constraints of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Constraint_System_t cs));
+
+/*! \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.
+
+ Since \p cs will be <EM>the</EM> system of constraints of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \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.
+
+ Since \p gs will be <EM>the</EM> system of generators of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \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_PROTO((ppl_Polyhedron_t* pph, ppl_const_Generator_System_t gs));
+
+/*! \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.
+
+ Since \p gs will be <EM>the</EM> system of generators of the new
+ polyhedron, the space dimension is also inherited.
+
+ \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_PROTO((ppl_Polyhedron_t* pph, ppl_Generator_System_t gs));
+
+/*! \brief
+ Builds a new C polyhedron corresponding to an interval-based
+ bounding box, writing a handle for the newly created polyhedron at
+ address \p pph.
+
+ If an interval of the bounding box is provided with any finite
+ but open bound, then the polyhedron is not built and the value
+ <CODE>PPL_ERROR_INVALID_ARGUMENT</CODE> is returned.
+ The bounding box is accessed by using the following functions,
+ passed as arguments:
+ \code
+ ppl_dimension_type space_dimension()
+ \endcode
+ returns the dimension of the vector space enclosing the polyhedron
+ represented by the bounding box.
+ \code
+ int is_empty()
+ \endcode
+ returns 0 if and only if the bounding box describes a non-empty set.
+ The function <CODE>is_empty()</CODE> will always be called before the
+ other functions. However, if <CODE>is_empty()</CODE> does not
+ return 0, none of the functions below will be called.
+ \code
+ int get_lower_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ lower boundary of \f$I\f$ is open and is set to a value different
+ from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+ assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+ 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 if and only
+ if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+ positive, \f$0/1\f$ being the unique representation for zero.
+ \code
+ int get_upper_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ upper boundary of \f$I\f$ is open and is set to a value different
+ from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+ the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+ \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_C_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d)));
+
+/*! \brief
+ Builds a new NNC polyhedron corresponding to an interval-based
+ bounding box, writing a handle for the newly created polyhedron at
+ address \p pph.
+
+ The bounding box is accessed by using the following functions,
+ passed as arguments:
+ \code
+ ppl_dimension_type space_dimension()
+ \endcode
+ returns the dimension of the vector space enclosing the polyhedron
+ represented by the bounding box.
+ \code
+ int is_empty()
+ \endcode
+ returns 0 if and only if the bounding box describes a non-empty set.
+ The function <CODE>is_empty()</CODE> will always be called before the
+ other functions. However, if <CODE>is_empty()</CODE> does not
+ return 0, none of the functions below will be called.
+ \code
+ int get_lower_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ lower boundary of \f$I\f$ is open and is set to a value different
+ from zero otherwise; <CODE>n</CODE> and <CODE>d</CODE> are
+ assigned the integers \f$n\f$ and \f$d\f$ such that the canonical
+ 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 if and only
+ if \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$ is
+ positive, \f$0/1\f$ being the unique representation for zero.
+ \code
+ int get_upper_bound(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n, ppl_Coefficient_t d)
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return 0.
+ Otherwise, set <CODE>closed</CODE>, <CODE>n</CODE> and
+ <CODE>d</CODE> as follows: <CODE>closed</CODE> is set to 0 if the
+ upper boundary of \f$I\f$ is open and is set to a value different
+ from 0 otherwise; <CODE>n</CODE> and <CODE>d</CODE> are assigned
+ the integers \f$n\f$ and \f$d\f$ such that the canonical fraction
+ \f$n/d\f$ corresponds to the least upper bound of \f$I\f$.
+*/
+int
+ppl_new_NNC_Polyhedron_from_bounding_box
+PPL_PROTO((ppl_Polyhedron_t* pph,
+ ppl_dimension_type (*space_dimension)(void),
+ int (*is_empty)(void),
+ int (*get_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d),
+ int (*get_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_Coefficient_t n,
+ ppl_Coefficient_t d)));
+
+/*! \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_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \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_PROTO((ppl_Polyhedron_t dst, ppl_const_Polyhedron_t src));
+
+/*! \brief
+ Invalidates the handle \p ph: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_Polyhedron PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Writes to \p m the dimension of the vector space enclosing \p ph.
+*/
+int
+ppl_Polyhedron_space_dimension PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_dimension_type* m));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Writes a const handle to the constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_constraints PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+ Writes a const handle to the minimized constraint system defining the
+ polyhedron \p ph at address \p pcs.
+*/
+int
+ppl_Polyhedron_minimized_constraints
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+ Writes a const handle to the generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_generators PPL_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_System_t* pgs));
+
+/*! \brief
+ Writes a const handle to the minimized generator system defining the
+ polyhedron \p ph at address \p pgs.
+*/
+int
+ppl_Polyhedron_minimized_generators
+PPL_PROTO((ppl_const_Polyhedron_t ph, ppl_const_Generator_System_t* pgs));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Generator_t g));
+
+/*! \brief
+ Use \p ph to shrink a generic, interval-based bounding box.
+ The bounding box is abstractly provided by means of the parameters.
+
+ \param ph
+ The polyhedron that is used to shrink the bounding box;
+
+ \param complexity
+ The code of the complexity class of the algorithm to be used.
+ Must be one of PPL_COMPLEXITY_CLASS_POLYNOMIAL,
+ PPL_COMPLEXITY_CLASS_SIMPLEX, or PPL_COMPLEXITY_CLASS_ANY;
+
+ \param set_empty
+ A pointer to a void function with no arguments that causes the bounding
+ box to become empty, i.e., to represent the empty set;
+
+ \param raise_lower_bound
+ A pointer to a void function with arguments
+ <CODE>(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+ that intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is non-zero,
+ with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is zero.
+ The fraction \f$n/d\f$ is in canonical form, that is, \f$n\f$
+ and \f$d\f$ have no common factors and \f$d\f$ is positive, \f$0/1\f$
+ being the unique representation for zero;
+
+ \param lower_upper_bound
+ a pointer to a void function with argument
+ <CODE>(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n, ppl_const_Coefficient_t d)</CODE>
+ that intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is non-zero,
+ with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE> is zero.
+ The fraction \f$n/d\f$ is in canonical form.
+*/
+int
+ppl_Polyhedron_shrink_bounding_box
+PPL_PROTO((ppl_const_Polyhedron_t ph,
+ unsigned int complexity,
+ void (*set_empty)(void),
+ void (*raise_lower_bound)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d),
+ void (*lower_upper_bound)(ppl_dimension_type k, int closed,
+ ppl_const_Coefficient_t n,
+ ppl_const_Coefficient_t d)));
+
+/*! \brief
+ Returns a positive integer if \p ph is empty; returns 0 if \p ph is
+ not empty.
+*/
+int
+ppl_Polyhedron_is_empty PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Returns a positive integer if \p ph is a universe polyhedron;
+ returns 0 if it is not.
+*/
+int
+ppl_Polyhedron_is_universe PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Returns a positive integer if \p ph is bounded; returns 0 if \p ph is
+ unbounded.
+*/
+int
+ppl_Polyhedron_is_bounded PPL_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t le));
+
+/*! \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 PPL_PROTO((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));
+
+/*! \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 PPL_PROTO((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));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_const_Polyhedron_t ph));
+
+/*! \brief
+ Adds a copy of the constraint \p c to the system of constraints of
+ \p ph.
+*/
+int
+ppl_Polyhedron_add_constraint PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_t c));
+
+/*! \brief
+ Adds a copy of the constraint \p c to the system of constraints of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraint_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_t c));
+
+/*! \brief
+ Adds a copy of the generator \p g to the system of generators of
+ \p ph.
+*/
+int
+ppl_Polyhedron_add_generator PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_t g));
+
+/*! \brief
+ Adds a copy of the generator \p g to the system of generators of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generator_and_minimize PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_t g));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ Adds a copy of the system of constraints \p cs to the system of
+ constraints of \p ph. Returns a positive integer if the resulting
+ polyhedron is non-empty; returns 0 if it is empty. Upon successful
+ return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_constraints_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Generator_System_t gs));
+
+/*! \brief
+ Adds a copy of the system of generators \p gs to the system of
+ generators of \p ph. Returns a positive integer if the resulting
+ polyhedron is non-empty; returns 0 if it is empty. Upon successful
+ return, \p ph is guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_add_generators_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_const_Generator_System_t gs));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \brief
+ Adds the system of constraints \p cs to the system of constraints of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+
+ \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_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Constraint_System_t cs));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_Generator_System_t gs));
+
+/*! \brief
+ Adds the system of generators \p gs to the system of generators of
+ \p ph. Returns a positive integer if the resulting polyhedron is
+ non-empty; returns 0 if it is empty. Upon successful return, \p ph
+ is guaranteed to be minimized.
+
+ \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_and_minimize
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_Generator_System_t gs));
+
+/*! \brief
+ Intersects \p x with polyhedron \p y and assigns the result to \p x.
+*/
+int
+ppl_Polyhedron_intersection_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Intersects \p x with polyhedron \p y and assigns the result to \p x.
+ Returns a positive integer if the resulting polyhedron is non-empty;
+ returns 0 if it is empty. Upon successful return, \p x is also
+ guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_intersection_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Assigns to \p x the poly-hull of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_hull_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Assigns to \p x the poly-hull of \p x and \p y. Returns a positive
+ integer if the resulting polyhedron is non-empty; returns 0 if it is
+ empty. Upon successful return, \p x is also guaranteed to be minimized.
+*/
+int
+ppl_Polyhedron_poly_hull_assign_and_minimize
+PPL_PROTO((ppl_Polyhedron_t x, ppl_const_Polyhedron_t y));
+
+/*! \brief
+ Assigns to \p x the \ref Convex_Polyhedral_Difference "poly-difference"
+ of \p x and \p y.
+*/
+int
+ppl_Polyhedron_poly_difference_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type var,
+ ppl_const_Linear_Expression_t le,
+ ppl_const_Coefficient_t d));
+
+/*! \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \ref 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_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));
+
+/*! \brief
+ Assigns to \p ph the image of \p ph with respect to the
+ \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+ Assigns to \p ph the preimage of \p ph with respect to the
+ \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_const_Linear_Expression_t lhs,
+ enum ppl_enum_Constraint_Type relsym,
+ ppl_const_Linear_Expression_t rhs));
+
+/*! \brief
+ Assigns to \p x the \ref Time_Elapse_Operator "time-elapse" between
+ the polyhedra \p x and \p y.
+*/
+int
+ppl_Polyhedron_time_elapse_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+ \p x and \p y. If \p tp is not the null pointer, the
+ \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref BHRZ03_widening "BHRZ03-widening" of
+ \p x and \p y.
+*/
+int
+ppl_Polyhedron_BHRZ03_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+ and \p y. If \p tp is not the null pointer, the
+ \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref H79_widening "H79-widening" of \p x
+ and \p y.
+*/
+int
+ppl_Polyhedron_H79_widening_assign PPL_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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 \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs,
+ unsigned* tp));
+
+/*! \brief
+ If the polyhedron \p y is contained in (or equal to) the polyhedron
+ \p x, assigns to \p x the \ref 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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ Assigns to \p ph its topological closure.
+*/
+int
+ppl_Polyhedron_topological_closure_assign PPL_PROTO((ppl_Polyhedron_t ph));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+ Adds \p d new dimensions to the space enclosing the polyhedron \p ph.
+*/
+int
+ppl_Polyhedron_add_space_dimensions_and_project
+PPL_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \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_PROTO((ppl_Polyhedron_t x,
+ ppl_const_Polyhedron_t y));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n));
+
+/*! \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_PROTO((ppl_Polyhedron_t ph, ppl_dimension_type d));
+
+/*! \brief
+ Remaps the dimensions of the vector space according to a
+ \ref 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
+ \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specification of the mapping operator".
+*/
+int
+ppl_Polyhedron_map_space_dimensions PPL_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type maps[],
+ size_t n));
+
+/*! \brief
+ \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type d,
+ ppl_dimension_type m));
+
+/*! \brief
+ Modifies \p ph by \ref 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_PROTO((ppl_Polyhedron_t ph,
+ ppl_dimension_type ds[],
+ size_t n,
+ ppl_dimension_type d));
+
+/*@}*/ /* Functions Related to Polyhedra */
+
+
+/*! \name Functions Related to LP Problems */
+/*@{*/
+
+/*! \brief
+ Builds a trivial LP problem and writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem_trivial PPL_PROTO((ppl_LP_Problem_t* plp));
+
+/*! \brief
+ Builds an LP problem having feasible region \p cs, objective function
+ \p le and optimization mode \p m; writes a handle to it at address \p plp.
+*/
+int
+ppl_new_LP_Problem PPL_PROTO((ppl_LP_Problem_t* plp,
+ ppl_const_Constraint_System_t cs,
+ ppl_const_Linear_Expression_t le,
+ int m));
+
+/*! \brief
+ Builds an LP problem that is a copy of \p lp; writes a handle
+ for the newly created system at address \p plp.
+*/
+int
+ppl_new_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t* plp, ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Invalidates the handle \p lp: this makes sure the corresponding
+ resources will eventually be released.
+*/
+int
+ppl_delete_LP_Problem PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Assigns a copy of the LP problem \p src to \p dst.
+*/
+int
+ppl_assign_LP_Problem_from_LP_Problem
+PPL_PROTO((ppl_LP_Problem_t dst, ppl_const_LP_Problem_t src));
+
+/*! \brief
+ Writes to \p m the dimension of the vector space enclosing \p lp.
+*/
+int
+ppl_LP_Problem_space_dimension
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_dimension_type* m));
+
+/*! \brief
+ Writes a const handle to the constraint system defining the
+ feasible region of the LP problem \p lp at address \p pcs.
+*/
+int
+ppl_LP_Problem_constraints PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_const_Constraint_System_t* pcs));
+
+/*! \brief
+ Writes a const handle to the linear expression defining the
+ objective function of the LP problem \p lp at address \p ple.
+*/
+int
+ppl_LP_Problem_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Linear_Expression_t* ple));
+
+/*! \brief
+ Returns the optimization mode of the LP problem \p lp.
+*/
+int
+ppl_LP_Problem_optimization_mode PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Resets the LP problem to be a trivial problem of space dimension 0.
+*/
+int
+ppl_LP_Problem_clear PPL_PROTO((ppl_LP_Problem_t lp));
+
+/*! \brief
+ Modifies the feasible region of the LP problem \p lp by adding a copy
+ of the constraint \p c; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraint PPL_PROTO((ppl_LP_Problem_t lp,
+ ppl_const_Constraint_t c));
+
+/*! \brief
+ Modifies the feasible region of the LP problem \p lp by adding a copy
+ of the constraints in \p cs; the space dimension is increased, if necessary.
+*/
+int
+ppl_LP_Problem_add_constraints PPL_PROTO((ppl_LP_Problem_t lp,
+ ppl_const_Constraint_System_t cs));
+
+/*! \brief
+ Sets the objective function of the LP problem \p lp to a copy of \p le.
+*/
+int
+ppl_LP_Problem_set_objective_function
+PPL_PROTO((ppl_LP_Problem_t lp, ppl_const_Linear_Expression_t le));
+
+/*! \brief
+ Sets the optimization mode of the LP problem \p lp to \p mode.
+*/
+int
+ppl_LP_Problem_set_optimization_mode PPL_PROTO((ppl_LP_Problem_t lp,
+ int mode));
+
+/*! \brief
+ Returns a positive integer if \p lp is satisfiable; returns 0 otherwise.
+*/
+int
+ppl_LP_Problem_is_satisfiable PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Solves the LP problem \p lp, returning an exit status.
+
+ \return
+ <CODE>PPL_LP_PROBLEM_STATUS_UNFEASIBLE</CODE> if the LP problem
+ is not satisfiable;
+ <CODE>PPL_LP_PROBLEM_STATUS_UNBOUNDED</CODE> if the LP problem
+ is satisfiable but there is no finite bound to the value of
+ the objective function;
+ <CODE>PPL_LP_PROBLEM_STATUS_OPTIMIZED</CODE> if the LP problem
+ admits an optimal solution.
+*/
+int
+ppl_LP_Problem_solve PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*! \brief
+ Evaluates the objective function of \p lp on point \p g.
+
+ \param lp
+ The LP 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_LP_Problem_evaluate_objective_function
+PPL_PROTO((ppl_const_LP_Problem_t lp, ppl_const_Generator_t g,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+ Writes a const handle to a feasible point for the LP problem \p lp
+ at address \p pg.
+*/
+int
+ppl_LP_Problem_feasible_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_const_Generator_t* pg));
+
+/*! \brief
+ Writes a const handle to an optimizing point for the LP problem \p lp
+ at address \p pg.
+*/
+int
+ppl_LP_Problem_optimizing_point PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_const_Generator_t* pg));
+
+/*! \brief
+ Returns the optimal value for \p lp.
+
+ \param lp
+ The LP 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_LP_Problem_optimal_value
+PPL_PROTO((ppl_const_LP_Problem_t lp,
+ ppl_Coefficient_t num, ppl_Coefficient_t den));
+
+/*! \brief
+ Returns a positive integer if \p lp is well formed, i.e., if it
+ satisfies all its implementation invariants; returns 0 and perhaps
+ makes some noise if \p lp is broken. Useful for debugging purposes.
+*/
+int
+ppl_LP_Problem_OK PPL_PROTO((ppl_const_LP_Problem_t lp));
+
+/*@}*/ /* Functions Related to LP Problems */
+
+
+/*! \name Simple I/O Functions */
+/*@{*/
+
+/*! \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));
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+#define PPL_DECLARE_PRINT_FUNCTIONS(Type) \
+/*! \brief Prints \p x to <CODE>stdout</CODE>. */ \
+int \
+ppl_io_print_ ## Type PPL_PROTO((ppl_const_ ## Type ## _t x)); \
+ \
+/*! \brief Prints \p x to the given output \p stream. */ \
+int \
+ppl_io_fprint_ ## Type PPL_PROTO((FILE* stream, ppl_const_ ## Type ## _t x));
+
+PPL_DECLARE_PRINT_FUNCTIONS(Coefficient)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Linear_Expression)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Constraint_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Generator_System)
+
+PPL_DECLARE_PRINT_FUNCTIONS(Polyhedron)
+
+#undef PPL_DECLARE_PRINT_FUNCTIONS
+
+/*! \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);
+
+/*@}*/ /* Simple I/O Functions */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#undef PPL_PROTO
+
+/*@}*/ /* \defgroup PPL_C_interface */
+
+#endif /* !defined(PPL_ppl_c_h) */
diff --git a/interfaces/Makefile.am b/interfaces/Makefile.am
new file mode 100644
index 0000000..e133934
--- /dev/null
+++ b/interfaces/Makefile.am
@@ -0,0 +1,23 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = C Prolog
diff --git a/interfaces/Makefile.in b/interfaces/Makefile.in
new file mode 100644
index 0000000..4c864c6
--- /dev/null
+++ b/interfaces/Makefile.in
@@ -0,0 +1,594 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = C Prolog
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ clean clean-generic clean-libtool clean-recursive ctags \
+ ctags-recursive distclean distclean-generic distclean-libtool \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am uninstall-info-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/interfaces/Prolog/Ciao/Makefile.am b/interfaces/Prolog/Ciao/Makefile.am
new file mode 100644
index 0000000..c3871b1
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.am
@@ -0,0 +1,168 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+abs_srcdir = @abs_srcdir@
+
+EXTRA_DIST = ppl_ciao.pl ciao_clpq.pl ciao_clpq2.pl ciao_pl_check.pl
+
+if BUILD_CIAO_PROLOG_INTERFACE
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+ at extra_includes@
+
+pkglib_LTLIBRARIES = libppl_ciao.la
+libppl_ciao_la_SOURCES = ppl_ciao.cc
+libppl_ciao_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+libppl_ciao_la_LDFLAGS = -module -avoid-version
+
+pkglib_DATA = ppl_ciao.po
+
+ppl_ciao.po: ppl_ciao.pl
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/ppl_ciao.pl .; \
+ fi
+ ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq'
+# and `ciao_clpq2' 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
+
+
+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
+
+pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen libppl_ciao.la \
+ ./ciao_pl_check \
+ >obtained_pchk
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ GLOBALSTKSIZE=1000000 \
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.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)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ GLOBALSTKSIZE=100000 \
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen libppl_ciao.la \
+ ./ciao_clpq2 \
+ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+*.itf *.po *.c *.so \
+ciao_clpq ciao_clpq2 ciao_pl_check \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS)
+
+mostlyclean-local:
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f ppl_ciao.pl; \
+ fi
+
+endif ENABLE_SHARED
+endif BUILD_CIAO_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/Ciao/Makefile.in b/interfaces/Prolog/Ciao/Makefile.in
new file mode 100644
index 0000000..7d6ae06
--- /dev/null
+++ b/interfaces/Prolog/Ciao/Makefile.in
@@ -0,0 +1,734 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la
+am__libppl_ciao_la_SOURCES_DIST = ppl_ciao.cc
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_libppl_ciao_la_OBJECTS = ppl_ciao.lo
+libppl_ciao_la_OBJECTS = $(am_libppl_ciao_la_OBJECTS)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_libppl_ciao_la_rpath = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -rpath \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(pkglibdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_ciao_la_SOURCES)
+DIST_SOURCES = $(am__libppl_ciao_la_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+abs_srcdir = @abs_srcdir@
+EXTRA_DIST = ppl_ciao.pl ciao_clpq.pl ciao_clpq2.pl ciao_pl_check.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at AM_CPPFLAGS = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/src \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/Watchdog/src \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_includes@
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_LTLIBRARIES = libppl_ciao.la
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_SOURCES = ppl_ciao.cc
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_LIBADD = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at libppl_ciao_la_LDFLAGS = -module -avoid-version
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_ciao.po
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_NONSTRICT = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ack.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ackn.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at fib.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at mc91.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at smm.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at sumto.clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at tak.clpq
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_STRICT = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at schedule.clpq
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at MOSTLYCLEANFILES = \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@*.itf *.po *.c *.so \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_clpq ciao_clpq2 ciao_pl_check \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Ciao/Makefile'; \
+ 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
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libppl_ciao.la: $(libppl_ciao_la_OBJECTS) $(libppl_ciao_la_DEPENDENCIES)
+ $(CXXLINK) $(am_libppl_ciao_la_rpath) $(libppl_ciao_la_LDFLAGS) $(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)/ppl_ciao.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+uninstall-pkglibDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ at BUILD_CIAO_PROLOG_INTERFACE_FALSE@check-local:
+ 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)$(pkglibdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 BUILD_CIAO_PROLOG_INTERFACE_FALSE@mostlyclean-local:
+ at ENABLE_SHARED_FALSE@mostlyclean-local:
+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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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 mostlyclean-local
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-info-am uninstall-pkglibDATA \
+ uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+ clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
+ 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-exec install-exec-am install-info \
+ install-info-am install-man install-pkglibDATA \
+ install-pkglibLTLIBRARIES install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool mostlyclean-local pdf \
+ pdf-am ps ps-am tags uninstall uninstall-am uninstall-info-am \
+ uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_ciao.po: ppl_ciao.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ppl_ciao.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ ciaoc -c ppl_ciao.pl
+
+# All the invocations of `ciaoc' to build `ciao_pl_check', `ciao_clpq'
+# and `ciao_clpq2' 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 BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_pl_check: .libs/libppl_ciao.so ppl_ciao.po ciao_pl_check.pl ../tests/pl_check.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_pl_check.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/pl_check.pl .
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_pl_check.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ rm -f ciao_pl_check.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ rm -f pl_check.pl
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_clpq: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq.pl | ciao_pl_check
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_clpq.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/clpq.pl .
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_clpq.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ rm -f ciao_clpq.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ rm -f clpq.pl
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ciao_clpq2: .libs/libppl_ciao.so ppl_ciao.po ciao_clpq.pl ../tests/clpq2.pl | ciao_pl_check
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/ciao_clpq2.pl .; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cp -f $(srcdir)/../tests/clpq2.pl .
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ ciaoc -o $@ ciao_clpq2.pl
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ rm -f ciao_clpq2.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ rm -f clpq2.pl
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pl_check_test: ciao_pl_check$(EXEEXT) .libs/libppl_ciao.so $(EXPECTED_PCHK)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ ./ciao_pl_check \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ >obtained_pchk
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq_test: ciao_clpq$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq $(EXPECTED_CLPQ)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ LANG=C; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ GLOBALSTKSIZE=1000000 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ ./ciao_clpq \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq2_test: ciao_clpq2$(EXEEXT) .libs/libppl_ciao.so ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ LANG=C; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ GLOBALSTKSIZE=100000 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen libppl_ciao.la \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ ./ciao_clpq2 \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at mostlyclean-local:
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ rm -f ppl_ciao.pl; \
+ at BUILD_CIAO_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ fi
+# 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/ciao_clpq.pl b/interfaces/Prolog/Ciao/ciao_clpq.pl
new file mode 100644
index 0000000..1f36f09
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_clpq.pl
@@ -0,0 +1,55 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_constraints_and_minimize/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..1b02d26
--- /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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_constraints_and_minimize/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_pl_check.pl b/interfaces/Prolog/Ciao/ciao_pl_check.pl
new file mode 100644
index 0000000..7f5c0cb
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ciao_pl_check.pl
@@ -0,0 +1,163 @@
+/* Prolog main program for the toy PPL/CIAO-Prolog predicate checker.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_new_C_Polyhedron_from_bounding_box/2,
+ ppl_new_NNC_Polyhedron_from_bounding_box/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_get_bounding_box/3,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_bounded/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_constraint_and_minimize/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_generator_and_minimize/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_add_generators_and_minimize/2,
+ ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_intersection_assign_and_minimize/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_hull_assign_and_minimize/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_new_LP_Problem_trivial/1,
+ ppl_new_LP_Problem/4,
+ ppl_new_LP_Problem_from_LP_Problem/2,
+ ppl_LP_Problem_swap/2,
+ ppl_delete_LP_Problem/1,
+ ppl_LP_Problem_space_dimension/2,
+ ppl_LP_Problem_constraints/2,
+ ppl_LP_Problem_objective_function/2,
+ ppl_LP_Problem_optimization_mode/2,
+ ppl_LP_Problem_clear/1,
+ ppl_LP_Problem_add_constraint/2,
+ ppl_LP_Problem_add_constraints/2,
+ ppl_LP_Problem_set_objective_function/2,
+ ppl_LP_Problem_set_optimization_mode/2,
+ ppl_LP_Problem_is_satisfiable/1,
+ ppl_LP_Problem_solve/2,
+ ppl_LP_Problem_feasible_point/2,
+ ppl_LP_Problem_optimizing_point/2,
+ ppl_LP_Problem_optimal_value/3,
+ ppl_LP_Problem_evaluate_objective_function/4,
+ ppl_LP_Problem_OK/1
+]).
+
+:- 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_ciao.cc b/interfaces/Prolog/Ciao/ppl_ciao.cc
new file mode 100644
index 0000000..f90fcf4
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_ciao.cc
@@ -0,0 +1,412 @@
+/* Ciao Prolog interface: system-dependent part.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#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;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = 1;
+const Prolog_foreign_return_type PROLOG_FAILURE = 0;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+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.
+*/
+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.
+*/
+long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+}
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+ 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;
+ // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+ t = ciao_put_number_chars(const_cast<char*>(s.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.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return ciao_atom_name(ciao_atom(s));
+}
+
+Prolog_term_ref args[4];
+
+/*!
+ 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) {
+ 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) {
+ 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) {
+ 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) {
+ 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 list, 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);
+ PPL::Result r = PPL::assign_r(*lp, n, PPL::ROUND_NOT_NEEDED);
+ return r == PPL::V_EQ ? 1 : 0;
+ }
+}
+
+/*!
+ 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);
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+ assert(ciao_is_integer(t));
+ if (ciao_fits_in_int(t))
+ return PPL::Coefficient(ciao_to_integer(t));
+ else {
+ char* s;
+ s = ciao_get_number_chars(t);
+ PPL::Coefficient n(s);
+ ciao_free(s);
+ return n;
+ }
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+ int i = 0;
+ if (PPL::assign_r(i, n, PPL::ROUND_NOT_NEEDED) == PPL::V_EQ)
+ return ciao_integer(i);
+ else {
+ std::ostringstream s;
+ s << n;
+ // TODO: remove the const_cast when the Ciao people fix ciao_prolog.h.
+ return ciao_put_number_chars(const_cast<char*>(s.str().c_str()));
+ }
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+extern "C" void
+init() {
+ ppl_initialize();
+}
diff --git a/interfaces/Prolog/Ciao/ppl_ciao.pl b/interfaces/Prolog/Ciao/ppl_ciao.pl
new file mode 100644
index 0000000..bd9239a
--- /dev/null
+++ b/interfaces/Prolog/Ciao/ppl_ciao.pl
@@ -0,0 +1,1683 @@
+/* Ciao Prolog interface: Ciao Prolog part.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- 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_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_new_C_Polyhedron_from_bounding_box/2,
+ ppl_new_NNC_Polyhedron_from_bounding_box/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_get_bounding_box/3,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_bounded/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_constraint_and_minimize/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_generator_and_minimize/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_add_generators_and_minimize/2,
+ ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_intersection_assign_and_minimize/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_hull_assign_and_minimize/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_new_LP_Problem_trivial/1,
+ ppl_new_LP_Problem/4,
+ ppl_new_LP_Problem_from_LP_Problem/2,
+ ppl_LP_Problem_swap/2,
+ ppl_delete_LP_Problem/1,
+ ppl_LP_Problem_space_dimension/2,
+ ppl_LP_Problem_constraints/2,
+ ppl_LP_Problem_objective_function/2,
+ ppl_LP_Problem_optimization_mode/2,
+ ppl_LP_Problem_clear/1,
+ ppl_LP_Problem_add_constraint/2,
+ ppl_LP_Problem_add_constraints/2,
+ ppl_LP_Problem_set_objective_function/2,
+ ppl_LP_Problem_set_optimization_mode/2,
+ ppl_LP_Problem_is_satisfiable/1,
+ ppl_LP_Problem_solve/2,
+ ppl_LP_Problem_feasible_point/2,
+ ppl_LP_Problem_optimizing_point/2,
+ ppl_LP_Problem_optimal_value/3,
+ ppl_LP_Problem_evaluate_objective_function/4,
+ ppl_LP_Problem_OK/1
+],
+[
+ assertions,
+ basicmodes,
+ regtypes,
+ foreign_interface
+]).
+
+
+:- true pred ppl_version_major_2(in(Version),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_version_major)).
+
+ppl_version_major(Version) :-
+ ppl_version_major_2(Version, 1).
+
+:- true pred ppl_version_minor_2(in(Version),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_version_minor)).
+
+ppl_version_minor(Version) :-
+ ppl_version_minor_2(Version, 1).
+
+:- true pred ppl_version_revision_2(in(Version),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_version_revision)).
+
+ppl_version_revision(Version) :-
+ ppl_version_revision_2(Version, 1).
+
+:- true pred ppl_version_beta_2(in(Version),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_version_beta)).
+
+ppl_version_beta(Version) :-
+ ppl_version_beta_2(Version, 1).
+
+:- true pred ppl_version_2(in(Version),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_version)).
+
+ppl_version(Version) :-
+ ppl_version_2(Version, 1).
+
+
+:- true pred ppl_banner_2(in(Banner),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_banner)).
+
+ppl_banner(Banner) :-
+ ppl_banner_2(Banner, 1).
+
+:- true pred ppl_max_space_dimension_2(in(Dimension),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_max_space_dimension)).
+
+ppl_max_space_dimension(Dimension) :-
+ ppl_max_space_dimension_2(Dimension, 1).
+
+:- true pred ppl_Coefficient_is_bounded_1(go(Success))
+ :: int
+ + (returns(Success), foreign(ppl_Coefficient_is_bounded)).
+
+ppl_Coefficient_is_bounded :-
+ ppl_Coefficient_is_bounded_1(1).
+
+:- true pred ppl_Coefficient_max_2(in(Max),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_Coefficient_max)).
+
+ppl_Coefficient_max(Max) :-
+ ppl_Coefficient_max_2(Max, 1).
+
+:- true pred ppl_Coefficient_min_2(in(Min),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_Coefficient_min)).
+
+ppl_Coefficient_min(Min) :-
+ ppl_Coefficient_min_2(Min, 1).
+
+:- true pred ppl_initialize + foreign.
+
+:- true pred ppl_finalize + foreign.
+
+:- true pred ppl_set_timeout_exception_atom(in(Atom))
+ :: any_term + foreign.
+
+:- true pred ppl_timeout_exception_atom_2(in(Atom),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_timeout_exception_atom)).
+
+ppl_timeout_exception_atom(Atom) :-
+ ppl_timeout_exception_atom_2(Atom, 1).
+
+:- true pred ppl_set_timeout(in(Time))
+ :: any_term + foreign.
+
+:- true pred ppl_reset_timeout + foreign.
+
+:- true pred ppl_new_C_Polyhedron_from_space_dimension_2(in(Dimension),
+ in(Atom),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_C_Polyhedron_from_space_dimension)).
+
+ppl_new_C_Polyhedron_from_space_dimension(Dimension, Atom, Handle) :-
+ ppl_new_C_Polyhedron_from_space_dimension_2(Dimension, Atom, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_space_dimension_2(in(Dimension),
+ in(Atom),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_space_dimension)).
+
+ppl_new_NNC_Polyhedron_from_space_dimension(Dimension, Atom, Handle) :-
+ ppl_new_NNC_Polyhedron_from_space_dimension_2(Dimension, Atom, Handle, 1).
+
+
+:- true pred ppl_new_C_Polyhedron_from_C_Polyhedron_2(in(Srd_Handle),
+ in(Dst_Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_C_Polyhedron_from_C_Polyhedron)).
+
+ppl_new_C_Polyhedron_from_C_Polyhedron(Src_Handle, Dst_Handle) :-
+ ppl_new_C_Polyhedron_from_C_Polyhedron_2(
+ Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_C_Polyhedron_from_NNC_Polyhedron_2(in(Srd_Handle),
+ in(Dst_Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_C_Polyhedron_from_NNC_Polyhedron)).
+
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(Src_Handle, Dst_Handle) :-
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron_2(
+ Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_C_Polyhedron_2(in(Srd_Handle),
+ in(Dst_Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_C_Polyhedron)).
+
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(Src_Handle, Dst_Handle) :-
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron_2(
+ Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2(in(Srd_Handle),
+ in(Dst_Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)).
+
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Src_Handle, Dst_Handle) :-
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2(
+ Src_Handle, Dst_Handle, 1).
+
+:- true pred ppl_new_C_Polyhedron_from_constraints_2(in(CList),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_C_Polyhedron_from_constraints)).
+
+ppl_new_C_Polyhedron_from_constraints(CList, Handle) :-
+ ppl_new_C_Polyhedron_from_constraints_2(CList, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_constraints_2(in(CList),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_constraints)).
+
+ppl_new_NNC_Polyhedron_from_constraints(CList, Handle) :-
+ ppl_new_NNC_Polyhedron_from_constraints_2(CList, Handle, 1).
+
+:- true pred ppl_new_C_Polyhedron_from_generators_2(in(GList),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_C_Polyhedron_from_generators)).
+
+ppl_new_C_Polyhedron_from_generators(GList, Handle) :-
+ ppl_new_C_Polyhedron_from_generators_2(GList, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_generators_2(in(GList),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_generators)).
+
+ppl_new_NNC_Polyhedron_from_generators(GList, Handle) :-
+ ppl_new_NNC_Polyhedron_from_generators_2(GList, Handle, 1).
+
+
+:- true pred ppl_new_C_Polyhedron_from_bounding_box_2(in(BBox),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_C_Polyhedron_from_bounding_box)).
+
+ppl_new_C_Polyhedron_from_bounding_box(BBox, Handle) :-
+ ppl_new_C_Polyhedron_from_bounding_box_2(BBox, Handle, 1).
+
+:- true pred ppl_new_NNC_Polyhedron_from_bounding_box_2(in(BBox),
+ in(Handle),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_NNC_Polyhedron_from_bounding_box)).
+
+ppl_new_NNC_Polyhedron_from_bounding_box(BBox, Handle) :-
+ ppl_new_NNC_Polyhedron_from_bounding_box_2(BBox, Handle, 1).
+
+:- true pred ppl_Polyhedron_swap(in(Handle1),
+ in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_delete_Polyhedron(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_space_dimension_2(in(Handle),
+ in(Dimension),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_space_dimension)).
+
+ppl_Polyhedron_space_dimension(Handle, Dimension) :-
+ ppl_Polyhedron_space_dimension_2(Handle, Dimension, 1).
+
+:- true pred ppl_Polyhedron_affine_dimension_2(in(Handle),
+ in(Dimension),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_affine_dimension)).
+
+ppl_Polyhedron_affine_dimension(Handle, Dimension) :-
+ ppl_Polyhedron_affine_dimension_2(Handle, Dimension, 1).
+
+:- true pred ppl_Polyhedron_get_constraints_2(in(Handle),
+ in(CList),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_get_constraints)).
+
+ppl_Polyhedron_get_constraints(Handle, CList) :-
+ ppl_Polyhedron_get_constraints_2(Handle, CList, 1).
+
+
+:- true pred ppl_Polyhedron_get_minimized_constraints_2(in(Handle),
+ in(CList),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_get_minimized_constraints)).
+
+ppl_Polyhedron_get_minimized_constraints(Handle, CList) :-
+ ppl_Polyhedron_get_minimized_constraints_2(Handle, CList, 1).
+
+:- true pred ppl_Polyhedron_get_generators_2(in(Handle),
+ in(GList),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_get_generators)).
+
+ppl_Polyhedron_get_generators(Handle, GList) :-
+ ppl_Polyhedron_get_generators_2(Handle, GList, 1).
+
+
+:- true pred ppl_Polyhedron_get_minimized_generators_2(in(Handle),
+ in(GList),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_get_minimized_generators)).
+
+ppl_Polyhedron_get_minimized_generators(Handle, GList) :-
+ ppl_Polyhedron_get_minimized_generators_2(Handle, GList, 1).
+
+:- true pred ppl_Polyhedron_relation_with_constraint_2(in(Handle),
+ in(Constraint),
+ in(RList),
+ go(Success))
+ :: any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_relation_with_constraint)).
+
+ppl_Polyhedron_relation_with_constraint(Handle, Constraint, RList) :-
+ ppl_Polyhedron_relation_with_constraint_2(Handle, Constraint,
+ RList, 1).
+
+:- true pred ppl_Polyhedron_relation_with_generator_2(in(Handle),
+ in(Generator),
+ in(RList),
+ go(Success))
+ :: any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_relation_with_generator)).
+
+ppl_Polyhedron_relation_with_generator(Handle, Generator, RList) :-
+ ppl_Polyhedron_relation_with_generator_2(Handle, Generator, RList, 1).
+
+:- true pred ppl_Polyhedron_get_bounding_box_2(in(Handle),
+ in(Relation),
+ in(BBox),
+ go(Success))
+ :: any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_get_bounding_box)).
+
+ppl_Polyhedron_get_bounding_box(Handle, Relation, BBox) :-
+ ppl_Polyhedron_get_bounding_box_2(Handle, Relation, BBox, 1).
+
+:- true pred ppl_Polyhedron_is_empty_2(in(Handle),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_is_empty)).
+
+ppl_Polyhedron_is_empty(Handle) :-
+ ppl_Polyhedron_is_empty_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_is_universe_2(in(Handle),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_is_universe)).
+
+ppl_Polyhedron_is_universe(Handle) :-
+ ppl_Polyhedron_is_universe_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_is_bounded_2(in(Handle),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_is_bounded)).
+
+ppl_Polyhedron_is_bounded(Handle) :-
+ ppl_Polyhedron_is_bounded_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_bounds_from_above_2(in(Handle),
+ in(Linear_Expression),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_bounds_from_above)).
+
+ppl_Polyhedron_bounds_from_above(Handle, Linear_Expression) :-
+ ppl_Polyhedron_bounds_from_above_2(Handle, Linear_Expression, 1).
+
+:- true pred ppl_Polyhedron_bounds_from_below_2(in(Handle),
+ in(Linear_Expression),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_bounds_from_below)).
+
+ppl_Polyhedron_bounds_from_below(Handle, Linear_Expression) :-
+ ppl_Polyhedron_bounds_from_below_2(Handle, Linear_Expression, 1).
+
+:- true pred ppl_Polyhedron_maximize_2(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Max),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_maximize)).
+
+ppl_Polyhedron_maximize(Handle, Linear_Expression, Num, Den, Max) :-
+ ppl_Polyhedron_maximize_2(Handle, Linear_Expression, Num, Den, Max, 1).
+
+:- true pred ppl_Polyhedron_maximize_with_point_2(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Max),
+ in(Point),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_maximize_with_point)).
+
+ppl_Polyhedron_maximize_with_point(Handle, Linear_Expression,
+ Num, Den, Max, Point) :-
+ ppl_Polyhedron_maximize_with_point_2(Handle, Linear_Expression,
+ Num, Den, Max, Point, 1).
+
+:- true pred ppl_Polyhedron_minimize_2(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Min),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_minimize)).
+
+ppl_Polyhedron_minimize(Handle, Linear_Expression, Num, Den, Min) :-
+ ppl_Polyhedron_minimize_2(Handle, Linear_Expression, Num, Den, Min, 1).
+
+:- true pred ppl_Polyhedron_minimize_with_point_2(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Min),
+ in(Point),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_minimize_with_point)).
+
+ppl_Polyhedron_minimize_with_point(Handle, Linear_Expression,
+ Num, Den, Min, Point) :-
+ ppl_Polyhedron_minimize_with_point_2(Handle, Linear_Expression,
+ Num, Den, Min, Point, 1).
+
+:- true pred ppl_Polyhedron_is_topologically_closed_2(in(Handle),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_is_topologically_closed)).
+
+ppl_Polyhedron_is_topologically_closed(Handle) :-
+ ppl_Polyhedron_is_topologically_closed_2(Handle, 1).
+
+
+:- true pred ppl_Polyhedron_contains_Polyhedron_2(in(Handle1),
+ in(Handle2),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_contains_Polyhedron)).
+
+ppl_Polyhedron_contains_Polyhedron(Handle1, Handle2) :-
+ ppl_Polyhedron_contains_Polyhedron_2(Handle1, Handle2, 1).
+
+
+:- true pred ppl_Polyhedron_strictly_contains_Polyhedron_2(in(Handle1),
+ in(Handle2),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_strictly_contains_Polyhedron)).
+
+ppl_Polyhedron_strictly_contains_Polyhedron(Handle1, Handle2) :-
+ ppl_Polyhedron_strictly_contains_Polyhedron_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_is_disjoint_from_Polyhedron_2(in(Handle1),
+ in(Handle2),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_is_disjoint_from_Polyhedron)).
+
+ppl_Polyhedron_is_disjoint_from_Polyhedron(Handle1, Handle2) :-
+ ppl_Polyhedron_is_disjoint_from_Polyhedron_2(Handle1, Handle2, 1).
+
+
+:- true pred ppl_Polyhedron_equals_Polyhedron_2(in(Handle1),
+ in(Handle2),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_equals_Polyhedron)).
+
+ppl_Polyhedron_equals_Polyhedron(Handle1, Handle2) :-
+ ppl_Polyhedron_equals_Polyhedron_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_OK_2(in(Handle),
+ go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_OK)).
+
+ppl_Polyhedron_OK(Handle) :-
+ ppl_Polyhedron_OK_2(Handle, 1).
+
+:- true pred ppl_Polyhedron_add_constraint(in(Handle), in(Constraint))
+ :: any_term * any_term + foreign.
+
+
+:- true pred ppl_Polyhedron_add_constraint_and_minimize_2(in(Handle),
+ in(Constraint),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_add_constraint_and_minimize)).
+
+ppl_Polyhedron_add_constraint_and_minimize(Handle, Constraint) :-
+ ppl_Polyhedron_add_constraint_and_minimize_2(Handle, Constraint, 1).
+
+:- true pred ppl_Polyhedron_add_generator(in(Handle), in(Generator))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generator_and_minimize_2(in(Handle),
+ in(Generator),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_add_generator_and_minimize)).
+
+ppl_Polyhedron_add_generator_and_minimize(Handle, Generator) :-
+ ppl_Polyhedron_add_generator_and_minimize_2(Handle, Generator, 1).
+
+:- true pred ppl_Polyhedron_add_constraints(in(Handle), in(CList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraints_and_minimize_2(in(Handle),
+ in(CList),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_add_constraints_and_minimize)).
+
+ppl_Polyhedron_add_constraints_and_minimize(Handle, CList) :-
+ ppl_Polyhedron_add_constraints_and_minimize_2(Handle, CList, 1).
+
+:- true pred ppl_Polyhedron_add_generators(in(Handle), in(GList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generators_and_minimize_2(in(Handle),
+ in(GList),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_add_generators_and_minimize)).
+
+ppl_Polyhedron_add_generators_and_minimize(Handle, GList) :-
+ ppl_Polyhedron_add_generators_and_minimize_2(Handle, GList, 1).
+
+
+:- true pred ppl_Polyhedron_intersection_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_intersection_assign_and_minimize_2(in(Handle1),
+ in(Handle2),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success),
+ foreign(ppl_Polyhedron_intersection_assign_and_minimize)).
+
+ppl_Polyhedron_intersection_assign_and_minimize(Handle1, Handle2) :-
+ ppl_Polyhedron_intersection_assign_and_minimize_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_poly_hull_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_hull_assign_and_minimize_2(in(Handle1),
+ in(Handle2),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_poly_hull_assign_and_minimize)).
+
+ppl_Polyhedron_poly_hull_assign_and_minimize(Handle1, Handle2) :-
+ ppl_Polyhedron_poly_hull_assign_and_minimize_2(Handle1, Handle2, 1).
+
+:- true pred ppl_Polyhedron_poly_difference_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_image(in(Handle), in(Var),
+ in(Linear_Expression), in(Divisor))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_preimage(in(Handle), in(Var),
+ in(Linear_Expression), in(Divisor))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_image(in(Handle), in(Var),
+ in(Lower_Bound),
+ in(Upper_Bound),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_preimage(in(Handle), in(Var),
+ in(Lower_Bound),
+ in(Upper_Bound),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image(in(Handle),
+ in(Var), in(Rel),
+ in(Linear_Expression),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage(in(Handle),
+ in(Var), in(Rel),
+ in(Linear_Expression),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image_lhs_rhs(
+ in(Handle), in(LHS), in(Rel), in(RHS))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(
+ in(Handle), in(LHS), in(Rel), in(RHS))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_time_elapse_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_topological_closure_assign(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2(
+ in(Handle1), in(Handle2), in(Tokens1), in(Tokens2),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * int
+ + (returns(Success),
+ foreign(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)).
+
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(
+ Handle1, Handle2, Tokens1, Tokens2) :-
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens_2(
+ Handle1, Handle2, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2(
+ in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success),
+ foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+ Handle1, Handle2, CList, Tokens1, Tokens2) :-
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2(
+ Handle1, Handle2, CList, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(in(Handle1),
+ in(CList),
+ in(Handle2))
+ :: any_term * any_term * any_term + foreign.
+
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2(
+ in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success),
+ foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+ Handle1, Handle2, CList, Tokens1, Tokens2) :-
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2(
+ Handle1, Handle2, CList, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(in(Handle1),
+ in(CList),
+ in(Handle2))
+ :: any_term * any_term * any_term + foreign.
+
+
+:- true pred ppl_Polyhedron_H79_widening_assign_with_tokens_2(
+ in(Handle1), in(Handle2), in(Tokens1), in(Tokens2),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * int
+ + (returns(Success),
+ foreign(ppl_Polyhedron_H79_widening_assign_with_tokens)).
+
+ppl_Polyhedron_H79_widening_assign_with_tokens(
+ Handle1, Handle2, Tokens1, Tokens2) :-
+ ppl_Polyhedron_H79_widening_assign_with_tokens_2(
+ Handle1, Handle2, Tokens1, Tokens2, 1).
+
+:- true pred ppl_Polyhedron_H79_widening_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2(
+ in(Handle1), in(Handle2), in(CList), in(Tokens1), in(Tokens2),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success),
+ foreign(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(Handle1,
+ Handle2,
+ CList,
+ Tokens1,
+ Tokens2) :-
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2(Handle1,
+ Handle2,
+ CList,
+ Tokens1,
+ Tokens2,
+ 1).
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign(in(Handle1),
+ in(Handle2),
+ in(CList))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2(in(Handle1),
+ in(Handle2),
+ in(CList),
+ in(Tokens1),
+ in(Tokens2),
+ go(Success))
+ :: any_term * any_term * any_term * any_term * any_term * int
+ + (returns(Success),
+ foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)).
+
+ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(Handle1,
+ Handle2,
+ CList,
+ Tokens1,
+ Tokens2) :-
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2(Handle1,
+ Handle2,
+ CList,
+ Tokens1,
+ Tokens2,
+ 1).
+
+:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign(in(Handle1),
+ in(Handle2),
+ in(CList))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred
+ ppl_Polyhedron_add_space_dimensions_and_project(in(Handle),
+ in(NDimensions_To_Add))
+ :: any_term * any_term + foreign.
+
+:- true pred
+ ppl_Polyhedron_add_space_dimensions_and_embed(in(Handle),
+ in(NDimensions_To_Add))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_concatenate_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+ppl_Polyhedron_remove_space_dimensions(Handle, VList) :-
+ ppl_Polyhedron_remove_space_dimensions_2(Handle, VList, 1).
+
+:- true pred ppl_Polyhedron_remove_space_dimensions_2(in(Handle), in(VList),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_remove_space_dimensions)).
+
+:- true pred ppl_Polyhedron_remove_higher_space_dimensions(in(Handle),
+ in(Dimensions))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_expand_space_dimension(in(Handle),
+ in(Var),
+ in(Dimensions))
+ :: any_term * any_term * any_term + foreign.
+
+ppl_Polyhedron_fold_space_dimensions(Handle, VList, Var) :-
+ ppl_Polyhedron_fold_space_dimensions_2(Handle, VList, Var, 1).
+
+:- true pred ppl_Polyhedron_fold_space_dimensions_2(in(Handle),
+ in(VList),
+ in(Var),
+ go(Success))
+ :: any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_fold_space_dimensions)).
+
+
+ppl_Polyhedron_map_space_dimensions(Handle, PIFunc) :-
+ ppl_Polyhedron_map_space_dimensions_2(Handle, PIFunc, 1).
+
+:- true pred ppl_Polyhedron_map_space_dimensions_2(in(Handle),
+ in(PIFunc),
+ go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_Polyhedron_map_space_dimensions)).
+
+:- true pred ppl_new_LP_Problem_trivial_2(in(Term1), go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_new_LP_Problem_trivial)).
+
+ppl_new_LP_Problem_trivial(Term1) :-
+ ppl_new_LP_Problem_trivial_2(Term1, 1).
+
+:- true pred ppl_new_LP_Problem_2(in(Term1), in(Term2), in(Term3), in(Term4), go(Success))
+ :: any_term * any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_LP_Problem)).
+
+ppl_new_LP_Problem(Term1, Term2, Term3, Term4) :-
+ ppl_new_LP_Problem_2(Term1, Term2, Term3, Term4, 1).
+
+:- true pred ppl_new_LP_Problem_from_LP_Problem_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_new_LP_Problem_from_LP_Problem)).
+
+ppl_new_LP_Problem_from_LP_Problem(Term1, Term2) :-
+ ppl_new_LP_Problem_from_LP_Problem_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_swap_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_swap)).
+
+ppl_LP_Problem_swap(Term1, Term2) :-
+ ppl_LP_Problem_swap_2(Term1, Term2, 1).
+
+:- true pred ppl_delete_LP_Problem_2(in(Term1), go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_delete_LP_Problem)).
+
+ppl_delete_LP_Problem(Term1) :-
+ ppl_delete_LP_Problem_2(Term1, 1).
+
+:- true pred ppl_LP_Problem_space_dimension_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_space_dimension)).
+
+ppl_LP_Problem_space_dimension(Term1, Term2) :-
+ ppl_LP_Problem_space_dimension_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_constraints_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_constraints)).
+
+ppl_LP_Problem_constraints(Term1, Term2) :-
+ ppl_LP_Problem_constraints_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_objective_function_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_objective_function)).
+
+ppl_LP_Problem_objective_function(Term1, Term2) :-
+ ppl_LP_Problem_objective_function_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_optimization_mode_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_optimization_mode)).
+
+ppl_LP_Problem_optimization_mode(Term1, Term2) :-
+ ppl_LP_Problem_optimization_mode_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_clear_2(in(Term1), go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_clear)).
+
+ppl_LP_Problem_clear(Term1) :-
+ ppl_LP_Problem_clear_2(Term1, 1).
+
+:- true pred ppl_LP_Problem_add_constraint_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_add_constraint)).
+
+ppl_LP_Problem_add_constraint(Term1, Term2) :-
+ ppl_LP_Problem_add_constraint_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_add_constraints_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_add_constraints)).
+
+ppl_LP_Problem_add_constraints(Term1, Term2) :-
+ ppl_LP_Problem_add_constraints_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_set_objective_function_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_set_objective_function)).
+
+ppl_LP_Problem_set_objective_function(Term1, Term2) :-
+ ppl_LP_Problem_set_objective_function_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_set_optimization_mode_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_set_optimization_mode)).
+
+ppl_LP_Problem_set_optimization_mode(Term1, Term2) :-
+ ppl_LP_Problem_set_optimization_mode_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_is_satisfiable_2(in(Term1), go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_is_satisfiable)).
+
+ppl_LP_Problem_is_satisfiable(Term1) :-
+ ppl_LP_Problem_is_satisfiable_2(Term1, 1).
+
+:- true pred ppl_LP_Problem_solve_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_solve)).
+
+ppl_LP_Problem_solve(Term1, Term2) :-
+ ppl_LP_Problem_solve_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_feasible_point_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_feasible_point)).
+
+ppl_LP_Problem_feasible_point(Term1, Term2) :-
+ ppl_LP_Problem_feasible_point_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_optimizing_point_2(in(Term1), in(Term2), go(Success))
+ :: any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_optimizing_point)).
+
+ppl_LP_Problem_optimizing_point(Term1, Term2) :-
+ ppl_LP_Problem_optimizing_point_2(Term1, Term2, 1).
+
+:- true pred ppl_LP_Problem_optimal_value_2(in(Term1), in(Term2), in(Term3), go(Success))
+ :: any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_optimal_value)).
+
+ppl_LP_Problem_optimal_value(Term1, Term2, Term3) :-
+ ppl_LP_Problem_optimal_value_2(Term1, Term2, Term3, 1).
+
+:- true pred ppl_LP_Problem_evaluate_objective_function_2(in(Term1), in(Term2), in(Term3), in(Term4), go(Success))
+ :: any_term * any_term * any_term * any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_evaluate_objective_function)).
+
+ppl_LP_Problem_evaluate_objective_function(Term1, Term2, Term3, Term4) :-
+ ppl_LP_Problem_evaluate_objective_function_2(Term1, Term2, Term3, Term4, 1).
+
+:- true pred ppl_LP_Problem_OK_2(in(Term1), go(Success))
+ :: any_term * int
+ + (returns(Success), foreign(ppl_LP_Problem_OK)).
+
+ppl_LP_Problem_OK(Term1) :-
+ ppl_LP_Problem_OK_2(Term1, 1).
+
+:- extra_linker_opts('-L.libs').
+:- use_foreign_library(ppl_ciao).
+
+:- impl_defined(
+[
+ ppl_version_major_2/2,
+% ppl_version_major/1,
+ ppl_version_minor_2/2,
+% ppl_version_minor/1,
+ ppl_version_revision_2/2,
+% ppl_version_revision/1,
+ ppl_version_beta_2/2,
+% ppl_version_beta/1,
+ ppl_version_2/2,
+% ppl_version/1,
+ ppl_banner_2/2,
+% ppl_banner/1,
+ ppl_max_space_dimension_2/2,
+% ppl_max_space_dimension/1,
+ ppl_Coefficient_is_bounded_1/1,
+ ppl_Coefficient_max_2/2,
+ ppl_Coefficient_min_2/2,
+ ppl_initialize/0,
+ ppl_finalize/0,
+ ppl_set_timeout_exception_atom/1,
+% ppl_timeout_exception_atom/1,
+ ppl_timeout_exception_atom_2/2,
+ ppl_set_timeout/1,
+ ppl_reset_timeout/0,
+% ppl_new_Polyhedron_from_space_dimension/4,
+ ppl_new_C_Polyhedron_from_space_dimension_2/4,
+ ppl_new_NNC_Polyhedron_from_space_dimension_2/4,
+% ppl_new_Polyhedron_from_Polyhedron/4,
+ ppl_new_C_Polyhedron_from_C_Polyhedron_2/3,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron_2/3,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron_2/3,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron_2/3,
+% ppl_new_Polyhedron_from_constraints/3,
+ ppl_new_C_Polyhedron_from_constraints_2/3,
+ ppl_new_NNC_Polyhedron_from_constraints_2/3,
+% ppl_new_Polyhedron_from_generators/3,
+ ppl_new_C_Polyhedron_from_generators_2/3,
+ ppl_new_NNC_Polyhedron_from_generators_2/3,
+% ppl_new_Polyhedron_from_bounding_box/3,
+ ppl_new_C_Polyhedron_from_bounding_box_2/3,
+ ppl_new_NNC_Polyhedron_from_bounding_box_2/3,
+ ppl_Polyhedron_swap/2,
+ ppl_delete_Polyhedron/1,
+% ppl_Polyhedron_space_dimension/2,
+ ppl_Polyhedron_space_dimension_2/3,
+% ppl_Polyhedron_affine_dimension/2,
+ ppl_Polyhedron_affine_dimension_2/3,
+% ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_get_constraints_2/3,
+% ppl_Polyhedron_get_minimized_constraints/2,
+ ppl_Polyhedron_get_minimized_constraints_2/3,
+% ppl_Polyhedron_get_generators/2,
+ ppl_Polyhedron_get_generators_2/3,
+% ppl_Polyhedron_get_minimized_generators/2,
+ ppl_Polyhedron_get_minimized_generators_2/3,
+% ppl_Polyhedron_relation_with_constraint/3,
+ ppl_Polyhedron_relation_with_constraint_2/4,
+% ppl_Polyhedron_relation_with_generator/3,
+ ppl_Polyhedron_relation_with_generator_2/4,
+% ppl_Polyhedron_get_bounding_box/3,
+ ppl_Polyhedron_get_bounding_box_2/4,
+% ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_empty_2/2,
+% ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_universe_2/2,
+% ppl_Polyhedron_is_bounded/1,
+ ppl_Polyhedron_is_bounded_2/2,
+% ppl_Polyhedron_bounds_from_above/2,
+ ppl_Polyhedron_bounds_from_above_2/3,
+% ppl_Polyhedron_bounds_from_below/2,
+ ppl_Polyhedron_bounds_from_below_2/3,
+% ppl_Polyhedron_maximize/5,
+ ppl_Polyhedron_maximize_2/6,
+% ppl_Polyhedron_maximize_with_point/6,
+ ppl_Polyhedron_maximize_with_point_2/7,
+% ppl_Polyhedron_minimize/5,
+ ppl_Polyhedron_minimize_2/6,
+% ppl_Polyhedron_minimize_with_point/6,
+ ppl_Polyhedron_minimize_with_point_2/7,
+% ppl_Polyhedron_is_topologically_closed/1,
+ ppl_Polyhedron_is_topologically_closed_2/2,
+% ppl_Polyhedron_contains_Polyhedron/2,
+ ppl_Polyhedron_contains_Polyhedron_2/3,
+% ppl_Polyhedron_strictly_contains_Polyhedron/2,
+ ppl_Polyhedron_strictly_contains_Polyhedron_2/3,
+% ppl_Polyhedron_is_disjoint_from_Polyhedron/2,
+ ppl_Polyhedron_is_disjoint_from_Polyhedron_2/3,
+% ppl_Polyhedron_equals_Polyhedron/2,
+ ppl_Polyhedron_equals_Polyhedron_2/3,
+% ppl_Polyhedron_OK/1,
+ ppl_Polyhedron_OK_2/2,
+ ppl_Polyhedron_add_constraint/2,
+% ppl_Polyhedron_add_constraint_and_minimize/2,
+ ppl_Polyhedron_add_constraint_and_minimize_2/3,
+ ppl_Polyhedron_add_generator/2,
+% ppl_Polyhedron_add_generator_and_minimize/2,
+ ppl_Polyhedron_add_generator_and_minimize_2/3,
+ ppl_Polyhedron_add_constraints/2,
+% ppl_Polyhedron_add_constraints_and_minimize/2,
+ ppl_Polyhedron_add_constraints_and_minimize_2/3,
+ ppl_Polyhedron_add_generators/2,
+% ppl_Polyhedron_add_generators_and_minimize/2,
+ ppl_Polyhedron_add_generators_and_minimize_2/3,
+ ppl_Polyhedron_intersection_assign/2,
+% ppl_Polyhedron_intersection_assign_and_minimize/2,
+ ppl_Polyhedron_intersection_assign_and_minimize_2/3,
+ ppl_Polyhedron_poly_hull_assign/2,
+% ppl_Polyhedron_poly_hull_assign_and_minimize/2,
+ ppl_Polyhedron_poly_hull_assign_and_minimize_2/3,
+ 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_with_tokens_2/5,
+ ppl_Polyhedron_BHRZ03_widening_assign/2,
+% ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens_2/6,
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign/3,
+% ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens_2/6,
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign/3,
+% ppl_Polyhedron_H79_widening_assign_with_tokens/4,
+ ppl_Polyhedron_H79_widening_assign_with_tokens_2/5,
+ ppl_Polyhedron_H79_widening_assign/2,
+% ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens_2/6,
+ ppl_Polyhedron_limited_H79_extrapolation_assign/3,
+% ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens/5,
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens_2/6,
+ 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_space_dimensions_2/3,
+ ppl_Polyhedron_remove_higher_space_dimensions/2,
+ ppl_Polyhedron_expand_space_dimension/3,
+% ppl_Polyhedron_fold_space_dimensions/3,
+ ppl_Polyhedron_fold_space_dimensions_2/4,
+% ppl_Polyhedron_map_space_dimensions/2
+ ppl_Polyhedron_map_space_dimensions_2/3,
+ ppl_new_LP_Problem_trivial_2/2,
+ ppl_new_LP_Problem_2/5,
+ ppl_new_LP_Problem_from_LP_Problem_2/3,
+ ppl_LP_Problem_swap_2/3,
+ ppl_delete_LP_Problem_2/2,
+ ppl_LP_Problem_space_dimension_2/3,
+ ppl_LP_Problem_constraints_2/3,
+ ppl_LP_Problem_objective_function_2/3,
+ ppl_LP_Problem_optimization_mode_2/3,
+ ppl_LP_Problem_clear_2/2,
+ ppl_LP_Problem_add_constraint_2/3,
+ ppl_LP_Problem_add_constraints_2/3,
+ ppl_LP_Problem_set_objective_function_2/3,
+ ppl_LP_Problem_set_optimization_mode_2/3,
+ ppl_LP_Problem_is_satisfiable_2/2,
+ ppl_LP_Problem_solve_2/3,
+ ppl_LP_Problem_feasible_point_2/3,
+ ppl_LP_Problem_optimizing_point_2/3,
+ ppl_LP_Problem_optimal_value_2/4,
+ ppl_LP_Problem_evaluate_objective_function_2/5,
+ ppl_LP_Problem_OK_2/2
+]).
+
+:- comment(version_maintenance,off).
+
+/*
+***********************************************
+This commnted code has been kept for future use
+since the above version of this is temporary.
+***********************************************
+
+:- true ppl_version_major(in(Version))
+ :: any_term + foreign.
+
+:- true ppl_version_minor
+ :: any_term + foreign.
+
+:- true ppl_version_revision
+ :: any_term + foreign.
+
+:- true ppl_version_beta
+ :: any_term + foreign.
+
+:- true ppl_version
+ :: any_term + foreign.
+
+:- true ppl_max_space_dimension
+ :: any_term + foreign.
+
+:- true pred ppl_initialize + foreign.
+
+:- true pred ppl_finalize + foreign.
+
+:- true pred ppl_set_timeout_exception_atom(in(Atom))
+ :: any_term + foreign.
+
+:- true pred ppl_timeout_exception_atom(in(Term))
+ :: any_term + foreign.
+
+:- true pred ppl_set_timeout(in(Time))
+ :: any_term + foreign.
+
+:- true pred ppl_reset_timeout + foreign.
+
+:- true pred ppl_new_Polyhedron_from_space_dimension(in(Kind),
+ in(Dimension),
+ in(Atom),
+ in(Handle))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_Polyhedron(in(Src_Kind),
+ in(Src_Handle),
+ in(Dst_Kind),
+ in(Dst_Handle))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_constraints(in(Kind),
+ in(CList),
+ in(Handle))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_generators(in(Kind),
+ in(GList),
+ in(Handle))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_new_Polyhedron_from_bounding_box(in(Kind),
+ in(BBox),
+ in(Handle))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_swap(in(Handle1),
+ in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_delete_Polyhedron(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_space_dimension(in(Handle), in(Dimension))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_dimension(in(Handle), in(Dimension))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_constraints(in(Handle), in(CList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_minimized_constraints(in(Handle), in(CList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_generators(in(Handle), in(CList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_minimized_generators(in(Handle), in(CList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_relation_with_constraint(in(Handle),
+ in(Constraint),
+ in(RList))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_relation_with_generator(in(Handle),
+ in(Generator),
+ in(RList))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_get_bounding_box(in(Handle),
+ in(Relation),
+ in(BBox))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_empty(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_universe(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_bounded(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounds_from_above(in(Handle), in(Linear_Expression))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounds_from_below(in(Handle), in(Linear_Expression))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_maximize(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Max))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_maximize_with_point(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Max),
+ in(Point))
+ :: any_term * any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_minimize(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Min))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_minimize_with_point(in(Handle),
+ in(Linear_Expression),
+ in(Num),
+ in(Den),
+ in(Min),
+ in(Point))
+ :: any_term * any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_topologically_closed(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_contains_Polyhedron(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_strictly_contains_Polyhedron(in(Handle1),
+ in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_is_disjoint_from_Polyhedron(in(Handle1),
+ in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_equals_Polyhedron(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_OK(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraint(in(Handle), in(Constraint))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraint_and_minimize(in(Handle), in(Constraint))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generator(in(Handle), in(Generator))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generator_and_minimize(in(Handle), in(Generator))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraints(in(Handle), in(CList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_constraints_and_minimize(in(Handle), in(CList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generators(in(Handle), in(GList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_add_generators_and_minimize(in(Handle), in(GList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_intersection_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_intersection_assign_and_minimize(in(Handle1),
+ in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_hull_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_hull_assign_and_minimize(in(Handle1),
+ in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_poly_difference_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_image(in(Handle), in(Var),
+ in(Linear_Expression), in(Divisor))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_affine_preimage(in(Handle), in(Var),
+ in(Linear_Expression), in(Divisor))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_image(in(Handle), in(Var),
+ in(Lower_Bound),
+ in(Upper_Bound),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_affine_preimage(in(Handle), in(Var),
+ in(Lower_Bound),
+ in(Upper_Bound),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image(in(Handle),
+ in(Var), in(Rel),
+ in(Linear_Expression),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage(in(Handle),
+ in(Var), in(Rel),
+ in(Linear_Expression),
+ in(Divisor))
+ :: any_term * any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_image_lhs_rhs(in(Handle),
+ in(LHS),
+ in(Rel), in(RHS))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(in(Handle),
+ in(LHS),
+ in(Rel),
+ in(RHS))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_time_elapse_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_topological_closure_assign(in(Handle))
+ :: any_term + foreign.
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign_with_token(in(Handle1),
+ in(Handle2),
+ in(Tokens))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_BHRZ03_widening_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_token(in(Handle1),
+ in(Handle2),
+ in(CList),
+ in(Tokens))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(in(Handle1),
+ in(CList),
+ in(Handle2))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_token(in(Handle1),
+ in(Handle2),
+ in(CList),
+ in(Tokens))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(in(Handle1),
+ in(Handle2),
+ in(CList))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_H79_widening_assign_with_token(in(Handle1),
+ in(Handle2),
+ in(Tokens))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_H79_widening_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign_with_token(in(Handle1),
+ in(Handle2),
+ in(CList),
+ in(Tokens))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_limited_H79_extrapolation_assign(in(Handle1),
+ in(Handle2),
+ in(CList))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign_with_token(in(Handle1),
+ in(Handle2),
+ in(CList),
+ in(Tokens))
+ :: any_term * any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_bounded_H79_extrapolation_assign(in(Handle1),
+ in(Handle2),
+ in(CList))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred
+ ppl_Polyhedron_add_space_dimensions_and_project(in(Handle),
+ in(NDimensions_To_Add))
+ :: any_term * any_term + foreign.
+
+:- true pred
+ ppl_Polyhedron_add_space_dimensions_and_embed(in(Handle),
+ in(NDimensions_To_Add))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_concatenate_assign(in(Handle1), in(Handle2))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_remove_space_dimensions(in(Handle), in(VList))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_remove_higher_space_dimensions(in(Handle),
+ in(Dimensions))
+ :: any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_expand_space_dimension(in(Handle),
+ in(Var),
+ in(Dimensions))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_fold_space_dimensions(in(Handle),
+ in(VList),
+ in(Var))
+ :: any_term * any_term * any_term + foreign.
+
+:- true pred ppl_Polyhedron_map_space_dimensions(in(Handle),
+ in(PIFunc))
+ :: any_term * any_term + foreign.
+
+:- extra_linker_opts('-L.libs').
+:- use_foreign_library(ppl_ciao).
+
+:- impl_defined(
+[
+ 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_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_new_Polyhedron_from_space_dimension/4,
+ ppl_new_Polyhedron_from_Polyhedron/4,
+ ppl_new_Polyhedron_from_constraints/3,
+ ppl_new_Polyhedron_from_generators/3,
+ ppl_new_Polyhedron_from_bounding_box/3,
+ 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_get_bounding_box/3,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_bounded/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_constraint_and_minimize/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_generator_and_minimize/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_add_generators_and_minimize/2,
+ ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_intersection_assign_and_minimize/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_hull_assign_and_minimize/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_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,
+ 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
+]).
+
+:- comment(version_maintenance,off).
+
+
+*/
diff --git a/interfaces/Prolog/GNU/Makefile.am b/interfaces/Prolog/GNU/Makefile.am
new file mode 100644
index 0000000..24f65f4
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.am
@@ -0,0 +1,153 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = ppl_gprolog_sd.cc ppl_gprolog.pl gp_clpq.pl gnu_pl_check.pl
+
+if BUILD_GNU_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_gprolog
+ppl_gprolog_SOURCES =
+
+pkglib_LTLIBRARIES = libppl_gprolog.la
+libppl_gprolog_la_SOURCES = ppl_gprolog_sd.cc
+libppl_gprolog_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+libppl_gprolog_la_LDFLAGS = -module -avoid-version
+
+pkglib_DATA = ppl_gprolog.pl
+
+if ENABLE_SHARED
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+
+else !ENABLE_SHARED
+
+LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+
+endif !ENABLE_SHARED
+
+ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ $(srcdir)/ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ $(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ $(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+ gplc --c-compiler $(CXX) -o $@ \
+ $(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ $(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -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
+
+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 ../../../Watchdog/src/libpwl.la \
+ -dlopen libppl_gprolog.la \
+ ./ppl_gprolog <script_pchk
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.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)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen libppl_gprolog.la \
+ ./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+gp_clpq gp_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS) \
+script_pchk
+
+endif BUILD_GNU_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/GNU/Makefile.in b/interfaces/Prolog/GNU/Makefile.in
new file mode 100644
index 0000000..fa9cf1d
--- /dev/null
+++ b/interfaces/Prolog/GNU/Makefile.in
@@ -0,0 +1,751 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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_GNU_PROLOG_INTERFACE_TRUE@bin_PROGRAMS = ppl_gprolog$(EXEEXT)
+subdir = interfaces/Prolog/GNU
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la
+am__libppl_gprolog_la_SOURCES_DIST = ppl_gprolog_sd.cc
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@am_libppl_gprolog_la_OBJECTS = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ ppl_gprolog_sd.lo
+libppl_gprolog_la_OBJECTS = $(am_libppl_gprolog_la_OBJECTS)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@am_libppl_gprolog_la_rpath = -rpath \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(pkglibdir)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_gprolog_OBJECTS =
+ppl_gprolog_OBJECTS = $(am_ppl_gprolog_OBJECTS)
+ppl_gprolog_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_gprolog_la_SOURCES) $(ppl_gprolog_SOURCES)
+DIST_SOURCES = $(am__libppl_gprolog_la_SOURCES_DIST) \
+ $(ppl_gprolog_SOURCES)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = ppl_gprolog_sd.cc ppl_gprolog.pl gp_clpq.pl gnu_pl_check.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_gprolog_SOURCES =
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@pkglib_LTLIBRARIES = libppl_gprolog.la
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_SOURCES = ppl_gprolog_sd.cc
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_LIBADD = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@extra_libraries@
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@libppl_gprolog_la_LDFLAGS = -module -avoid-version
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@pkglib_DATA = ppl_gprolog.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_FALSE at LIBPPL_GPROLOG = .libs/libppl_gprolog.a
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at LIBPPL_GPROLOG = .libs/libppl_gprolog.so
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@SCRIPT_CLPQ = $(srcdir)/../tests/script_clpq
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@USE_INT8_FALSE at SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@@USE_INT8_TRUE at SCRIPT_CLPQ2 = $(srcdir)/../tests/script_clpq2_int8
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_GNU_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gp_clpq gp_clpq2 \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@script_pchk
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/GNU/Makefile'; \
+ 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
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libppl_gprolog.la: $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_DEPENDENCIES)
+ $(CXXLINK) $(am_libppl_gprolog_la_rpath) $(libppl_gprolog_la_LDFLAGS) $(libppl_gprolog_la_OBJECTS) $(libppl_gprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@ppl_gprolog$(EXEEXT): $(ppl_gprolog_OBJECTS) $(ppl_gprolog_DEPENDENCIES)
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@ @rm -f ppl_gprolog$(EXEEXT)
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@ $(LINK) $(ppl_gprolog_LDFLAGS) $(ppl_gprolog_OBJECTS) $(ppl_gprolog_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_gprolog_sd.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+uninstall-pkglibDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ at BUILD_GNU_PROLOG_INTERFACE_FALSE@check-local:
+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)$(pkglibdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibDATA \
+ install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am \
+ uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+ clean-binPROGRAMS clean-generic clean-libtool \
+ clean-pkglibLTLIBRARIES ctags 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-exec \
+ install-exec-am install-info install-info-am install-man \
+ install-pkglibDATA install-pkglibLTLIBRARIES 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 uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-pkglibDATA \
+ uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ppl_gprolog$(EXEEXT): libppl_gprolog.la ppl_gprolog.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ gplc --c-compiler $(CXX) -o $@ \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(srcdir)/ppl_gprolog.pl $(LIBPPL_GPROLOG) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gp_clpq: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ gplc --c-compiler $(CXX) -o $@ \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(srcdir)/../tests/clpq.pl $(LIBPPL_GPROLOG) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@gp_clpq2: libppl_gprolog.la ppl_gprolog.pl gp_clpq.pl ../tests/clpq2.pl
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ gplc --c-compiler $(CXX) -o $@ \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(srcdir)/ppl_gprolog.pl $(srcdir)/gp_clpq.pl \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(srcdir)/../tests/clpq2.pl $(LIBPPL_GPROLOG) \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -L '$(AM_CXXFLAGS) $(CXXFLAGS) -L$(top_builddir)/src/.libs -lppl -L$(top_builddir)/Watchdog/src/.libs -lpwl -lgmpxx -lgmp'
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@pl_check_test: gnu_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ echo "['$(srcdir)/../tests/pl_check.pl', '$(srcdir)/gnu_pl_check.pl']." \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ >script_pchk
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ echo "main." >>script_pchk
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen libppl_gprolog.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ ./ppl_gprolog <script_pchk
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@clpq_test: gp_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ LANG=C; \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen libppl_gprolog.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ ./gp_clpq <$(SCRIPT_CLPQ) >obtained_clpq
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@clpq2_test: gp_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ LANG=C; \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ -dlopen libppl_gprolog.la \
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ ./gp_clpq2 <$(SCRIPT_CLPQ2) >obtained_clpq2
+ at BUILD_GNU_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# 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 b/interfaces/Prolog/GNU/README
new file mode 100644
index 0000000..aed4eca
--- /dev/null
+++ b/interfaces/Prolog/GNU/README
@@ -0,0 +1,32 @@
+The only GNU Prolog version that is known to work with the PPL is a
+patched version of the "unstable version" available at
+
+ ftp://ftp.inria.fr/INRIA/Projects/contraintes/gprolog/unstable/gprolog-20040608.tgz
+
+(which unpacks to a directory called `gprolog-1.2.18').
+The patch to be applied is given below.
+
+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.
+
+
+*** gprolog-1.2.18/src/TopComp/top_comp.c.orig Fri Jun 4 18:05:02 2004
+--- gprolog-1.2.18/src/TopComp/top_comp.c Sun Jul 3 11:24:36 2005
+***************
+*** 1085,1091 ****
+ if (++i >= argc)
+ Fatal_Error("FILE missing after %s option", last_opt);
+
+! cmd_cc.exe_name = argv[i];
+ continue;
+ }
+
+--- 1085,1091 ----
+ if (++i >= argc)
+ Fatal_Error("FILE missing after %s option", last_opt);
+
+! cmd_cc.exe_name = cmd_link.exe_name = argv[i];
+ continue;
+ }
+
diff --git a/interfaces/Prolog/GNU/gnu_pl_check.pl b/interfaces/Prolog/GNU/gnu_pl_check.pl
new file mode 100644
index 0000000..ec8fb17
--- /dev/null
+++ b/interfaces/Prolog/GNU/gnu_pl_check.pl
@@ -0,0 +1,36 @@
+/* Prolog main program for the PPL/GNU-Prolog predicate checker.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/gp_clpq.pl b/interfaces/Prolog/GNU/gp_clpq.pl
new file mode 100644
index 0000000..16832da
--- /dev/null
+++ b/interfaces/Prolog/GNU/gp_clpq.pl
@@ -0,0 +1,31 @@
+/* Main program for the toy PPL/GNU-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- initialization(main).
+
+eat_eol.
+
+main :-
+ ppl_initialize,
+ common_main,
+ ppl_finalize,
+ halt.
diff --git a/interfaces/Prolog/GNU/ppl_gprolog.pl b/interfaces/Prolog/GNU/ppl_gprolog.pl
new file mode 100644
index 0000000..f755eed
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_gprolog.pl
@@ -0,0 +1,182 @@
+/* GNU Prolog interface: GNU Prolog part.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- foreign(ppl_version_major(+term)).
+:- foreign(ppl_version_minor(+term)).
+:- foreign(ppl_version_revision(+term)).
+:- foreign(ppl_version_beta(+term)).
+:- foreign(ppl_version(+term)).
+:- foreign(ppl_banner(+term)).
+:- foreign(ppl_max_space_dimension(+term)).
+:- foreign(ppl_Coefficient_is_bounded).
+:- foreign(ppl_Coefficient_max(+term)).
+:- foreign(ppl_Coefficient_min(+term)).
+:- foreign(ppl_initialize).
+:- foreign(ppl_finalize).
+:- foreign(ppl_set_timeout_exception_atom(+term)).
+:- foreign(ppl_timeout_exception_atom(+term)).
+:- foreign(ppl_set_timeout(+term)).
+:- foreign(ppl_reset_timeout).
+:- foreign(ppl_new_C_Polyhedron_from_space_dimension(+term, +term,
+ +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_space_dimension(+term, +term,
+ +term)).
+:- foreign(ppl_new_C_Polyhedron_from_C_Polyhedron(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_NNC_Polyhedron(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_C_Polyhedron(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_constraints(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_constraints(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_generators(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_generators(+term, +term)).
+:- foreign(ppl_new_C_Polyhedron_from_bounding_box(+term, +term)).
+:- foreign(ppl_new_NNC_Polyhedron_from_bounding_box(+term, +term)).
+:- foreign(ppl_Polyhedron_swap(+term, +term)).
+:- foreign(ppl_delete_Polyhedron(+term)).
+:- foreign(ppl_Polyhedron_space_dimension(+term, +term)).
+:- foreign(ppl_Polyhedron_affine_dimension(+term, +term)).
+:- foreign(ppl_Polyhedron_get_constraints(+term, +term)).
+:- foreign(ppl_Polyhedron_get_minimized_constraints(+term, +term)).
+:- foreign(ppl_Polyhedron_get_generators(+term, +term)).
+:- foreign(ppl_Polyhedron_get_minimized_generators(+term, +term)).
+:- foreign(ppl_Polyhedron_relation_with_constraint(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_relation_with_generator(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_get_bounding_box(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_is_empty(+term)).
+:- foreign(ppl_Polyhedron_is_universe(+term)).
+:- foreign(ppl_Polyhedron_is_bounded(+term)).
+:- foreign(ppl_Polyhedron_bounds_from_above(+term, +term)).
+:- foreign(ppl_Polyhedron_bounds_from_below(+term, +term)).
+:- foreign(ppl_Polyhedron_maximize(+term, +term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_minimize(+term, +term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_maximize_with_point(+term, +term, +term, +term,
+ +term, +term)).
+:- foreign(ppl_Polyhedron_minimize_with_point(+term, +term, +term, +term,
+ +term, +term)).
+:- foreign(ppl_Polyhedron_is_topologically_closed(+term)).
+:- foreign(ppl_Polyhedron_contains_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_strictly_contains_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_is_disjoint_from_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_equals_Polyhedron(+term, +term)).
+:- foreign(ppl_Polyhedron_OK(+term)).
+:- foreign(ppl_Polyhedron_add_constraint(+term, +term)).
+:- foreign(ppl_Polyhedron_add_constraint_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generator(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generator_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_add_constraints(+term, +term)).
+:- foreign(ppl_Polyhedron_add_constraints_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generators(+term, +term)).
+:- foreign(ppl_Polyhedron_add_generators_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_intersection_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_intersection_assign_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_poly_hull_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_poly_hull_assign_and_minimize(+term, +term)).
+:- foreign(ppl_Polyhedron_poly_difference_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_affine_image(+term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_affine_preimage(+term, +term, +term, +term)).
+:- foreign(ppl_Polyhedron_bounded_affine_image(+term, +term,
+ +term, +term, +term)).
+:- foreign(ppl_Polyhedron_bounded_affine_preimage(+term, +term,
+ +term, +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_image(+term, +term,
+ +term, +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_preimage(+term, +term,
+ +term, +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_image_lhs_rhs(+term, +term,
+ +term, +term)).
+:- foreign(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(+term, +term,
+ +term, +term)).
+:- foreign(ppl_Polyhedron_time_elapse_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_topological_closure_assign(+term)).
+:- foreign(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+term,
+ +term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_BHRZ03_widening_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+ +term,
+ +term,
+ +term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+ +term,
+ +term,
+ +term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_H79_widening_assign_with_tokens(+term,
+ +term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_H79_widening_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+term,
+ +term,
+ +term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_limited_H79_extrapolation_assign(+term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+term,
+ +term,
+ +term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_bounded_H79_extrapolation_assign(+term,
+ +term,
+ +term)).
+:- foreign(ppl_Polyhedron_add_space_dimensions_and_project(+term, +term)).
+:- foreign(ppl_Polyhedron_add_space_dimensions_and_embed(+term, +term)).
+:- foreign(ppl_Polyhedron_concatenate_assign(+term, +term)).
+:- foreign(ppl_Polyhedron_remove_space_dimensions(+term, +term)).
+:- foreign(ppl_Polyhedron_remove_higher_space_dimensions(+term, +term)).
+:- foreign(ppl_Polyhedron_expand_space_dimension(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_fold_space_dimensions(+term, +term, +term)).
+:- foreign(ppl_Polyhedron_map_space_dimensions(+term, +term)).
+:- foreign(ppl_new_LP_Problem_trivial(+term)).
+:- foreign(ppl_new_LP_Problem(+term, +term, +term, +term)).
+:- foreign(ppl_new_LP_Problem_from_LP_Problem(+term, +term)).
+:- foreign(ppl_LP_Problem_swap(+term, +term)).
+:- foreign(ppl_delete_LP_Problem(+term)).
+:- foreign(ppl_LP_Problem_space_dimension(+term, +term)).
+:- foreign(ppl_LP_Problem_constraints(+term, +term)).
+:- foreign(ppl_LP_Problem_objective_function(+term, +term)).
+:- foreign(ppl_LP_Problem_optimization_mode(+term, +term)).
+:- foreign(ppl_LP_Problem_clear(+term)).
+:- foreign(ppl_LP_Problem_add_constraint(+term, +term)).
+:- foreign(ppl_LP_Problem_add_constraints(+term, +term)).
+:- foreign(ppl_LP_Problem_set_objective_function(+term, +term)).
+:- foreign(ppl_LP_Problem_set_optimization_mode(+term, +term)).
+:- foreign(ppl_LP_Problem_is_satisfiable(+term)).
+:- foreign(ppl_LP_Problem_solve(+term, +term)).
+:- foreign(ppl_LP_Problem_feasible_point(+term, +term)).
+:- foreign(ppl_LP_Problem_optimizing_point(+term, +term)).
+:- foreign(ppl_LP_Problem_optimal_value(+term, +term, +term)).
+:- foreign(ppl_LP_Problem_evaluate_objective_function(+term, +term, +term, +term)).
+:- foreign(ppl_LP_Problem_OK(+term)).
diff --git a/interfaces/Prolog/GNU/ppl_gprolog_sd.cc b/interfaces/Prolog/GNU/ppl_gprolog_sd.cc
new file mode 100644
index 0000000..a160358
--- /dev/null
+++ b/interfaces/Prolog/GNU/ppl_gprolog_sd.cc
@@ -0,0 +1,438 @@
+/* GNU Prolog interface: system-dependent part.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include <gprolog.h>
+#include <cassert>
+
+typedef PlTerm Prolog_term_ref;
+typedef int Prolog_atom;
+typedef Bool Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+Prolog_atom a_dollar_address;
+Prolog_atom a_throw;
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+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.
+*/
+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.
+*/
+long Prolog_max_integer;
+
+#include <iostream>
+using namespace std;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = false;
+ Prolog_min_integer = INT_LOWEST_VALUE;
+ Prolog_max_integer = INT_GREATEST_VALUE;
+
+ a_dollar_address = Create_Allocate_Atom("$address");
+ a_throw = Find_Atom("throw");
+}
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+ 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 < Prolog_min_integer || l > Prolog_max_integer)
+ throw PPL_integer_out_of_range(l);
+ 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>(Prolog_max_integer))
+ throw PPL_integer_out_of_range(ul);
+ 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) {
+ // TODO: remove the const_cast when the GNU Prolog people fix gprolog.h.
+ // NOTE: at the time of writing this comment (January 14, 2006), and since
+ // a long time before, "GNU Prolog people" stands for the empty set.
+ 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.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ // TODO: remove the const_cast when the GNU Prolog people fix gprolog.h.
+ return Create_Allocate_Atom(const_cast<char*>(s));
+}
+
+Prolog_term_ref args[4];
+
+/*!
+ 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) {
+ 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) {
+ 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) {
+ 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) {
+ 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) {
+ 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 {
+ unsigned long l;
+ unsigned short s[2];
+ } u;
+ u.l = reinterpret_cast<unsigned long>(p);
+ return Prolog_construct_compound(t, a_dollar_address,
+ Mk_Positive(u.s[0]), Mk_Positive(u.s[1]));
+}
+
+/*!
+ 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 list, 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 || arity != 2)
+ return 0;
+ for (int i = 0; i <= 1; ++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 {
+ unsigned long l;
+ unsigned short s[2];
+ } u;
+ u.s[0] = Rd_Integer_Check(a[0]);
+ u.s[1] = Rd_Integer_Check(a[1]);
+ *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) {
+ return Unify(t, u) != FALSE;
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+ long v;
+ Prolog_get_long(t, &v);
+ return PPL::Coefficient(v);
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+ long l = 0;
+ if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) != PPL::V_EQ)
+ throw PPL_integer_out_of_range(n);
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_put_long(t, l);
+ return t;
+}
+
+} // namespace
+
+#undef CS
+
+#include "../ppl_prolog.icc"
diff --git a/interfaces/Prolog/Makefile.am b/interfaces/Prolog/Makefile.am
new file mode 100644
index 0000000..b84e0fd
--- /dev/null
+++ b/interfaces/Prolog/Makefile.am
@@ -0,0 +1,25 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = Ciao GNU SICStus SWI XSB YAP tests
+
+noinst_HEADERS = ppl_prolog.icc exceptions.hh track_allocation.hh
diff --git a/interfaces/Prolog/Makefile.in b/interfaces/Prolog/Makefile.in
new file mode 100644
index 0000000..20fef71
--- /dev/null
+++ b/interfaces/Prolog/Makefile.in
@@ -0,0 +1,598 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+SOURCES =
+DIST_SOURCES =
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = Ciao GNU SICStus SWI XSB YAP tests
+noinst_HEADERS = ppl_prolog.icc exceptions.hh track_allocation.hh
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ distdir) \
+ || exit 1; \
+ fi; \
+ done
+check-am: all-am
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool \
+ distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ clean clean-generic clean-libtool clean-recursive ctags \
+ ctags-recursive distclean distclean-generic distclean-libtool \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-generic mostlyclean-libtool \
+ mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
+ uninstall uninstall-am uninstall-info-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/interfaces/Prolog/Prolog_interface.dox b/interfaces/Prolog/Prolog_interface.dox
new file mode 100644
index 0000000..af930b4
--- /dev/null
+++ b/interfaces/Prolog/Prolog_interface.dox
@@ -0,0 +1,2175 @@
+/* Documentation for the Prolog interfaces.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+/*! \defgroup PrologInterface 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 systems.
+
+The system-independent features of the library are described in
+Section \ref PI_SI_Features "System-Independent Features".
+Section \ref PI_Compilation "Compilation and Installation"
+explains how the various incarnations of the Prolog interface
+are compiled and installed.
+Section \ref PI_SD_Features "System-Dependent Features"
+illustrates the system-dependent features of the interface
+for all the supported systems.
+
+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 PI_SI_Features
+<H1>System-Independent Features</H1>
+
+The Prolog interface provides access to the PPL polyhedra.
+A general introduction to convex polyhedra, their representation in the PPL
+and the operations provided by the PPL is given in Sections
+\ref preamble, \ref convex_polys, \ref representation
+and \ref Operations_on_Convex_Polyhedra of this manual.
+Here we just describe those aspects that are specific to the Prolog interface.
+
+<H2>Overview</H2>
+
+First, here is a list of notes with general information and advice
+on the use of the interface.
+
+- 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.
+- 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 PPL-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 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 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,
+ ppl_new_C_Polyhedron_from_bounding_box/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 polyhedron is no longer required,
+ the memory occupied by it should be released
+ using the PPL predicate <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 a variable bound to a handle for a PPL Polyhedron dies
+ or is uninstantiated,
+ the handle can be garbage-collected, but the polyhedra 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 polyhedron 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.
+ 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 \ref representation.
+
+- 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 \ref representation.
+
+- 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.
+
+<H2>PPL Predicate List</H2>
+
+Here is a list of all the PPL predicates provided by the Prolog interface.
+
+<CODE>
+ ppl_version_major(?C_int)
+</CODE>
+
+<CODE>
+ ppl_version_minor(?C_int)
+</CODE>
+
+<CODE>
+ ppl_version_revision(?C_int)
+</CODE>
+
+<CODE>
+ ppl_version_beta(?C_int)
+</CODE>
+
+<CODE>
+ ppl_version(?Atom)
+</CODE>
+
+<CODE>
+ ppl_banner(?Atom)
+</CODE>
+
+<CODE>
+ ppl_max_space_dimension(?Dimension_Type)
+</CODE>
+
+<CODE>
+ ppl_Coefficient_is_bounded
+</CODE>
+
+<CODE>
+ ppl_Coefficient_max(?Coefficient)
+</CODE>
+
+<CODE>
+ ppl_Coefficient_min(?Coefficient)
+</CODE>
+
+<CODE>
+ ppl_initialize
+</CODE>
+
+<CODE>
+ ppl_finalize
+</CODE>
+
+<CODE>
+ ppl_set_timeout_exception_atom(+Atom)
+</CODE>
+
+<CODE>
+ ppl_set_timeout(+C_unsigned)
+</CODE>
+
+<CODE>
+ ppl_reset_timeout
+</CODE>
+
+<CODE>
+ ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+ +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+ +Universe_or_Empty, -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+ ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+ ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_delete_Polyhedron(+Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_get_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_get_minimized_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_get_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_get_minimized_generators(+Handle, -Generator_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_relation_with_constraint(+Handle, +Constraint, -Relation)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_relation_with_generator(+Handle, +Generator, -Relation)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_get_bounding_box(+Handle, +Complexity, -Box)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_is_empty(+Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_is_universe(+Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_is_bounded(+Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_bounds_from_above(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_bounds_from_below(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_maximize(+Handle, +Lin_Expr,
+ ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr,
+ ?Coefficient_1, ?Coefficient_2,
+ ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_minimize(+Handle, +Lin_Expr,
+ ?Coefficient_1, ?Coefficient_2, ?Boolean)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr,
+ ?Coefficient_1, ?Coefficient_2,
+ ?Boolean, ?Point)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_is_topologically_closed(+Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_OK(+Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_generator(+Handle, +Generator)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_constraints_and_minimize(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_generators(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_generators_and_minimize(+Handle, +Generator_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_intersection_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_poly_hull_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_poly_hull_assign_and_minimize(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_poly_difference_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_affine_image(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_affine_preimage(+Handle, +PPL_Var, +Lin_Expr, +Coefficient)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_bounded_affine_image(+Handle,
+ +PPL_Var,
+ +Lin_Expr_1,
+ +Lin_Expr_2,
+ +Coefficient)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_generalized_affine_image(+Handle,
+ +PPL_Var,
+ +Relation_Symbol,
+ +Lin_Expr,
+ +Coefficient)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs(+Handle,
+ +Lin_Expr_1,
+ +Relation_Symbol,
+ +Lin_Expr_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_time_elapse_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(+Handle_1, +Handle_2,
+ +C_unsigned_1, ?C_unsigned_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_BHRZ03_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+ +Handle_2,
+ +Constraint_System,
+ +C_unsigned_1,
+ ?C_unsigned_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+ +Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(+Handle_1,
+ +Handle_2,
+ +Constraint_System,
+ +C_unsigned_1,
+ ?C_unsigned_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(+Handle_1, +Handle_2,
+ +Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_H79_widening_assign_with_tokens(+Handle_1, +Handle_2,
+ +C_unsigned_1,
+ ?C_unsigned_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_H79_widening_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(+Handle_1,
+ +Handle_2,
+ +Constraint_System,
+ +C_unsigned_1,
+ ?C_unsigned_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_limited_H79_extrapolation_assign(+Handle_1, +Handle_2,
+ +Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(+Handle_1,
+ +Handle_2,
+ +Constraint_System,
+ +C_unsigned_1,
+ ?C_unsigned_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_bounded_H79_extrapolation_assign(+Handle_1, +Handle_2,
+ +Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_topological_closure_assign(+Handle)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_space_dimensions_and_embed(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_add_space_dimensions_and_project(+Handle, +Dimension_Type)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_concatenate_assign(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_remove_space_dimensions(+Handle, +List_of_PPL_Vars)
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type))
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE>
+
+<CODE>
+ ppl_Polyhedron_map_space_dimensions(+Handle, +P_Func))
+</CODE>
+
+<CODE>
+ ppl_new_LP_Problem_trivial(-Handle)
+</CODE>
+
+<CODE>
+ ppl_new_LP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+ -Handle)
+</CODE>
+
+<CODE>
+ ppl_new_LP_Problem_from_LP_Problem(+Handle_1, -Handle_2)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_swap(+Handle_1, +Handle_2)
+</CODE>
+
+<CODE>
+ ppl_delete_LP_Problem(+Handle)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_constraints(+Handle, -Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_clear(+Handle)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_add_constraint(+Handle, +Constraint)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_is_satisfiable(+Handle)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_solve(+Handle, ?LP_Problem_Status)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_feasible_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_optimizing_point(+Handle, -Generator)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_evaluate_objective_function(+Handle, +Generator,
+ ?Coefficient_1, ?Coefficient_2)
+</CODE>
+
+<CODE>
+ ppl_LP_Problem_OK(+Handle)
+</CODE>
+
+
+<H2>PPL 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
+
+ Coefficient --> 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
+ | Coefficient
+ | Lin_Expr unary plus
+ | - Lin_Expr unary minus
+ | Lin_Expr + Lin_Expr addition
+ | Lin_Expr - Lin_Expr subtraction
+ | Coefficient * Lin_Expr multiplication
+ | Lin_Expr * Coefficient 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]
+
+ Generator_Denominator --> Coefficient must be non-zero
+ | Coefficient
+ | - Coefficient
+
+ 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]
+
+ Atom --> Prolog atom
+
+ Universe_or_Empty polyhedron
+ --> universe
+ | empty
+
+ Poly_Relation polyhedron relation:
+ --> is_disjoint with a constraint
+ | strictly_intersects with a constraint
+ | is_included with a constraint
+ | saturates with a constraint
+ | subsumes with a generator
+
+ Poly_Relation_List list of polyhedron relations
+ --> []
+ | [Poly_Relation | Poly_Relation_List]
+
+ Complexity --> polynomial | simplex | any
+
+ Rational_Numerator
+ --> Coefficient | - Coefficient
+
+ Rational_Denominator
+ --> Coefficient must be non-zero
+
+ Rational --> Rational_Numerator rational number
+ | Rational_Numerator/Rational_Denominator
+
+ Bound --> c(Rational) closed rational limit
+ | o(Rational) open rational limit
+ | o(pinf) unbounded in the positive direction
+ | o(minf) unbounded in the negative direction
+
+ Interval --> i(Bound, Bound) rational interval
+
+ Box --> [] list of intervals
+ | [Interval | Box]
+
+ Vars_Pair --> PPLVar - PPLVar map relation
+
+ P_Func --> [] list of map relations
+ | [Vars_Pair | P_Func].
+
+ Optimization_Mode
+ --> max | min
+
+ LP_Problem_Status
+ --> unfeasible | unbounded | optimized
+\endcode
+
+\anchor predicates
+Below is a short description of each of the interface predicates.
+For full definitions of terminology used here, see Sections
+\ref preamble, \ref convex_polys, \ref representation
+and \ref Operations_on_Convex_Polyhedra of this manual.
+
+
+<H2><CODE> ppl_version_major(?C_int) </CODE></H2>
+ Unifies <CODE>C_int</CODE> with the major number of the PPL version.
+
+<H2><CODE> ppl_version_minor(?C_int) </CODE></H2>
+ Unifies <CODE>C_int</CODE> with the minor number of the PPL version.
+
+<H2><CODE> ppl_version_revision(?C_int) </CODE></H2>
+ Unifies <CODE>C_int</CODE> with the revision number
+ of the PPL version.
+
+<H2><CODE> ppl_version_beta(?C_int) </CODE></H2>
+ Unifies <CODE>C_int</CODE> with the beta number of the PPL version.
+
+<H2><CODE> ppl_version(?Atom) </CODE></H2>
+ Unifies <CODE>Atom</CODE> with the PPL version.
+
+<H2><CODE> ppl_banner(?Atom) </CODE></H2>
+ 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.
+
+<H2><CODE> ppl_Coefficient_is_bounded </CODE></H2>
+
+ Succeeds if and only if the Coefficients in the C++ interface are bounded.
+
+<H2><CODE> ppl_Coefficient_max(Max) </CODE></H2>
+
+ 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.
+
+<H2><CODE> ppl_Coefficient_min(Min) </CODE></H2>
+
+ 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.
+
+<H2><CODE> ppl_max_space_dimension(?Dimension_Type) </CODE></H2>
+
+ Unifies <CODE>Dimension_Type</CODE> with the maximum space dimension
+ this library can handle.
+
+<H2><CODE>
+ ppl_initialize
+ </CODE></H2>
+
+ Initializes the PPL interface.
+ Multiple calls to <CODE>ppl_initialize</CODE> does no harm.
+
+<H2><CODE>
+ ppl_finalize
+ </CODE></H2>
+
+ 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.
+
+<H2><CODE> ppl_set_timeout_exception_atom(+Atom) </CODE></H2>
+
+ Sets the atom to be thrown by timeout exceptions
+ to <CODE>Atom</CODE>.
+ The default value is <CODE>time_out</CODE>.
+
+<H2><CODE> ppl_timeout_exception_atom(?Atom) </CODE></H2>
+
+ The atom to be thrown by timeout exceptions
+ is unified with <CODE>Atom</CODE>.
+
+<H2><CODE> ppl_set_timeout(+C_unsigned) </CODE></H2>
+
+ Computations taking exponential time will be interrupted
+ some time after <CODE>C_unsigned</CODE> ms after that call.
+ If the computation is interrupted that way, the current timeout
+ exception atom will be thrown.
+ <CODE>C_unsigned</CODE> must be strictly greater than zero.
+
+<H2><CODE> ppl_reset_timeout </CODE></H2>
+
+ Resets the timeout time so that the computation is not interrupted.
+
+<H2><CODE>
+ ppl_new_C_Polyhedron_from_space_dimension(+Dimension_Type,
+ +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+ Creates a C polyhedron \f$\cP\f$
+ with <CODE>Dimension_Type</CODE> dimensions; it is empty
+ or the universe polyhedron depending on whether <CODE>Atom</CODE>
+ is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+ <CODE>Handle</CODE> 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 \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+ ppl_new_NNC_Polyhedron_from_space_dimension(+Dimension_Type,
+ +Universe_or_Empty, -Handle)
+</CODE>
+</H2>
+
+ Creates an NNC polyhedron \f$\cP\f$
+ with <CODE>Dimension_Type</CODE> dimensions; it is empty
+ or the universe polyhedron depending on whether <CODE>Atom</CODE>
+ is <CODE>empty</CODE> or <CODE>universe</CODE>, respectively.
+ <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+ Thus the query
+\code
+ ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X).
+\endcode
+ creates an empty NNC polyhedron embedded in \f$\Rset^3\f$ with
+ \p X bound to a valid handle for accessing it.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+ If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+ then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+ <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+ If <CODE>Handle_1</CODE> refers to an NNC polyhedron \f$\cP_1\f$,
+ then this creates a copy of \f$\cP_1\f$ as a C polyhedron \f$\cP_2\f$.
+ <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+ Thus the query
+\code
+ ?- ppl_new_NNC_Polyhedron_from_space_dimension(3, empty, X),
+ ppl_new_C_Polyhedron_from_NNC_Polyhedron(X, Y).
+\endcode
+ creates an empty NNC polyhedron embedded in \f$\Rset^3\f$
+ referenced by \p X
+ and then makes a copy, converting the topology to a C polyhedron.
+ with \p Y bound to a valid handle for accessing it.
+
+ When using <CODE>ppl_new_C_Polyhedron_from_NNC_Polyhedron/2</CODE>,
+ care must be taken that the source polyhedron referenced by
+ <CODE>Handle_1</CODE> is topologically closed.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+ If <CODE>Handle_1</CODE> refers to a C polyhedron \f$\cP_1\f$,
+ then this creates a copy of \f$\cP_1\f$ as an NNC polyhedron \f$\cP_2\f$.
+ <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(+Handle_1, -Handle_2)
+ </CODE></H2>
+
+ If <CODE>Handle_1</CODE> refers to a NNC polyhedron \f$\cP_1\f$,
+ then this creates a copy \f$\cP_2\f$ of \f$\cP_1\f$.
+ <CODE>Handle_2</CODE> is unified with the handle for \f$\cP_2\f$.
+
+<H2><CODE>
+ ppl_new_C_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+ Creates a C polyhedron \f$\cP\f$ represented by
+ <CODE>Constraint_System</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+ ppl_new_NNC_Polyhedron_from_constraints(+Constraint_System, -Handle)
+ </CODE></H2>
+
+ Creates an NNC polyhedron \f$\cP\f$ represented by
+ <CODE>Constraint_System</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+ ppl_new_C_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+ Creates a C polyhedron \f$\cP\f$ represented by
+ <CODE>Generator_System</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+ ppl_new_NNC_Polyhedron_from_generators(+Generator_System, -Handle)
+ </CODE></H2>
+
+ Creates an NNC polyhedron \f$\cP\f$ represented by
+ <CODE>Generator_System</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE>
+ ppl_new_C_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+ Creates a C polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+ There must be no bounds of the form <CODE>o(Rational)</CODE>
+ in an interval in <CODE>Box</CODE>.
+
+<H2><CODE>
+ ppl_new_NNC_Polyhedron_from_bounding_box(+Box, -Handle)
+ </CODE></H2>
+
+ Creates an NNC polyhedron \f$\cP\f$ represented by <CODE>Box</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\cP\f$.
+
+<H2><CODE> ppl_Polyhedron_swap(+Handle_1, +Handle_2) </CODE></H2>
+
+ Swaps the polyhedron referenced by <CODE>Handle_1</CODE>
+ with the one referenced by <CODE>Handle_2</CODE>.
+ The polyhedra \f$\cP\f$ and \f$\cQ\f$ must have the same topology.
+
+<H2><CODE> ppl_delete_Polyhedron(+Handle) </CODE></H2>
+
+ Deletes the polyhedron referenced by <CODE>Handle</CODE>.
+ After execution,
+ <CODE>Handle</CODE> is no longer a valid handle for a PPL polyhedron.
+
+<H2><CODE> ppl_Polyhedron_space_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+ Unifies the dimension of the vector space in which the
+ polyhedron referenced by
+ <CODE>Handle</CODE> is embedded with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_dimension(+Handle, ?Dimension_Type) </CODE></H2>
+
+ Unifies the actual dimension of the polyhedron referenced by
+ <CODE>Handle</CODE> with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE> ppl_Polyhedron_get_constraints(+Handle, ?Constraint_System)
+ </CODE></H2>
+
+ Unifies <CODE>Constraint_System</CODE> with 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,
+ ?Constraint_System)
+ </CODE></H2>
+
+ Unifies <CODE>Constraint_System</CODE> with 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, ?Generator_System)
+ </CODE></H2>
+
+ Unifies <CODE>Generator_System</CODE> with 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,
+ ?Generator_System)
+ </CODE></H2>
+
+ Unifies <CODE>Generator_System</CODE> with 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,
+ ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Constraint</CODE>. The possible relations are listed in the
+grammar rules above; their meaning is given in Section
+\ref relation_with "specifying the relation_with operations".
+
+<H2><CODE> ppl_Polyhedron_relation_with_generator(+Handle, +Generator,
+ ?Poly_Relation_List) </CODE></H2>
+
+Unifies <CODE>Poly_Relation_List</CODE> with the list of relations the
+polyhedron referenced by <CODE>Handle</CODE> has with
+<CODE>Generator</CODE>. The possible relations are listed in the
+grammar rules above; their meaning is given in
+Section \ref relation_with "specifying the relation_with operations".
+
+<H2><CODE> ppl_Polyhedron_get_bounding_box(+Handle,
+ +Complexity,
+ ?Box) </CODE></H2>
+
+ Succeeds if and only if the bounding box
+ of the polyhedron referenced by
+ <CODE>Handle</CODE>
+ unifies with the box defined by <CODE>Box</CODE>.
+ E.g.,
+\code
+ ?- A = '$VAR'(0), B = '$VAR'(1),
+ ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+ ppl_Polyhedron_get_bounding_box(X, any, Box).
+
+ Box = [i(o(minf), c(1/2)), i(o(0), o(pinf))].
+\endcode
+Note that the rational numbers in <CODE>Box</CODE> are in canonical form.
+E.g., the following will fail:
+\code
+ ?- A = '$VAR'(0), B = '$VAR'(1),
+ ppl_new_NNC_Polyhedron_from_constraints([B > 0, 4*A =< 2], X),
+ ppl_Polyhedron_get_bounding_box(X, any, Box),
+ Box = [i(o(minf), c(2/4)), i(o(0), o(pinf))].
+\endcode
+
+The complexity class <CODE>Complexity</CODE> determining the algorithm
+to be used has the following meaning:
+- <CODE>polynomial</CODE> allows
+ code of the worst-case polynomial complexity class;
+- <CODE>simplex</CODE> allows
+ code of the worst-case exponential but typically polynomial
+ complexity class;
+- <CODE>any</CODE> allows
+ code of the universal complexity class.
+
+<H2><CODE> ppl_Polyhedron_is_empty(+Handle) </CODE></H2>
+
+ Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle</CODE> is empty.
+
+<H2><CODE> ppl_Polyhedron_is_universe(+Handle) </CODE></H2>
+
+ Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle</CODE> is the universe.
+
+<H2><CODE> ppl_Polyhedron_is_bounded(+Handle) </CODE></H2>
+
+ Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle</CODE> is bounded.
+
+<H2><CODE> ppl_Polyhedron_bounds_from_above(+Handle,
+ +Lin_Expr) </CODE></H2>
+
+ Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from above in
+ the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H2><CODE> ppl_Polyhedron_bounds_from_below(+Handle,
+ +Lin_Expr) </CODE></H2>
+
+ Succeeds if and only if <CODE>Lin_Expr</CODE> is bounded from below in
+ the polyhedron referenced by <CODE>Handle</CODE>.
+
+
+<H3><CODE>
+ ppl_Polyhedron_maximize(+Handle, +Lin_Expr, ?Coefficient_1,
+ ?Coefficient_2, ?Boolean)
+ </CODE></H3>
+
+ Succeeds if and only 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$.
+
+ <CODE>Coefficient_1</CODE> is unified with the numerator of
+ the supremum value and <CODE>Coefficient_2</CODE> with the denominator
+ of the supremum value.
+ If the supremum is also the maximum,
+ <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+ and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+ ppl_Polyhedron_maximize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+ ?Coefficient_2, ?Boolean, ?Point)
+ </CODE></H2>
+
+ Succeeds if and only 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$.
+
+ <CODE>Coefficient_1</CODE> is unified with the numerator of
+ the supremum value,
+ <CODE>Coefficient_2</CODE> with the denominator of the supremum value,
+ and <CODE>Point</CODE> with a point or closure point where
+ <CODE>Lin_Expr</CODE> reaches this value.
+ If the supremum is also the maximum,
+ <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+ and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+ ppl_Polyhedron_minimize(+Handle, +Lin_Expr, ?Coefficient_1,
+ ?Coefficient_2, ?Boolean)
+</CODE></H2>
+
+ Succeeds if and only 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$.
+
+ <CODE>Coefficient_1</CODE> is unified with the numerator of the infimum value
+ and <CODE>Coefficient_2</CODE> with the denominator of the infimum value.
+ If the infimum is also the minimum,
+ <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+ and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE>
+ ppl_Polyhedron_minimize_with_point(+Handle, +Lin_Expr, ?Coefficient_1,
+ ?Coefficient_2, ?Boolean, ?Point)
+</CODE></H2>
+
+ Succeeds if and only 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$.
+
+ <CODE>Coefficient_1</CODE> is unified with the numerator of the
+ infimum value, <CODE>Coefficient_2</CODE> with the denominator of
+ the infimum value, and <CODE>Point</CODE> with a point or
+ closure point where <CODE>Lin_Expr</CODE> reaches this value.
+ If the infimum is also the minimum,
+ <CODE>Boolean</CODE> is unified with the atom <CODE>true</CODE>
+ and, otherwise, unified with the atom <CODE>false</CODE>.
+
+<H2><CODE> ppl_Polyhedron_is_topologically_closed(+Handle) </CODE></H2>
+
+ Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle</CODE> is topologically closed.
+
+<H2><CODE> ppl_Polyhedron_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+ 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>.
+
+<H2><CODE> ppl_Polyhedron_strictly_contains_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+ 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>.
+
+<H2><CODE> ppl_Polyhedron_is_disjoint_from_Polyhedron(+Handle_1, +Handle_2)
+ </CODE></H2>
+
+ Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle_1</CODE> is disjoint from
+ the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_equals_Polyhedron(+Handle_1, +Handle_2) </CODE></H2>
+
+ Succeeds if and only if the polyhedron referenced by
+ <CODE>Handle_1</CODE> is
+ equal to the polyhedron referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE> ppl_Polyhedron_OK(+Handle) </CODE></H2>
+
+ Succeeds only if the polyhedron referenced by
+ <CODE>Handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants. Useful for debugging purposes.
+
+<H2><CODE> ppl_Polyhedron_add_constraint(+Handle, +Constraint) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_constraint_and_minimize(+Handle, +Constraint) </CODE></H2>
+
+ Updates the polyhedron referenced by <CODE>Handle</CODE> to
+ one obtained by adding
+ <CODE>Constraint</CODE> to its constraint system.
+ Thus, the query
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+ A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+ ppl_Polyhedron_add_constraint(X, 4*A + B - 2*C >= 5).
+\endcode
+ will update the polyhedron with handle \p X to consist of
+ the set of points
+ in the vector space \f$\Rset^3\f$ satisfying the constraint
+ \f$4x + y - 2z >= 5\f$.
+
+ Note that <CODE>ppl_Polyhedron_add_constraint_and_minimize/2</CODE>
+ will fail if, after adding the constraint, the polyhedron is empty.
+
+<H2><CODE> ppl_Polyhedron_add_generator(+Handle, +Generator) </CODE></H2>
+
+<H2><CODE> ppl_Polyhedron_add_generator_and_minimize(+Handle, +Generator) </CODE></H2>
+
+ Updates the polyhedron referenced by <CODE>Handle</CODE> to
+ one obtained by adding
+ <CODE>Generator</CODE> to its generator system.
+ Thus, after the query
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(3, universe, X),
+ A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+ ppl_Polyhedron_add_generator(X, point(-100*A - 5*B, 8)).
+\endcode
+ will update the polyhedron with handle \p X to be the single point
+ \f$(-12.5, -0.625, 0)^\transpose\f$ in the vector space \f$\Rset^3\f$.
+
+<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>.
+ E.g.,
+\code
+ | ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+ A = '$VAR'(0), B = '$VAR'(1),
+ ppl_Polyhedron_add_constraints(X, [4*A + B >= 3, A = 1]),
+ ppl_Polyhedron_get_constraints(X, CS).
+
+ CS = [4*A+1*B>=3,1*A=1] ?
+\endcode
+The updated polyhedron referenced by <CODE>Handle</CODE> can be empty
+and a query will succeed even when
+<CODE>Constraint_System</CODE> is unsatisfiable.
+
+<H2><CODE> ppl_Polyhedron_add_constraints_and_minimize(+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>.
+ E.g.,
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+ A = '$VAR'(0), B = '$VAR'(1),
+ ppl_Polyhedron_add_constraints_and_minimize(X, [4*A + B >= 3, A = 1]),
+ ppl_Polyhedron_get_constraints(X, CS).
+
+ CS = [1*B>= -1,1*A=1]
+\endcode This will fail if, after adding the constraints, the polyhedron is empty.
+ E.g., the following will fail,
+\code
+ ?- A = '$VAR'(0), B = '$VAR'(1),
+ ppl_new_C_Polyhedron_from_space_dimension(2, universe, X),
+ ppl_Polyhedron_add_constraints_and_minimize(X,
+ [4*A + B >= 3, A = 0, B =< 0]),
+ ppl_Polyhedron_get_constraints(X, CS).
+\endcode
+<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>.
+
+ If the system of generators representing a polyhedron
+ is non-empty, then it must include a point
+ (see Section \ref Generators_Representation).
+ Thus care must be taken to ensure that, before calling this
+ predicate, either the polyhedron referenced by <CODE>Handle</CODE>
+ is non-empty or that whenever <CODE>Generator_System</CODE> is
+ non-empty the first element defines a point.
+ E.g.,
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+ A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+ ppl_Polyhedron_add_generators(X,
+ [point(1*A + 1*B + 1*C, 1), ray(1*A), ray(2*A)]),
+ ppl_Polyhedron_get_generators(X, GS).
+
+ GS = [ray(2*A), point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_generators_and_minimize(+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>.
+
+ Unlike the predicate <CODE>ppl_add_generators</CODE>,
+ the order of the generators in
+ <CODE>Generator_System</CODE> is not important.
+ E.g.,
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+ A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+ ppl_Polyhedron_add_generators_and_minimize(X,
+ [ray(1*A), ray(2*A), point(1*A + 1*B + 1*C, 1)]),
+ ppl_Polyhedron_get_generators(X, GS).
+
+ GS = [point(1*A+1*B+1*C), ray(1*A)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_intersection_assign(+Handle_1, +Handle_2) </CODE></H2>
+<H2><CODE> ppl_Polyhedron_intersection_assign_and_minimize(+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>
+<H2><CODE> ppl_Polyhedron_poly_hull_assign_and_minimize(+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, +PPL_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>PPL_Var</CODE>.
+
+<H2><CODE> ppl_Polyhedron_affine_preimage(+Handle, +PPL_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,
+ +PPL_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 <= PPL_Var <= Lin_Expr_2/Coefficient</CODE>.
+
+<H2><CODE> ppl_Polyhedron_generalized_affine_image(+Handle,
+ +PPL_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>PPL_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, ?C_unsigned_2) </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,
+ <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+ <BR>
+ If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+ will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+ depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+ <BR>
+ If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+ and the polyhedron referenced by <CODE>Handle_1</CODE> is
+ updated to \f$\cP\f$.
+ <BR>
+ In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+ will remain unchanged as \f$\cP_2\f$.
+
+<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,
+ ?C_unsigned_2) </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,
+ <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+ <BR>
+ If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+ will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+ depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+ <BR>
+ If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+ and the polyhedron referenced by <CODE>Handle_1</CODE> is
+ updated to \f$\cP\f$.
+ <BR>
+ In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+ will remain unchanged as \f$\cP_2\f$.
+
+<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,
+ ?C_unsigned_2) </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,
+ <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+ <BR>
+ If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+ will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+ depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+ <BR>
+ If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+ and the polyhedron referenced by <CODE>Handle_1</CODE> is
+ updated to \f$\cP\f$.
+ <BR>
+ In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+ will remain unchanged as \f$\cP_2\f$.
+
+<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, ?C_unsigned_2) </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$,
+ <BR>
+ Assuming that the quantity \f$t_1\f$ given by <CODE>C_unsigned_1</CODE>
+ is the number of tokens available,
+ <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+ <BR>
+ If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+ will remain as \f$\cP_1\f$and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+ depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+ <BR>
+ If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+ and the polyhedron referenced by <CODE>Handle_1</CODE> is
+ updated to \f$\cP\f$.
+ <BR>
+ In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+ will remain unchanged as \f$\cP_2\f$.
+
+<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,
+ ?C_unsigned_2) </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,
+ <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+ <BR>
+ If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+ will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+ depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+ <BR>
+ If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+ and the polyhedron referenced by <CODE>Handle_1</CODE> is
+ updated to \f$\cP\f$.
+ <BR>
+ In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+ will remain unchanged as \f$\cP_2\f$.
+
+<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,
+ ?C_unsigned_2) </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,
+ <CODE>C_unsigned_2</CODE> will be unified with the number of tokens
+ \f$t_2\f$ remaining at the end of the operation.
+ <BR>
+ If \f$t_1 > 0 \f$, then the polyhedron referenced by <CODE>Handle_1</CODE>
+ will remain as \f$\cP_1\f$ and either \f$t_2 = t_1 - 1\f$ or \f$t_2 = t_1\f$
+ depending on whether or not \f$\cP\f$ is different from \f$\cP_1\f$ itself.
+ <BR>
+ If \f$t_1 = 0\f$, then \f$t_2 = 0\f$
+ and the polyhedron referenced by <CODE>Handle_1</CODE> is
+ updated to \f$\cP\f$.
+ <BR>
+ In all cases, the polyhedron referenced by <CODE>Handle_2</CODE>
+ will remain unchanged as \f$\cP_2\f$.
+
+<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, +Dimension_Type)
+ </CODE></H2>
+
+ Embeds the polyhedron referenced by <CODE>Handle</CODE>
+ in a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+ E.g.,
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+ ppl_Polyhedron_add_space_dimensions_and_embed(X, 2),
+ ppl_Polyhedron_get_constraints(X, CS),
+ ppl_Polyhedron_get_generators(X, GS).
+
+ CS = [],
+ GS = [point(0),line(1*A),line(1*B)]
+\endcode
+
+<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$.
+
+ E.g.,
+\code
+ ?- ppl_new_NNC_Polyhedron_from_space_dimension(2, universe, X),
+ A = '$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+ D = '$VAR'(3), E = '$VAR'(4),
+ ppl_new_NNC_Polyhedron_from_constraints([A > 1, B >= 0, C >= 0], Y),
+ ppl_Polyhedron_concatenate_assign(X, Y),
+ ppl_Polyhedron_get_constraints(X, CS).
+
+ CS = [1*C > 1, 1*D >= 0, 1*E >= 0]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_add_space_dimensions_and_project(+Handle,
+ +Dimension_Type)
+ </CODE></H2>
+
+ Projects the polyhedron referenced by <CODE>Handle</CODE>
+ onto a space that is enlarged by <CODE>Dimension_Type</CODE> dimensions,
+ E.g.,
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(0, empty, X),
+ ppl_Polyhedron_add_space_dimensions_and_project(X, 2),
+ ppl_Polyhedron_get_constraints(X, CS),
+ ppl_Polyhedron_get_generators(X, GS).
+
+ CS = [1*A = 0, 1*B = 0],
+ GS = [point(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_space_dimensions(+Handle,
+ +List_of_PPL_Vars) </CODE></H2>
+
+ Removes the space dimensions given by the identifiers of the
+ PPL variables in list <CODE>List_of_PPL_Vars</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.
+ E.g.,
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(3, empty, X),
+ A='$VAR'(0), B = '$VAR'(1), C = '$VAR'(2),
+ ppl_Polyhedron_remove_space_dimensions(X, [B]),
+ ppl_Polyhedron_space_dimension(X, K),
+ ppl_Polyhedron_get_generators(X, GS).
+
+ K = 2,
+ GS = [point(0),line(1*A),line(1*B),line(0)]
+\endcode
+
+<H2><CODE> ppl_Polyhedron_remove_higher_space_dimensions(+Handle, +Dimension_Type)) </CODE></H2>
+
+ Projects the polyhedron referenced to by <CODE>Handle</CODE>
+ onto the first <CODE>Dimension_Type</CODE> dimension.
+ E.g.,
+\code
+ ?- ppl_new_C_Polyhedron_from_space_dimension(5, empty, X),
+ ppl_Polyhedron_remove_higher_space_dimensions(X, 3),
+ ppl_Polyhedron_space_dimension(X, K).
+\endcode
+
+<H2><CODE>
+ ppl_Polyhedron_expand_space_dimension(+Handle, +PPL_Var, +Dimension_Type))
+</CODE></H2>
+
+ <CODE>Dimension_Type</CODE> copies of the space dimension referenced by
+ <CODE>PPL_Var</CODE> are added to the polyhedron
+ referenced to by <CODE>Handle</CODE>.
+
+<H2><CODE>
+ ppl_Polyhedron_fold_space_dimensions(+Handle, +List_of_PPL_Vars, +PPL_Var))
+</CODE></H2>
+
+ The space dimensions referenced by the PPL variables in list
+ <CODE>List_of_PPL_Vars</CODE> are folded into the dimension referenced
+ by <CODE>PPL_Var</CODE> and removed.
+ The result is undefined if <CODE>List_of_PPL_Vars</CODE>
+ does not have the properties described in
+ Section \ref fold_space_dimensions.
+
+<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 <CODE>P_Func</CODE>.
+ The result is undefined if \p P_Func does not encode a partial
+ function with the properties described in
+ Section \ref Mapping_the_Dimensions_of_the_Vector_Space
+ "specifying the map_space_dimensions operator".
+
+<H2><CODE>
+ ppl_new_LP_Problem_trivial(-Handle)
+</CODE></H2>
+
+ Creates an LP Problem \f$\mathrm{LP}\f$ with
+ the feasible region the \f$0\f$-dimensional universe,
+ objective function \f$0\f$ and optimization mode <CODE>max</CODE>.
+ <CODE>Handle</CODE> is unified with the handle for \f$\mathrm{LP}\f$.
+
+<H2><CODE>
+ ppl_new_LP_Problem(+Constraint_System, +Lin_Expr, +Optimization_Mode,
+ -Handle)
+</CODE></H2>
+
+ Creates an LP Problem \f$\mathrm{LP}\f$ with
+ the feasible region 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{LP}\f$.
+
+<H2><CODE>
+ ppl_LP_Problem_swap(+Handle_1, +Handle_2)
+</CODE></H2>
+
+ Swaps the LP Problem referenced by <CODE>Handle_1</CODE>
+ with the one referenced by <CODE>Handle_2</CODE>.
+
+<H2><CODE>
+ ppl_delete_LP_Problem(+Handle)
+</CODE></H2>
+
+ Deletes the LP Problem referenced by <CODE>Handle</CODE>.
+ After execution,
+ <CODE>Handle</CODE> is no longer a valid handle for a PPL LP Problem.
+
+<H2><CODE>
+ ppl_LP_Problem_space_dimension(+Handle, ?Dimension_Type)
+</CODE></H2>
+
+ Unifies the dimension of the vector space in which the
+ LP Problem referenced by <CODE>Handle</CODE> is embedded
+ with <CODE>Dimension_Type</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_constraints(+Handle, -Constraint_System)
+</CODE></H2>
+
+ Unifies <CODE>Constraint_System</CODE> with a list of
+ the constraints in the constraints system
+ representing the feasible region for the LP Problem
+ referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_objective_function(+Handle, -Lin_Expr)
+</CODE></H2>
+
+ Unifies <CODE>Lin_Expr</CODE> with the objective function
+ for the LP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_optimization_mode(+Handle, ?Optimization_Mode)
+</CODE></H2>
+
+ Unifies <CODE>Optimization_Mode</CODE> with the optimization mode
+ for the LP Problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_clear(+Handle)
+</CODE></H2>
+
+ Resets the LP 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>.
+
+<H2><CODE>
+ ppl_LP_Problem_add_constraint(+Handle, +Constraint)
+</CODE></H2>
+
+ Updates the LP 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_LP_Problem_add_constraints(+Handle, +Constraint_System)
+</CODE></H2>
+
+ Updates the LP 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_LP_Problem_set_objective_function(+Handle, +Lin_Expr)
+</CODE></H2>
+
+ Updates the LP Problem referenced by <CODE>Handle</CODE>
+ so that the objective function is changed to <CODE>Lin_Expr</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_set_optimization_mode(+Handle, +Optimization_Mode)
+</CODE></H2>
+
+ Updates the LP Problem referenced by <CODE>Handle</CODE>
+ so that the optimization mode is changed to <CODE>Optimization_Mode</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_is_satisfiable(+Handle)
+</CODE></H2>
+
+ Succeeds if and only if the LP Problem referenced by
+ <CODE>Handle</CODE> is satisfiable.
+
+<H2><CODE>
+ ppl_LP_Problem_solve(+Handle, ?LP_Problem_Status)
+</CODE></H2>
+
+ Solves the LP problem referenced by
+ <CODE>Handle</CODE> and unifies <CODE>LP_Problem_Status</CODE>
+ with:
+ <CODE>unfeasible</CODE>, if the LP problem is not satisfiable;
+ <CODE>unbounded</CODE>, if the LP problem is satisfiable but
+ there is no finite bound to the value of the objective function;
+ <CODE>optimized</CODE>, if the LP problem admits an optimal solution.
+
+<H2><CODE>
+ ppl_LP_Problem_feasible_point(+Handle, ?Generator)
+</CODE></H2>
+
+ Unifies <CODE>Generator</CODE> with a feasible point for the LP problem
+ referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_optimizing_point(+Handle, ?Generator)
+</CODE></H2>
+
+ Unifies <CODE>Generator</CODE> with an optimizing point for the LP problem
+ referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_optimal_value(+Handle, ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+
+ Unifies <CODE>Coefficient_1</CODE> and <CODE>Coefficient_2</CODE>
+ with the numerator and denominator, respectively, for the optimal value
+ for the LP problem referenced by <CODE>Handle</CODE>.
+
+<H2><CODE>
+ ppl_LP_Problem_evaluate_objective_function(+Handle, +Generator,
+ ?Coefficient_1, ?Coefficient_2)
+</CODE></H2>
+ Evaluates the objective function of the LP 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>.
+
+<H2><CODE>
+ ppl_LP_Problem_OK(+Handle)
+</CODE></H2>
+
+ Succeeds only if the LP Problem referenced by
+ <CODE>Handle</CODE> is well formed, i.e., if it
+ satisfies all its implementation invariants. Useful for debugging purposes.
+
+\anchor PI_Compilation
+<H1>Compilation and Installation</H1>
+
+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.
+
+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
+
+
+\anchor PI_SD_Features
+<H1>System-Dependent Features</H1>
+
+<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
+
+<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
+
+
+<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.
+
+
+<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.
+
+
+<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.
+
+
+<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.
+
+*/ /* \defgroup PrologInterface */
diff --git a/interfaces/Prolog/SICStus/Makefile.am b/interfaces/Prolog/SICStus/Makefile.am
new file mode 100644
index 0000000..e5db3ea
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.am
@@ -0,0 +1,162 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+
+EXTRA_DIST = \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus_sd.cc \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl
+
+if BUILD_SICSTUS_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+bin_PROGRAMS = ppl_sicstus
+ppl_sicstus_SOURCES =
+
+if ENABLE_SHARED
+
+pkglib_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+
+ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la .libs/ppl_sicstus_sd.o
+ $(LIBTOOL) --mode=link --tag=CXX \
+ splfr $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o -o $@ \
+ $(top_builddir)/src/libppl.la \
+ $(top_builddir)/Watchdog/src/libpwl.la \
+ @extra_libraries@
+
+install-data-local: ppl_sicstus.so
+ $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+ $< $(DESTDIR)$(pkglibdir)/$<
+
+else !ENABLE_SHARED
+
+pkglib_DATA = ppl_sicstus.pl
+
+endif !ENABLE_SHARED
+
+noinst_LTLIBRARIES = ppl_sicstus_sd.la
+ppl_sicstus_sd_la_SOURCES = ppl_sicstus_sd.cc
+ppl_sicstus_sd_la_LDFLAGS = -module -avoid-version
+
+ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la
+ $(LIBTOOL) --mode=link --tag=CXX \
+ spld --main=prolog \
+ --cflag=`echo '$(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+ --resources=ppl_sicstus.s.o -o $@ \
+ $(top_builddir)/src/libppl.la \
+ $(top_builddir)/Watchdog/src/libpwl.la \
+ @extra_libraries@
+
+if ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl ppl_sicstus_sd.o
+ splfr --static $(srcdir)/ppl_sicstus.pl ppl_sicstus_sd.o
+
+else !ENABLE_STATIC
+
+ppl_sicstus.s.o: ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+ splfr --static $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+
+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
+
+pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ if [ $(srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/../tests/pl_check.pl . ;\
+ fi
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+ --goal "main." \
+ >obtained_pchk
+ if [ $(srcdir) != `pwd` ]; then \
+ rm -f pl_check.pl ;\
+ fi
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+# 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) | pl_check_test
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ $(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_test
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ $(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
+
+MOSTLYCLEANFILES = \
+ppl_sicstus.s.o ppl_sicstus.so \
+$(CLPQ_TESTS) \
+obtained_clpq obtained_clpq2 obtained_pchk
+
+endif BUILD_SICSTUS_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/SICStus/Makefile.in b/interfaces/Prolog/SICStus/Makefile.in
new file mode 100644
index 0000000..5f0bc02
--- /dev/null
+++ b/interfaces/Prolog/SICStus/Makefile.in
@@ -0,0 +1,742 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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_SICSTUS_PROLOG_INTERFACE_TRUE@bin_PROGRAMS = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ ppl_sicstus$(EXEEXT)
+subdir = interfaces/Prolog/SICStus
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+LTLIBRARIES = $(noinst_LTLIBRARIES)
+ppl_sicstus_sd_la_LIBADD =
+am__ppl_sicstus_sd_la_SOURCES_DIST = ppl_sicstus_sd.cc
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_ppl_sicstus_sd_la_OBJECTS = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ ppl_sicstus_sd.lo
+ppl_sicstus_sd_la_OBJECTS = $(am_ppl_sicstus_sd_la_OBJECTS)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@am_ppl_sicstus_sd_la_rpath =
+am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(pkglibdir)"
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_sicstus_OBJECTS =
+ppl_sicstus_OBJECTS = $(am_ppl_sicstus_OBJECTS)
+ppl_sicstus_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_sicstus_sd_la_SOURCES) $(ppl_sicstus_SOURCES)
+DIST_SOURCES = $(am__ppl_sicstus_sd_la_SOURCES_DIST) \
+ $(ppl_sicstus_SOURCES)
+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 = `echo $$p | sed -e 's|^.*/||'`;
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SICSTUS_CFLI_FILES = sicstus_cfli.h sicstus_cfli.ic sicstus_cfli.cc
+EXTRA_DIST = \
+$(SICSTUS_CFLI_FILES) \
+ppl_sicstus_sd.cc \
+ppl_sicstus.pl \
+sp_clpq.pl \
+sp_pl_check.pl
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(SICSTUS_PROLOG_INCLUDE_OPTIONS) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_SOURCES =
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_FALSE at pkglib_DATA = ppl_sicstus.pl
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_sicstus.pl ppl_sicstus.s.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@noinst_LTLIBRARIES = ppl_sicstus_sd.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd_la_SOURCES = ppl_sicstus_sd.cc
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus_sd_la_LDFLAGS = -module -avoid-version
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SICSTUS_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus.s.o ppl_sicstus.so \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SICStus/Makefile'; \
+ 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
+
+clean-noinstLTLIBRARIES:
+ -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+ @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+ppl_sicstus_sd.la: $(ppl_sicstus_sd_la_OBJECTS) $(ppl_sicstus_sd_la_DEPENDENCIES)
+ $(CXXLINK) $(am_ppl_sicstus_sd_la_rpath) $(ppl_sicstus_sd_la_LDFLAGS) $(ppl_sicstus_sd_la_OBJECTS) $(ppl_sicstus_sd_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@ppl_sicstus$(EXEEXT): $(ppl_sicstus_OBJECTS) $(ppl_sicstus_DEPENDENCIES)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@ @rm -f ppl_sicstus$(EXEEXT)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@ $(LINK) $(ppl_sicstus_LDFLAGS) $(ppl_sicstus_OBJECTS) $(ppl_sicstus_LDADD) $(LIBS)
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/ppl_sicstus_sd.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+uninstall-pkglibDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@check-local:
+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)$(pkglibdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@install-data-local:
+ 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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local
+
+install-exec-am: install-binPROGRAMS install-pkglibDATA
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am \
+ uninstall-pkglibDATA
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+ clean-binPROGRAMS clean-generic clean-libtool \
+ clean-noinstLTLIBRARIES ctags 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-exec install-exec-am install-info \
+ install-info-am install-man install-pkglibDATA 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 uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-pkglibDATA
+
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_sicstus.so: ppl_sicstus.pl $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la .libs/ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=link --tag=CXX \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ splfr $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(top_builddir)/src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ @extra_libraries@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at install-data-local: ppl_sicstus.so
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $< $(DESTDIR)$(pkglibdir)/$<
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ppl_sicstus$(EXEEXT): ppl_sicstus.s.o $(top_builddir)/src/libppl.la $(top_builddir)/Watchdog/src/libpwl.la
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=link --tag=CXX \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ spld --main=prolog \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ --cflag=`echo '$(AM_CXXFLAGS) $(CXXFLAGS)' | tr " " ","` \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ --resources=ppl_sicstus.s.o -o $@ \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ $(top_builddir)/src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ @extra_libraries@
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE at ppl_sicstus.s.o: ppl_sicstus.pl ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_TRUE@ splfr --static $(srcdir)/ppl_sicstus.pl ppl_sicstus_sd.o
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE at ppl_sicstus.s.o: ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@@ENABLE_STATIC_FALSE@ splfr --static $(srcdir)/ppl_sicstus.pl .libs/ppl_sicstus_sd.o
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@pl_check_test: ppl_sicstus ppl_sicstus.pl sp_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/../tests/pl_check.pl . ;\
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ ./ppl_sicstus -l $(srcdir)/sp_pl_check.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ --goal "main." \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ >obtained_pchk
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ rm -f pl_check.pl ;\
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+# 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
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@clpq_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ) | pl_check_test
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ LANG=C; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq')." \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ 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
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@clpq2_test: ppl_sicstus ppl_sicstus.pl sp_clpq.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2) | clpq_test
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ LANG=C; \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute -dlopen ../../../src/libppl.la \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ ./ppl_sicstus -l $(srcdir)/sp_clpq.pl \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ --goal "main('$(top_srcdir)/interfaces/Prolog/tests/clpq2')." \
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# 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_sicstus.pl b/interfaces/Prolog/SICStus/ppl_sicstus.pl
new file mode 100644
index 0000000..7f9904d
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_sicstus.pl
@@ -0,0 +1,29 @@
+/* Loader for the SICStus Prolog interface.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+foreign_resource(ppl_sicstus,
+[
+ init(ppl_sicstus_init),
+ deinit(ppl_sicstus_deinit)
+]).
+
+:- load_foreign_resource(ppl_sicstus).
diff --git a/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc b/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc
new file mode 100644
index 0000000..4ff3ab7
--- /dev/null
+++ b/interfaces/Prolog/SICStus/ppl_sicstus_sd.cc
@@ -0,0 +1,474 @@
+/* SICStus Prolog interface: system-dependent part.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include "sicstus_cfli.h"
+#include "../exceptions.hh"
+#include <cassert>
+#include <sstream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+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.
+*/
+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.
+*/
+long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+}
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+ assert(SP_is_integer(t));
+ long v;
+ if (SP_get_integer(t, &v) != 0)
+ return PPL::Coefficient(v);
+ else {
+ char* s;
+ if (SP_get_number_chars(t, &s) != 0)
+ return PPL::Coefficient(s);
+ else
+ throw unknown_interface_error("integer_term_to_Coefficient");
+ }
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ long l = 0;
+ if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) == PPL::V_EQ) {
+ if (SP_put_integer(t, l) == 0)
+ throw unknown_interface_error("Coefficient_to_integer_term()");
+ } else {
+ std::ostringstream s;
+ s << n;
+ if (SP_put_number_chars(t, s.str().c_str()) == 0)
+ throw unknown_interface_error("Coefficient_to_integer_term()");
+ }
+ return t;
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+#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); \
+}
+
+SP_STUB_1(ppl_version_major)
+SP_STUB_1(ppl_version_minor)
+SP_STUB_1(ppl_version_revision)
+SP_STUB_1(ppl_version_beta)
+SP_STUB_1(ppl_version)
+SP_STUB_1(ppl_banner)
+SP_STUB_1(ppl_max_space_dimension)
+SP_STUB_0(ppl_Coefficient_is_bounded)
+SP_STUB_1(ppl_Coefficient_max)
+SP_STUB_1(ppl_Coefficient_min)
+SP_STUB_0(ppl_initialize)
+SP_STUB_0(ppl_finalize)
+SP_STUB_1(ppl_set_timeout_exception_atom)
+SP_STUB_1(ppl_timeout_exception_atom)
+SP_STUB_1(ppl_set_timeout)
+SP_STUB_0(ppl_reset_timeout)
+SP_STUB_3(ppl_new_C_Polyhedron_from_space_dimension)
+SP_STUB_3(ppl_new_NNC_Polyhedron_from_space_dimension)
+SP_STUB_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
+SP_STUB_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
+SP_STUB_2(ppl_new_C_Polyhedron_from_constraints)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_constraints)
+SP_STUB_2(ppl_new_C_Polyhedron_from_generators)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_generators)
+SP_STUB_2(ppl_new_C_Polyhedron_from_bounding_box)
+SP_STUB_2(ppl_new_NNC_Polyhedron_from_bounding_box)
+SP_STUB_2(ppl_Polyhedron_swap)
+SP_STUB_1(ppl_delete_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_space_dimension)
+SP_STUB_2(ppl_Polyhedron_affine_dimension)
+SP_STUB_2(ppl_Polyhedron_get_constraints)
+SP_STUB_2(ppl_Polyhedron_get_minimized_constraints)
+SP_STUB_2(ppl_Polyhedron_get_generators)
+SP_STUB_2(ppl_Polyhedron_get_minimized_generators)
+SP_STUB_3(ppl_Polyhedron_relation_with_constraint)
+SP_STUB_3(ppl_Polyhedron_relation_with_generator)
+SP_STUB_3(ppl_Polyhedron_get_bounding_box)
+SP_STUB_1(ppl_Polyhedron_is_empty)
+SP_STUB_1(ppl_Polyhedron_is_universe)
+SP_STUB_1(ppl_Polyhedron_is_bounded)
+SP_STUB_2(ppl_Polyhedron_bounds_from_above)
+SP_STUB_2(ppl_Polyhedron_bounds_from_below)
+SP_STUB_5(ppl_Polyhedron_maximize)
+SP_STUB_6(ppl_Polyhedron_maximize_with_point)
+SP_STUB_5(ppl_Polyhedron_minimize)
+SP_STUB_6(ppl_Polyhedron_minimize_with_point)
+SP_STUB_1(ppl_Polyhedron_is_topologically_closed)
+SP_STUB_2(ppl_Polyhedron_contains_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_strictly_contains_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
+SP_STUB_2(ppl_Polyhedron_equals_Polyhedron)
+SP_STUB_1(ppl_Polyhedron_OK)
+SP_STUB_2(ppl_Polyhedron_add_constraint)
+SP_STUB_2(ppl_Polyhedron_add_constraint_and_minimize)
+SP_STUB_2(ppl_Polyhedron_add_generator)
+SP_STUB_2(ppl_Polyhedron_add_generator_and_minimize)
+SP_STUB_2(ppl_Polyhedron_add_constraints)
+SP_STUB_2(ppl_Polyhedron_add_constraints_and_minimize)
+SP_STUB_2(ppl_Polyhedron_add_generators)
+SP_STUB_2(ppl_Polyhedron_add_generators_and_minimize)
+SP_STUB_2(ppl_Polyhedron_intersection_assign)
+SP_STUB_2(ppl_Polyhedron_intersection_assign_and_minimize)
+SP_STUB_2(ppl_Polyhedron_poly_hull_assign)
+SP_STUB_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
+SP_STUB_2(ppl_Polyhedron_poly_difference_assign)
+SP_STUB_4(ppl_Polyhedron_affine_image)
+SP_STUB_4(ppl_Polyhedron_affine_preimage)
+SP_STUB_5(ppl_Polyhedron_bounded_affine_image)
+SP_STUB_5(ppl_Polyhedron_bounded_affine_preimage)
+SP_STUB_5(ppl_Polyhedron_generalized_affine_image)
+SP_STUB_5(ppl_Polyhedron_generalized_affine_preimage)
+SP_STUB_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
+SP_STUB_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
+SP_STUB_2(ppl_Polyhedron_time_elapse_assign)
+SP_STUB_1(ppl_Polyhedron_topological_closure_assign)
+SP_STUB_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
+SP_STUB_2(ppl_Polyhedron_BHRZ03_widening_assign)
+SP_STUB_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
+SP_STUB_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
+SP_STUB_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
+SP_STUB_2(ppl_Polyhedron_H79_widening_assign)
+SP_STUB_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
+SP_STUB_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
+SP_STUB_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
+SP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_project)
+SP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_embed)
+SP_STUB_2(ppl_Polyhedron_concatenate_assign)
+SP_STUB_2(ppl_Polyhedron_remove_space_dimensions)
+SP_STUB_2(ppl_Polyhedron_remove_higher_space_dimensions)
+SP_STUB_3(ppl_Polyhedron_expand_space_dimension)
+SP_STUB_3(ppl_Polyhedron_fold_space_dimensions)
+SP_STUB_2(ppl_Polyhedron_map_space_dimensions)
+SP_STUB_1(ppl_new_LP_Problem_trivial)
+SP_STUB_4(ppl_new_LP_Problem)
+SP_STUB_2(ppl_new_LP_Problem_from_LP_Problem)
+SP_STUB_2(ppl_LP_Problem_swap)
+SP_STUB_1(ppl_delete_LP_Problem)
+SP_STUB_2(ppl_LP_Problem_space_dimension)
+SP_STUB_2(ppl_LP_Problem_constraints)
+SP_STUB_2(ppl_LP_Problem_objective_function)
+SP_STUB_2(ppl_LP_Problem_optimization_mode)
+SP_STUB_1(ppl_LP_Problem_clear)
+SP_STUB_2(ppl_LP_Problem_add_constraint)
+SP_STUB_2(ppl_LP_Problem_add_constraints)
+SP_STUB_2(ppl_LP_Problem_set_objective_function)
+SP_STUB_2(ppl_LP_Problem_set_optimization_mode)
+SP_STUB_1(ppl_LP_Problem_is_satisfiable)
+SP_STUB_2(ppl_LP_Problem_solve)
+SP_STUB_2(ppl_LP_Problem_feasible_point)
+SP_STUB_2(ppl_LP_Problem_optimizing_point)
+SP_STUB_3(ppl_LP_Problem_optimal_value)
+SP_STUB_4(ppl_LP_Problem_evaluate_objective_function)
+SP_STUB_1(ppl_LP_Problem_OK)
+
+#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; i < sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); ++i) {
+ if (SP_register_atom(*prolog_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;
+ }
+ }
+ SP_DEFINE_C_PREDICATE(ppl_version_major, 1);
+ SP_DEFINE_C_PREDICATE(ppl_version_minor, 1);
+ SP_DEFINE_C_PREDICATE(ppl_version_revision, 1);
+ SP_DEFINE_C_PREDICATE(ppl_version_beta, 1);
+ SP_DEFINE_C_PREDICATE(ppl_version, 1);
+ SP_DEFINE_C_PREDICATE(ppl_banner, 1);
+ SP_DEFINE_C_PREDICATE(ppl_max_space_dimension, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Coefficient_is_bounded, 0);
+ SP_DEFINE_C_PREDICATE(ppl_Coefficient_max, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Coefficient_min, 1);
+ SP_DEFINE_C_PREDICATE(ppl_initialize, 0);
+ SP_DEFINE_C_PREDICATE(ppl_finalize, 0);
+ SP_DEFINE_C_PREDICATE(ppl_set_timeout_exception_atom, 1);
+ SP_DEFINE_C_PREDICATE(ppl_timeout_exception_atom, 1);
+ SP_DEFINE_C_PREDICATE(ppl_set_timeout, 1);
+ SP_DEFINE_C_PREDICATE(ppl_reset_timeout, 0);
+ SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_space_dimension, 3);
+ SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_space_dimension, 3);
+ SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_C_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_constraints, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_constraints, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_generators, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_generators, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_C_Polyhedron_from_bounding_box, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_NNC_Polyhedron_from_bounding_box, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_swap, 2);
+ SP_DEFINE_C_PREDICATE(ppl_delete_Polyhedron, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_space_dimension, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_dimension, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_constraints, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_minimized_constraints, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_generators, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_minimized_generators, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_relation_with_constraint, 3);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_relation_with_generator, 3);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_get_bounding_box, 3);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_empty, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_universe, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_bounded, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounds_from_above, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounds_from_below, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_maximize, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_maximize_with_point, 6);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_minimize, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_minimize_with_point, 6);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_topologically_closed, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_contains_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_strictly_contains_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_equals_Polyhedron, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_OK, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraint, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraint_and_minimize, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generator, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generator_and_minimize, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraints, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_constraints_and_minimize, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generators, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_generators_and_minimize, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_intersection_assign, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_intersection_assign_and_minimize, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_hull_assign, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_hull_assign_and_minimize, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_poly_difference_assign, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_image, 4);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_affine_preimage, 4);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_affine_image, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_affine_preimage, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_image, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_time_elapse_assign, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_topological_closure_assign, 1);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign, 2);
+ SP_DEFINE_C_PREDICATE(
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3);
+ SP_DEFINE_C_PREDICATE(
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_H79_widening_assign_with_tokens, 4);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_H79_widening_assign, 2);
+ SP_DEFINE_C_PREDICATE(
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_limited_H79_extrapolation_assign, 3);
+ SP_DEFINE_C_PREDICATE(
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_project, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_embed, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_concatenate_assign, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_remove_space_dimensions, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_remove_higher_space_dimensions, 2);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_expand_space_dimension, 3);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_fold_space_dimensions, 3);
+ SP_DEFINE_C_PREDICATE(ppl_Polyhedron_map_space_dimensions, 2);
+ SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem_trivial, 1);
+ SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem, 4);
+ SP_DEFINE_C_PREDICATE(ppl_new_LP_Problem_from_LP_Problem, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_swap, 2);
+ SP_DEFINE_C_PREDICATE(ppl_delete_LP_Problem, 1);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_space_dimension, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_constraints, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_objective_function, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimization_mode, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_clear, 1);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_add_constraint, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_add_constraints, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_set_objective_function, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_set_optimization_mode, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_is_satisfiable, 1);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_solve, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_feasible_point, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimizing_point, 2);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_optimal_value, 3);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_evaluate_objective_function, 4);
+ SP_DEFINE_C_PREDICATE(ppl_LP_Problem_OK, 1);
+}
+
+extern "C" void
+ppl_sicstus_deinit(int /* when */) {
+ for (size_t i = 0; i < sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); ++i)
+ // SP_unregister_atom can fail.
+ // We ignore such failures: what else can we do?
+ (void) SP_unregister_atom(*prolog_atoms[i].p_atom);
+ ppl_finalize();
+}
diff --git a/interfaces/Prolog/SICStus/sicstus_cfli.cc b/interfaces/Prolog/SICStus/sicstus_cfli.cc
new file mode 100644
index 0000000..7797624
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.cc
@@ -0,0 +1,27 @@
+/* SICStus Prolog Common Foreign Language Interface: implementation.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..f1d209d
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.h
@@ -0,0 +1,155 @@
+/* SICStus Prolog Common Foreign Language Interface: declarations.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..fe735b5
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sicstus_cfli.ic
@@ -0,0 +1,299 @@
+/* SICStus Common Foreign Language Interface: definitions. -*- C -*-
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 SIZEOF_LONG_LONG > SIZEOF_UNSIGNED_LONG
+ static long long ll_buffer;
+#endif
+
+#if SIZEOF_LONG_LONG > SIZEOF_UNSIGNED_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.
+*/
+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 list, 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/sp_clpq.pl b/interfaces/Prolog/SICStus/sp_clpq.pl
new file mode 100644
index 0000000..113c3d5
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_clpq.pl
@@ -0,0 +1,35 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- set_prolog_flag(language, iso).
+
+:- ensure_loaded('ppl_sicstus.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+eat_eol :-
+ get_code(user_input, _EOL).
+
+main(CLPQ) :-
+ ensure_loaded(CLPQ),
+ set_prolog_flag(language, iso), % FIXME: this is not ISO Prolog
+ nofileerrors, % FIXME: this is not ISO Prolog
+ 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..14e8dfe
--- /dev/null
+++ b/interfaces/Prolog/SICStus/sp_pl_check.pl
@@ -0,0 +1,40 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- set_prolog_flag(language, iso).
+
+prolog_system('SICStus').
+
+:- ensure_loaded('ppl_sicstus.pl').
+:- use_module(library(lists), [append/3, member/2]).
+
+main :-
+ ensure_loaded('pl_check.pl'),
+ set_prolog_flag(language, iso), % FIXME: this is not ISO Prolog
+ nofileerrors,
+ (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..13240cc
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.am
@@ -0,0 +1,151 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = \
+ppl_swiprolog.cc \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl
+
+if BUILD_SWI_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+pkglib_LTLIBRARIES = libppl_swiprolog.la
+libppl_swiprolog_la_SOURCES = ppl_swiprolog.cc
+libppl_swiprolog_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+libppl_swiprolog_la_LDFLAGS = -module -avoid-version
+
+bin_PROGRAMS = ppl_pl
+ppl_pl_SOURCES = ppl_pl.cc
+
+pkglib_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 = pl_clpq pl_clpq2
+pl_clpq_SOURCES = pl_clpq.cc
+pl_clpq2_SOURCES = pl_clpq.cc
+
+# Notice: we are linking statically until we understand whether
+# and if libtool and plld can interoperate.
+ppl_pl$(EXEEXT): ppl_swiprolog.o ppl_pl.o | libppl_swiprolog.la
+ plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ -o $@ $+ \
+ -L$(top_builddir)/src/.libs -lppl \
+ -L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ @extra_libraries@
+
+pl_clpq$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq.pl | libppl_swiprolog.la
+ plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ -o $@ $+ \
+ -L$(top_builddir)/src/.libs -lppl \
+ -L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ @extra_libraries@
+
+pl_clpq2$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq2.pl | libppl_swiprolog.la
+ plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ -o $@ $+ \
+ -L$(top_builddir)/src/.libs -lppl \
+ -L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ @extra_libraries@
+
+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
+
+pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ if [ $(srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/../tests/pl_check.pl . ; \
+ fi ;\
+ echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ ./ppl_pl < script_pchk
+ if [ $(srcdir) != `pwd` ]; then \
+ rm -f pl_check.pl; \
+ fi
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ ./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)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ ./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+pl_clpq pl_clpq2 \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS) \
+script_pchk
+
+endif BUILD_SWI_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/SWI/Makefile.in b/interfaces/Prolog/SWI/Makefile.in
new file mode 100644
index 0000000..0246497
--- /dev/null
+++ b/interfaces/Prolog/SWI/Makefile.in
@@ -0,0 +1,789 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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_SWI_PROLOG_INTERFACE_TRUE@bin_PROGRAMS = ppl_pl$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@check_PROGRAMS = pl_clpq$(EXEEXT) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ pl_clpq2$(EXEEXT)
+subdir = interfaces/Prolog/SWI
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la
+am__libppl_swiprolog_la_SOURCES_DIST = ppl_swiprolog.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_libppl_swiprolog_la_OBJECTS = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ ppl_swiprolog.lo
+libppl_swiprolog_la_OBJECTS = $(am_libppl_swiprolog_la_OBJECTS)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_libppl_swiprolog_la_rpath = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -rpath $(pkglibdir)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am__pl_clpq_SOURCES_DIST = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_pl_clpq_OBJECTS = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ pl_clpq.$(OBJEXT)
+pl_clpq_OBJECTS = $(am_pl_clpq_OBJECTS)
+pl_clpq_LDADD = $(LDADD)
+am__pl_clpq2_SOURCES_DIST = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_pl_clpq2_OBJECTS = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ pl_clpq.$(OBJEXT)
+pl_clpq2_OBJECTS = $(am_pl_clpq2_OBJECTS)
+pl_clpq2_LDADD = $(LDADD)
+am__ppl_pl_SOURCES_DIST = ppl_pl.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@am_ppl_pl_OBJECTS = ppl_pl.$(OBJEXT)
+ppl_pl_OBJECTS = $(am_ppl_pl_OBJECTS)
+ppl_pl_LDADD = $(LDADD)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_swiprolog_la_SOURCES) $(pl_clpq_SOURCES) \
+ $(pl_clpq2_SOURCES) $(ppl_pl_SOURCES)
+DIST_SOURCES = $(am__libppl_swiprolog_la_SOURCES_DIST) \
+ $(am__pl_clpq_SOURCES_DIST) $(am__pl_clpq2_SOURCES_DIST) \
+ $(am__ppl_pl_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = \
+ppl_swiprolog.cc \
+ppl_swiprolog.pl \
+pl_clpq.cc \
+pl_clpq.pl \
+swi_pl_check.pl
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(SWI_PROLOG_INCLUDE_OPTIONS) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pkglib_LTLIBRARIES = libppl_swiprolog.la
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_SOURCES = ppl_swiprolog.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_LIBADD = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@@extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@libppl_swiprolog_la_LDFLAGS = -module -avoid-version
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_pl_SOURCES = ppl_pl.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pkglib_DATA = ppl_swiprolog.pl
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq_SOURCES = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq2_SOURCES = pl_clpq.cc
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_SWI_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq pl_clpq2 \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@script_pchk
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/SWI/Makefile'; \
+ 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
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libppl_swiprolog.la: $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_DEPENDENCIES)
+ $(CXXLINK) $(am_libppl_swiprolog_la_rpath) $(libppl_swiprolog_la_LDFLAGS) $(libppl_swiprolog_la_OBJECTS) $(libppl_swiprolog_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@pl_clpq$(EXEEXT): $(pl_clpq_OBJECTS) $(pl_clpq_DEPENDENCIES)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ @rm -f pl_clpq$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ $(CXXLINK) $(pl_clpq_LDFLAGS) $(pl_clpq_OBJECTS) $(pl_clpq_LDADD) $(LIBS)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@pl_clpq2$(EXEEXT): $(pl_clpq2_OBJECTS) $(pl_clpq2_DEPENDENCIES)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ @rm -f pl_clpq2$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ $(CXXLINK) $(pl_clpq2_LDFLAGS) $(pl_clpq2_OBJECTS) $(pl_clpq2_LDADD) $(LIBS)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ppl_pl$(EXEEXT): $(ppl_pl_OBJECTS) $(ppl_pl_DEPENDENCIES)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ @rm -f ppl_pl$(EXEEXT)
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@ $(CXXLINK) $(ppl_pl_LDFLAGS) $(ppl_pl_OBJECTS) $(ppl_pl_LDADD) $(LIBS)
+
+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_swiprolog.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+uninstall-pkglibDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ at BUILD_SWI_PROLOG_INTERFACE_FALSE@check-local:
+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)$(pkglibdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-binPROGRAMS install-pkglibDATA \
+ install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am \
+ uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+ clean-binPROGRAMS clean-checkPROGRAMS clean-generic \
+ clean-libtool clean-pkglibLTLIBRARIES ctags 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-exec install-exec-am install-info \
+ install-info-am install-man install-pkglibDATA \
+ install-pkglibLTLIBRARIES 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 uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-info-am uninstall-pkglibDATA \
+ uninstall-pkglibLTLIBRARIES
+
+
+# Notice: we are linking statically until we understand whether
+# and if libtool and plld can interoperate.
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ppl_pl$(EXEEXT): ppl_swiprolog.o ppl_pl.o | libppl_swiprolog.la
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -L$(top_builddir)/src/.libs -lppl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ @extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq.pl | libppl_swiprolog.la
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -L$(top_builddir)/src/.libs -lppl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ @extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_clpq2$(EXEEXT): ppl_swiprolog.o pl_clpq.o pl_clpq.pl ../tests/clpq2.pl | libppl_swiprolog.la
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ plld -cc $(CC) -c++ $(CXX) -ld $(CXX) \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -ld-options`echo '' $(AM_CXXFLAGS) $(CXXFLAGS) | tr " " ","` \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -o $@ $+ \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -L$(top_builddir)/src/.libs -lppl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -L$(top_builddir)/Watchdog/src/.libs -lpwl \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ @extra_libraries@
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@pl_check_test: swi_pl_check.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/../tests/pl_check.pl . ; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ fi ;\
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ echo "ensure_loaded('$(srcdir)/swi_pl_check'). main." > script_pchk
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ ./ppl_pl < script_pchk
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ if [ $(srcdir) != `pwd` ]; then \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ rm -f pl_check.pl; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@clpq_test: pl_clpq ../tests/script_clpq $(EXPECTED_CLPQ)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ LANG=C; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ ./pl_clpq <$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@clpq2_test: pl_clpq2 ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ LANG=C; \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ ./pl_clpq2 <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_SWI_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# 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/pl_clpq.cc b/interfaces/Prolog/SWI/pl_clpq.cc
new file mode 100644
index 0000000..5a34f4f
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.cc
@@ -0,0 +1,42 @@
+/* C++ main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int, char** argv) {
+ 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..b8cbf2c
--- /dev/null
+++ b/interfaces/Prolog/SWI/pl_clpq.pl
@@ -0,0 +1,32 @@
+/* Prolog main program for the toy PPL/SWI-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_pl.cc b/interfaces/Prolog/SWI/ppl_pl.cc
new file mode 100644
index 0000000..df982a9
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_pl.cc
@@ -0,0 +1,38 @@
+/* Main program for SWI-Prolog with the PPL statically linked.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <SWI-Prolog.h>
+
+extern "C" install_t install();
+extern "C" install_t uninstall();
+
+int
+main(int argc, char **argv) {
+ 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_swiprolog.cc b/interfaces/Prolog/SWI/ppl_swiprolog.cc
new file mode 100644
index 0000000..5a30db5
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_swiprolog.cc
@@ -0,0 +1,524 @@
+/* SWI Prolog interface.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+
+// 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>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+typedef term_t Prolog_term_ref;
+typedef atom_t Prolog_atom;
+typedef foreign_t Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+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.
+*/
+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.
+*/
+long Prolog_max_integer;
+
+/*!
+ Temporary used to communicate big integers between C++ and Prolog.
+*/
+mpz_class tmp_mpz_class;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+}
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+ 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) {
+ PL_put_term(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) {
+ PL_put_integer(t, 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 <= LONG_MAX)
+ PL_put_integer(t, ul);
+ else if (ul <= static_cast<uint64_t>(std::numeric_limits<int64_t>::max()))
+ PL_put_int64(t, static_cast<int64_t>(ul));
+ else {
+ PPL::assign_r(tmp_mpz_class, ul, PPL::ROUND_NOT_NEEDED);
+ PL_unify_mpz(t, tmp_mpz_class.get_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) {
+ PL_put_atom_chars(t, s);
+ return 1;
+}
+
+/*!
+ Assign to \p t the Prolog atom \p a.
+*/
+inline int
+Prolog_put_atom(Prolog_term_ref t, Prolog_atom a) {
+ PL_put_atom(t, 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) {
+ PL_put_pointer(t, p);
+ return 1;
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+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) {
+ PL_cons_functor(t, PL_new_functor(f, 1), a1);
+ 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) {
+ PL_cons_functor(t, PL_new_functor(f, 2), a1, a2);
+ 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) {
+ PL_cons_functor(t, PL_new_functor(f, 3), a1, a2, a3);
+ 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) {
+ PL_cons_functor(t, PL_new_functor(f, 4), a1, a2, a3, a4);
+ 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) {
+ PL_cons_list(c, h, t);
+ return 1;
+}
+
+/*!
+ 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 list, false otherwise.
+*/
+inline int
+Prolog_is_cons(Prolog_term_ref t) {
+ return !PL_is_atom(t) && PL_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(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 \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);
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+ assert(Prolog_is_integer(t));
+ PL_get_mpz(t, tmp_mpz_class.get_mpz_t());
+ return PPL::Coefficient(tmp_mpz_class);
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+ PPL::assign_r(tmp_mpz_class, n, PPL::ROUND_NOT_NEEDED);
+ Prolog_term_ref t = Prolog_new_term_ref();
+ PL_unify_mpz(t, tmp_mpz_class.get_mpz_t());
+ return t;
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+#define PL_EXTENSION_ENTRY(name, arity) { #name, arity, (void*) name, 0 },
+
+namespace {
+
+PL_extension predicates[] = {
+ PL_EXTENSION_ENTRY(ppl_version_major, 1)
+ PL_EXTENSION_ENTRY(ppl_version_minor, 1)
+ PL_EXTENSION_ENTRY(ppl_version_revision, 1)
+ PL_EXTENSION_ENTRY(ppl_version_beta, 1)
+ PL_EXTENSION_ENTRY(ppl_version, 1)
+ PL_EXTENSION_ENTRY(ppl_banner, 1)
+ PL_EXTENSION_ENTRY(ppl_max_space_dimension, 1)
+ PL_EXTENSION_ENTRY(ppl_Coefficient_is_bounded, 0)
+ PL_EXTENSION_ENTRY(ppl_Coefficient_max, 1)
+ PL_EXTENSION_ENTRY(ppl_Coefficient_min, 1)
+ PL_EXTENSION_ENTRY(ppl_initialize, 0)
+ PL_EXTENSION_ENTRY(ppl_finalize, 0)
+ PL_EXTENSION_ENTRY(ppl_set_timeout_exception_atom, 1)
+ PL_EXTENSION_ENTRY(ppl_timeout_exception_atom, 1)
+ PL_EXTENSION_ENTRY(ppl_set_timeout, 1)
+ PL_EXTENSION_ENTRY(ppl_reset_timeout, 0)
+ PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_space_dimension, 3)
+ PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_space_dimension, 3)
+ PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_C_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_constraints, 2)
+ PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_constraints, 2)
+ PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_generators, 2)
+ PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_generators, 2)
+ PL_EXTENSION_ENTRY(ppl_new_C_Polyhedron_from_bounding_box, 2)
+ PL_EXTENSION_ENTRY(ppl_new_NNC_Polyhedron_from_bounding_box, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_swap, 2)
+ PL_EXTENSION_ENTRY(ppl_delete_Polyhedron, 1)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_space_dimension, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_dimension, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_get_constraints, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_get_minimized_constraints, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_get_generators, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_get_minimized_generators, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_relation_with_constraint, 3)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_relation_with_generator, 3)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_get_bounding_box, 3)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_is_empty, 1)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_is_universe, 1)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_is_bounded, 1)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_bounds_from_above, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_bounds_from_below, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_maximize, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_maximize_with_point, 6)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_minimize, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_minimize_with_point, 6)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_is_topologically_closed, 1)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_topological_closure_assign, 1)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_contains_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_strictly_contains_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_equals_Polyhedron, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_OK, 1)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraint, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraint_and_minimize, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generator, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generator_and_minimize, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraints, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_constraints_and_minimize, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generators, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_generators_and_minimize, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_intersection_assign, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_intersection_assign_and_minimize, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_hull_assign, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_hull_assign_and_minimize, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_poly_difference_assign, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_image, 4)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_affine_preimage, 4)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_affine_image, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_affine_preimage, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_image, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_preimage, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_time_elapse_assign, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_BHRZ03_widening_assign, 2)
+ PL_EXTENSION_ENTRY(
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3)
+ PL_EXTENSION_ENTRY(
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_H79_widening_assign_with_tokens, 4)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_H79_widening_assign, 2)
+ PL_EXTENSION_ENTRY(
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_limited_H79_extrapolation_assign, 3)
+ PL_EXTENSION_ENTRY(
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_space_dimensions_and_project, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_add_space_dimensions_and_embed, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_concatenate_assign, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_remove_space_dimensions, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_remove_higher_space_dimensions, 2)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_expand_space_dimension, 3)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_fold_space_dimensions, 3)
+ PL_EXTENSION_ENTRY(ppl_Polyhedron_map_space_dimensions, 2)
+ PL_EXTENSION_ENTRY(ppl_new_LP_Problem_trivial, 1)
+ PL_EXTENSION_ENTRY(ppl_new_LP_Problem, 4)
+ PL_EXTENSION_ENTRY(ppl_new_LP_Problem_from_LP_Problem, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_swap, 2)
+ PL_EXTENSION_ENTRY(ppl_delete_LP_Problem, 1)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_space_dimension, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_constraints, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_objective_function, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_optimization_mode, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_clear, 1)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_add_constraint, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_add_constraints, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_set_objective_function, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_set_optimization_mode, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_is_satisfiable, 1)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_solve, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_feasible_point, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_optimizing_point, 2)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_optimal_value, 3)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_evaluate_objective_function, 4)
+ PL_EXTENSION_ENTRY(ppl_LP_Problem_OK, 1)
+ { NULL, 0, NULL, 0 }
+};
+
+} // namespace
+
+extern "C" install_t
+install() {
+ ppl_initialize();
+ PL_register_extensions(predicates);
+}
+
+extern "C" install_t
+uninstall() {
+ ppl_finalize();
+}
diff --git a/interfaces/Prolog/SWI/ppl_swiprolog.pl b/interfaces/Prolog/SWI/ppl_swiprolog.pl
new file mode 100644
index 0000000..946b999
--- /dev/null
+++ b/interfaces/Prolog/SWI/ppl_swiprolog.pl
@@ -0,0 +1,23 @@
+/* Loader for the SWI-Prolog interface.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- load_foreign_library('libppl_swiprolog').
diff --git a/interfaces/Prolog/SWI/swi_pl_check.pl b/interfaces/Prolog/SWI/swi_pl_check.pl
new file mode 100644
index 0000000..a4a9004
--- /dev/null
+++ b/interfaces/Prolog/SWI/swi_pl_check.pl
@@ -0,0 +1,38 @@
+/* Main program for the toy PPL/SICStus-Prolog CLP(Q) predicate checker.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/XSB/Makefile.am b/interfaces/Prolog/XSB/Makefile.am
new file mode 100644
index 0000000..3e19fe6
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.am
@@ -0,0 +1,171 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+abs_srcdir = @abs_srcdir@
+
+EXTRA_DIST = \
+ppl_xsb.cc \
+ppl_xsb.H \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+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
+
+if BUILD_XSB_PROLOG_INTERFACE
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at extra_includes@
+
+pkglib_LTLIBRARIES = ppl_xsb.la
+ppl_xsb_la_SOURCES = ppl_xsb.cc
+ppl_xsb_la_LIBADD = \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+ppl_xsb_la_LDFLAGS = -module -avoid-version
+
+pkglib_DATA = ppl_xsb.xwam
+
+ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc ppl_xsb.la Makefile
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ cp -f $(srcdir)/ppl_xsb.H . ; \
+ fi
+ cp -f $(srcdir)/ppl_xsb.cc ppl_xsb.c
+ echo "consult(ppl_xsb," \
+ "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+ "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)')])." \
+ | $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ xsb
+ rm -f ppl_xsb.c
+ if [ $(abs_srcdir) != `pwd` ]; then \
+ rm -f ppl_xsb.H; \
+ fi
+
+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)
+
+# FIXME: we are checking against special versions of `expected_clpq'
+# and `expected_clpq2'. This is due to the fact that XSB 2.6
+# and previous versions do not support control escape
+# sequences.
+
+COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+
+if ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+
+else !ASSERTIONS_ENABLED
+
+EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)
+EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)
+
+endif !ASSERTIONS_ENABLED
+
+check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ 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 \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen ppl_xsb.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 \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen ppl_xsb.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: ppl_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 \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen ppl_xsb.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
+
+MOSTLYCLEANFILES = \
+ppl_xsb.xwam ppl_xsb.so \
+xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam \
+$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk
+
+endif BUILD_XSB_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/XSB/Makefile.in b/interfaces/Prolog/XSB/Makefile.in
new file mode 100644
index 0000000..e6361e1
--- /dev/null
+++ b/interfaces/Prolog/XSB/Makefile.in
@@ -0,0 +1,737 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la
+am__ppl_xsb_la_SOURCES_DIST = ppl_xsb.cc
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_ppl_xsb_la_OBJECTS = ppl_xsb.lo
+ppl_xsb_la_OBJECTS = $(am_ppl_xsb_la_OBJECTS)
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@am_ppl_xsb_la_rpath = -rpath \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ $(pkglibdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_xsb_la_SOURCES)
+DIST_SOURCES = $(am__ppl_xsb_la_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+abs_srcdir = @abs_srcdir@
+EXTRA_DIST = \
+ppl_xsb.cc \
+ppl_xsb.H \
+xsb_clpq.P \
+xsb_clpq2.P \
+xsb_pl_check.P \
+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
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@AM_CPPFLAGS = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/src \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@-I$(top_builddir)/Watchdog/src \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(XSB_PROLOG_INCLUDE_OPTIONS) \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@@extra_includes@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@pkglib_LTLIBRARIES = ppl_xsb.la
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_SOURCES = ppl_xsb.cc
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_LIBADD = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@@extra_libraries@
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb_la_LDFLAGS = -module -avoid-version
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@pkglib_DATA = ppl_xsb.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_NONSTRICT = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ack.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ackn.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@fib.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@mc91.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@smm.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@sumto.clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@tak.clpq
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@CLPQ_TESTS_STRICT = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@schedule.clpq
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+
+# FIXME: we are checking against special versions of `expected_clpq'
+# and `expected_clpq2'. This is due to the fact that XSB 2.6
+# and previous versions do not support control escape
+# sequences.
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ = $(srcdir)/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_CLPQ2 = $(srcdir)/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_XSB_PROLOG_INTERFACE_TRUE at EXPECTED_PCHK = $(srcdir)/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@MOSTLYCLEANFILES = \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.xwam ppl_xsb.so \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@xsb_clpq.xwam xsb_clpq2.xwam xsb_pl_check.xwam \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@$(CLPQ_TESTS) obtained_clpq obtained_clpq2 obtained_pchk
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/XSB/Makefile'; \
+ 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
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+ppl_xsb.la: $(ppl_xsb_la_OBJECTS) $(ppl_xsb_la_DEPENDENCIES)
+ $(CXXLINK) $(am_ppl_xsb_la_rpath) $(ppl_xsb_la_LDFLAGS) $(ppl_xsb_la_OBJECTS) $(ppl_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_xsb.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+uninstall-pkglibDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ at BUILD_XSB_PROLOG_INTERFACE_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)$(pkglibdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am uninstall-pkglibDATA \
+ uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+ clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
+ 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-exec install-exec-am install-info \
+ install-info-am install-man install-pkglibDATA \
+ install-pkglibLTLIBRARIES 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 uninstall uninstall-am uninstall-info-am \
+ uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ppl_xsb.xwam: ppl_xsb.H ppl_xsb.cc ppl_xsb.la Makefile
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/ppl_xsb.H . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/ppl_xsb.cc ppl_xsb.c
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ echo "consult(ppl_xsb," \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ "[cc('$(CXX)'), cc_opts('$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) " \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ "$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)')])." \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ | $(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ xsb
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f ppl_xsb.c
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f ppl_xsb.H; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@check-local: ppl_xsb.la xsb_clpq.P ../tests/clpq.pl ../tests/script_clpq xsb_clpq2.P ../tests/clpq2.pl ../tests/script_clpq2 pl_check_test
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ LANG=C; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/xsb_clpq.P . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/../tests/clpq.pl .
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f xsb_clpq.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ xsb xsb_clpq \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ <$(srcdir)/../tests/script_clpq >obtained_clpq
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f clpq.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f xsb_clpq.P; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/xsb_clpq2.P . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/../tests/clpq2.pl .
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f xsb_clpq2.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ xsb xsb_clpq2 \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ <$(srcdir)/../tests/script_clpq2 >obtained_clpq2
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f clpq2.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f xsb_clpq2.P; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@pl_check_test: ppl_xsb.la ppl_xsb.xwam xsb_pl_check.P ../tests/pl_check.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/xsb_pl_check.P . ; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ cp -f $(srcdir)/../tests/pl_check.pl .
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f xsb_pl_check.xwam
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ -dlopen ppl_xsb.la \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ xsb xsb_pl_check \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ >obtained_pchk
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f pl_check.pl
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ if [ $(abs_srcdir) != `pwd` ]; then \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ rm -f xsb_pl_check.P; \
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ fi
+ at BUILD_XSB_PROLOG_INTERFACE_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+# 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/expected_clpq2_int16 b/interfaces/Prolog/XSB/expected_clpq2_int16
new file mode 100644
index 0000000..9debe48
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int16
@@ -0,0 +1,102 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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: Unknown result due to 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/XSB/expected_clpq2_int16_a b/interfaces/Prolog/XSB/expected_clpq2_int16_a
new file mode 100644
index 0000000..8f18e66
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int16_a
@@ -0,0 +1,103 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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: Unknown result due to negative 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 ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int32 b/interfaces/Prolog/XSB/expected_clpq2_int32
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int32
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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/XSB/expected_clpq2_int32_a b/interfaces/Prolog/XSB/expected_clpq2_int32_a
new file mode 100644
index 0000000..636a1bc
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int32_a
@@ -0,0 +1,102 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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/XSB/expected_clpq2_int64 b/interfaces/Prolog/XSB/expected_clpq2_int64
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int64
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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/XSB/expected_clpq2_int64_a b/interfaces/Prolog/XSB/expected_clpq2_int64_a
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int64_a
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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/XSB/expected_clpq2_int8 b/interfaces/Prolog/XSB/expected_clpq2_int8
new file mode 100644
index 0000000..0cc3daf
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int8
@@ -0,0 +1,101 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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 ?-
+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 ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_int8_a b/interfaces/Prolog/XSB/expected_clpq2_int8_a
new file mode 100644
index 0000000..0cc3daf
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_int8_a
@@ -0,0 +1,101 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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 ?-
+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 ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/XSB/expected_clpq2_mpz b/interfaces/Prolog/XSB/expected_clpq2_mpz
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_mpz
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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/XSB/expected_clpq2_mpz_a b/interfaces/Prolog/XSB/expected_clpq2_mpz_a
new file mode 100644
index 0000000..667acc1
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq2_mpz_a
@@ -0,0 +1,109 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL clpq ?- yes
+PPL clpq ?- Z = 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
+ 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/XSB/expected_clpq_int16 b/interfaces/Prolog/XSB/expected_clpq_int16
new file mode 100644
index 0000000..91ca9e6
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int16
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_int16_a b/interfaces/Prolog/XSB/expected_clpq_int16_a
new file mode 100644
index 0000000..91ca9e6
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int16_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_int32 b/interfaces/Prolog/XSB/expected_clpq_int32
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int32
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_int32_a b/interfaces/Prolog/XSB/expected_clpq_int32_a
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int32_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_int64 b/interfaces/Prolog/XSB/expected_clpq_int64
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int64
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_int64_a b/interfaces/Prolog/XSB/expected_clpq_int64_a
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int64_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_int8 b/interfaces/Prolog/XSB/expected_clpq_int8
new file mode 100644
index 0000000..5bb478c
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int8
@@ -0,0 +1,29 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_int8_a b/interfaces/Prolog/XSB/expected_clpq_int8_a
new file mode 100644
index 0000000..5bb478c
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_int8_a
@@ -0,0 +1,29 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_mpz b/interfaces/Prolog/XSB/expected_clpq_mpz
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_mpz
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_clpq_mpz_a b/interfaces/Prolog/XSB/expected_clpq_mpz_a
new file mode 100644
index 0000000..bd1676d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_clpq_mpz_a
@@ -0,0 +1,35 @@
+\
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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.\nPPL 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/XSB/expected_pchk_int16 b/interfaces/Prolog/XSB/expected_pchk_int16
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int16
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int16_a b/interfaces/Prolog/XSB/expected_pchk_int16_a
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int16_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int32 b/interfaces/Prolog/XSB/expected_pchk_int32
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int32
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int32_a b/interfaces/Prolog/XSB/expected_pchk_int32_a
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int32_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int64 b/interfaces/Prolog/XSB/expected_pchk_int64
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int64
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int64_a b/interfaces/Prolog/XSB/expected_pchk_int64_a
new file mode 100644
index 0000000..2aed667
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int64_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int8 b/interfaces/Prolog/XSB/expected_pchk_int8
new file mode 100644
index 0000000..b19de5d
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int8
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+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: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_int8_a b/interfaces/Prolog/XSB/expected_pchk_int8_a
new file mode 100644
index 0000000..f6b1402
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_int8_a
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_mpz b/interfaces/Prolog/XSB/expected_pchk_mpz
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_mpz
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/XSB/expected_pchk_mpz_a b/interfaces/Prolog/XSB/expected_pchk_mpz_a
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/interfaces/Prolog/XSB/expected_pchk_mpz_a
@@ -0,0 +1 @@
+OK
diff --git a/interfaces/Prolog/XSB/ppl_xsb.H b/interfaces/Prolog/XSB/ppl_xsb.H
new file mode 100644
index 0000000..8ee38fb
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_xsb.H
@@ -0,0 +1,143 @@
+/* XSB Prolog interface: declarations. -*- Prolog -*-
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- export
+ 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_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_new_C_Polyhedron_from_bounding_box/2,
+ ppl_new_NNC_Polyhedron_from_bounding_box/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_get_bounding_box/3,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_bounded/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_constraint_and_minimize/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_generator_and_minimize/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_add_generators_and_minimize/2,
+ ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_intersection_assign_and_minimize/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_hull_assign_and_minimize/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_new_LP_Problem_trivial/1,
+ ppl_new_LP_Problem/4,
+ ppl_new_LP_Problem_from_LP_Problem/2,
+ ppl_LP_Problem_swap/2,
+ ppl_delete_LP_Problem/1,
+ ppl_LP_Problem_space_dimension/2,
+ ppl_LP_Problem_constraints/2,
+ ppl_LP_Problem_objective_function/2,
+ ppl_LP_Problem_optimization_mode/2,
+ ppl_LP_Problem_clear/1,
+ ppl_LP_Problem_add_constraint/2,
+ ppl_LP_Problem_add_constraints/2,
+ ppl_LP_Problem_set_objective_function/2,
+ ppl_LP_Problem_set_optimization_mode/2,
+ ppl_LP_Problem_is_satisfiable/1,
+ ppl_LP_Problem_solve/2,
+ ppl_LP_Problem_feasible_point/2,
+ ppl_LP_Problem_optimizing_point/2,
+ ppl_LP_Problem_optimal_value/3,
+ ppl_LP_Problem_evaluate_objective_function/4,
+ ppl_LP_Problem_OK/1.
+
+:- ldoption('-L../../../src/.libs -lppl -L../../../Watchdog/src/.libs -lpwl -lgmp -lgmpxx').
diff --git a/interfaces/Prolog/XSB/ppl_xsb.cc b/interfaces/Prolog/XSB/ppl_xsb.cc
new file mode 100644
index 0000000..41d06ff
--- /dev/null
+++ b/interfaces/Prolog/XSB/ppl_xsb.cc
@@ -0,0 +1,834 @@
+/* XSB Prolog interface: system-dependent part.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#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;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+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.
+*/
+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.
+*/
+long Prolog_max_integer;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = 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
+ Prolog_min_integer = -2147483647-1;
+ Prolog_max_integer = 2147483647;
+#else
+ Prolog_min_integer = -268435456;
+ Prolog_max_integer = 268435455;
+#endif
+}
+
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+ 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 < Prolog_min_integer || l > Prolog_max_integer)
+ throw PPL_integer_out_of_range(l);
+ 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>(Prolog_max_integer))
+ throw PPL_integer_out_of_range(ul);
+ 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);
+ // TODO: remove the const_cast when the XSB people fix cinterf.h.
+ 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.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ // TODO: remove the const_cast when the XSB people fix cinterf.h.
+ 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 list, 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;
+ }
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+ // XSB supports only 32-bit integers.
+ long v;
+ Prolog_get_long(t, &v);
+ return PPL::Coefficient(v);
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+ long l = 0;
+ if (PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED) != PPL::V_EQ)
+ throw PPL_integer_out_of_range(n);
+ Prolog_term_ref t = p2p_new();
+ Prolog_put_long(t, l);
+ return t;
+}
+
+} // namespace
+
+#define ppl_version_major xsb_stub_ppl_version_major
+#define ppl_version_minor xsb_stub_ppl_version_minor
+#define ppl_version_revision xsb_stub_ppl_version_revision
+#define ppl_version_beta xsb_stub_ppl_version_beta
+#define ppl_version xsb_stub_ppl_version
+#define ppl_banner xsb_stub_ppl_banner
+#define ppl_max_space_dimension xsb_stub_ppl_max_space_dimension
+#define ppl_Coefficient_is_bounded xsb_stub_ppl_Coefficient_is_bounded
+#define ppl_Coefficient_max xsb_stub_ppl_Coefficient_max
+#define ppl_Coefficient_min xsb_stub_ppl_Coefficient_min
+#define ppl_initialize xsb_stub_ppl_initialize
+#define ppl_finalize xsb_stub_ppl_finalize
+#define ppl_set_timeout_exception_atom xsb_stub_ppl_set_timeout_exception_atom
+#define ppl_timeout_exception_atom xsb_stub_ppl_timeout_exception_atom
+#define ppl_set_timeout xsb_stub_ppl_set_timeout
+#define ppl_reset_timeout xsb_stub_ppl_reset_timeout
+#define ppl_new_C_Polyhedron_from_space_dimension xsb_stub_ppl_new_C_Polyhedron_from_space_dimension
+#define ppl_new_NNC_Polyhedron_from_space_dimension xsb_stub_ppl_new_NNC_Polyhedron_from_space_dimension
+#define ppl_new_C_Polyhedron_from_C_Polyhedron xsb_stub_ppl_new_C_Polyhedron_from_C_Polyhedron
+#define ppl_new_C_Polyhedron_from_NNC_Polyhedron xsb_stub_ppl_new_C_Polyhedron_from_NNC_Polyhedron
+#define ppl_new_NNC_Polyhedron_from_C_Polyhedron xsb_stub_ppl_new_NNC_Polyhedron_from_C_Polyhedron
+#define ppl_new_NNC_Polyhedron_from_NNC_Polyhedron xsb_stub_ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+#define ppl_new_C_Polyhedron_from_constraints xsb_stub_ppl_new_C_Polyhedron_from_constraints
+#define ppl_new_NNC_Polyhedron_from_constraints xsb_stub_ppl_new_NNC_Polyhedron_from_constraints
+#define ppl_new_C_Polyhedron_from_generators xsb_stub_ppl_new_C_Polyhedron_from_generators
+#define ppl_new_NNC_Polyhedron_from_generators xsb_stub_ppl_new_NNC_Polyhedron_from_generators
+#define ppl_new_C_Polyhedron_from_bounding_box xsb_stub_ppl_new_C_Polyhedron_from_bounding_box
+#define ppl_new_NNC_Polyhedron_from_bounding_box xsb_stub_ppl_new_NNC_Polyhedron_from_bounding_box
+#define ppl_Polyhedron_swap xsb_stub_ppl_Polyhedron_swap
+#define ppl_delete_Polyhedron xsb_stub_ppl_delete_Polyhedron
+#define ppl_Polyhedron_space_dimension xsb_stub_ppl_Polyhedron_space_dimension
+#define ppl_Polyhedron_affine_dimension xsb_stub_ppl_Polyhedron_affine_dimension
+#define ppl_Polyhedron_get_constraints xsb_stub_ppl_Polyhedron_get_constraints
+#define ppl_Polyhedron_get_minimized_constraints xsb_stub_ppl_Polyhedron_get_minimized_constraints
+#define ppl_Polyhedron_get_generators xsb_stub_ppl_Polyhedron_get_generators
+#define ppl_Polyhedron_get_minimized_generators xsb_stub_ppl_Polyhedron_get_minimized_generators
+#define ppl_Polyhedron_relation_with_constraint xsb_stub_ppl_Polyhedron_relation_with_constraint
+#define ppl_Polyhedron_relation_with_generator xsb_stub_ppl_Polyhedron_relation_with_generator
+#define ppl_Polyhedron_get_bounding_box xsb_stub_ppl_Polyhedron_get_bounding_box
+#define ppl_Polyhedron_is_empty xsb_stub_ppl_Polyhedron_is_empty
+#define ppl_Polyhedron_is_universe xsb_stub_ppl_Polyhedron_is_universe
+#define ppl_Polyhedron_is_bounded xsb_stub_ppl_Polyhedron_is_bounded
+#define ppl_Polyhedron_bounds_from_above xsb_stub_ppl_Polyhedron_bounds_from_above
+#define ppl_Polyhedron_bounds_from_below xsb_stub_ppl_Polyhedron_bounds_from_below
+#define ppl_Polyhedron_maximize xsb_stub_ppl_Polyhedron_maximize
+#define ppl_Polyhedron_maximize_with_point xsb_stub_ppl_Polyhedron_maximize_with_point
+#define ppl_Polyhedron_minimize xsb_stub_ppl_Polyhedron_minimize
+#define ppl_Polyhedron_minimize_with_point xsb_stub_ppl_Polyhedron_minimize_with_point
+#define ppl_Polyhedron_is_topologically_closed xsb_stub_ppl_Polyhedron_is_topologically_closed
+#define ppl_Polyhedron_contains_Polyhedron xsb_stub_ppl_Polyhedron_contains_Polyhedron
+#define ppl_Polyhedron_strictly_contains_Polyhedron xsb_stub_ppl_Polyhedron_strictly_contains_Polyhedron
+#define ppl_Polyhedron_is_disjoint_from_Polyhedron xsb_stub_ppl_Polyhedron_is_disjoint_from_Polyhedron
+#define ppl_Polyhedron_equals_Polyhedron xsb_stub_ppl_Polyhedron_equals_Polyhedron
+#define ppl_Polyhedron_OK xsb_stub_ppl_Polyhedron_OK
+#define ppl_Polyhedron_add_constraint xsb_stub_ppl_Polyhedron_add_constraint
+#define ppl_Polyhedron_add_constraint_and_minimize xsb_stub_ppl_Polyhedron_add_constraint_and_minimize
+#define ppl_Polyhedron_add_generator xsb_stub_ppl_Polyhedron_add_generator
+#define ppl_Polyhedron_add_generator_and_minimize xsb_stub_ppl_Polyhedron_add_generator_and_minimize
+#define ppl_Polyhedron_add_constraints xsb_stub_ppl_Polyhedron_add_constraints
+#define ppl_Polyhedron_add_constraints_and_minimize xsb_stub_ppl_Polyhedron_add_constraints_and_minimize
+#define ppl_Polyhedron_add_generators xsb_stub_ppl_Polyhedron_add_generators
+#define ppl_Polyhedron_add_generators_and_minimize xsb_stub_ppl_Polyhedron_add_generators_and_minimize
+#define ppl_Polyhedron_intersection_assign xsb_stub_ppl_Polyhedron_intersection_assign
+#define ppl_Polyhedron_intersection_assign_and_minimize xsb_stub_ppl_Polyhedron_intersection_assign_and_minimize
+#define ppl_Polyhedron_poly_hull_assign xsb_stub_ppl_Polyhedron_poly_hull_assign
+#define ppl_Polyhedron_poly_hull_assign_and_minimize xsb_stub_ppl_Polyhedron_poly_hull_assign_and_minimize
+#define ppl_Polyhedron_poly_difference_assign xsb_stub_ppl_Polyhedron_poly_difference_assign
+#define ppl_Polyhedron_affine_image xsb_stub_ppl_Polyhedron_affine_image
+#define ppl_Polyhedron_affine_preimage xsb_stub_ppl_Polyhedron_affine_preimage
+#define ppl_Polyhedron_bounded_affine_image xsb_stub_ppl_Polyhedron_bounded_affine_image
+#define ppl_Polyhedron_bounded_affine_preimage xsb_stub_ppl_Polyhedron_bounded_affine_preimage
+#define ppl_Polyhedron_generalized_affine_image xsb_stub_ppl_Polyhedron_generalized_affine_image
+#define ppl_Polyhedron_generalized_affine_preimage xsb_stub_ppl_Polyhedron_generalized_affine_preimage
+#define ppl_Polyhedron_generalized_affine_image_lhs_rhs xsb_stub_ppl_Polyhedron_generalized_affine_image_lhs_rhs
+#define ppl_Polyhedron_generalized_affine_preimage_lhs_rhs xsb_stub_ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+#define ppl_Polyhedron_time_elapse_assign xsb_stub_ppl_Polyhedron_time_elapse_assign
+#define ppl_Polyhedron_topological_closure_assign xsb_stub_ppl_Polyhedron_topological_closure_assign
+#define ppl_Polyhedron_BHRZ03_widening_assign_with_tokens xsb_stub_ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+#define ppl_Polyhedron_BHRZ03_widening_assign xsb_stub_ppl_Polyhedron_BHRZ03_widening_assign
+#define ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_limited_BHRZ03_extrapolation_assign xsb_stub_ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+#define ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign xsb_stub_ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+#define ppl_Polyhedron_H79_widening_assign_with_tokens xsb_stub_ppl_Polyhedron_H79_widening_assign_with_tokens
+#define ppl_Polyhedron_H79_widening_assign xsb_stub_ppl_Polyhedron_H79_widening_assign
+#define ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_limited_H79_extrapolation_assign xsb_stub_ppl_Polyhedron_limited_H79_extrapolation_assign
+#define ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens xsb_stub_ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+#define ppl_Polyhedron_bounded_H79_extrapolation_assign xsb_stub_ppl_Polyhedron_bounded_H79_extrapolation_assign
+#define ppl_Polyhedron_add_space_dimensions_and_project xsb_stub_ppl_Polyhedron_add_space_dimensions_and_project
+#define ppl_Polyhedron_add_space_dimensions_and_embed xsb_stub_ppl_Polyhedron_add_space_dimensions_and_embed
+#define ppl_Polyhedron_concatenate_assign xsb_stub_ppl_Polyhedron_concatenate_assign
+#define ppl_Polyhedron_remove_space_dimensions xsb_stub_ppl_Polyhedron_remove_space_dimensions
+#define ppl_Polyhedron_remove_higher_space_dimensions xsb_stub_ppl_Polyhedron_remove_higher_space_dimensions
+#define ppl_Polyhedron_expand_space_dimension xsb_stub_ppl_Polyhedron_expand_space_dimension
+#define ppl_Polyhedron_fold_space_dimensions xsb_stub_ppl_Polyhedron_fold_space_dimensions
+#define ppl_Polyhedron_map_space_dimensions xsb_stub_ppl_Polyhedron_map_space_dimensions
+#define ppl_new_LP_Problem_trivial xsb_stub_ppl_new_LP_Problem_trivial
+#define ppl_new_LP_Problem xsb_stub_ppl_new_LP_Problem
+#define ppl_new_LP_Problem_from_LP_Problem xsb_stub_ppl_new_LP_Problem_from_LP_Problem
+#define ppl_LP_Problem_swap xsb_stub_ppl_LP_Problem_swap
+#define ppl_delete_LP_Problem xsb_stub_ppl_delete_LP_Problem
+#define ppl_LP_Problem_space_dimension xsb_stub_ppl_LP_Problem_space_dimension
+#define ppl_LP_Problem_constraints xsb_stub_ppl_LP_Problem_constraints
+#define ppl_LP_Problem_objective_function xsb_stub_ppl_LP_Problem_objective_function
+#define ppl_LP_Problem_optimization_mode xsb_stub_ppl_LP_Problem_optimization_mode
+#define ppl_LP_Problem_clear xsb_stub_ppl_LP_Problem_clear
+#define ppl_LP_Problem_add_constraint xsb_stub_ppl_LP_Problem_add_constraint
+#define ppl_LP_Problem_add_constraints xsb_stub_ppl_LP_Problem_add_constraints
+#define ppl_LP_Problem_set_objective_function xsb_stub_ppl_LP_Problem_set_objective_function
+#define ppl_LP_Problem_set_optimization_mode xsb_stub_ppl_LP_Problem_set_optimization_mode
+#define ppl_LP_Problem_is_satisfiable xsb_stub_ppl_LP_Problem_is_satisfiable
+#define ppl_LP_Problem_solve xsb_stub_ppl_LP_Problem_solve
+#define ppl_LP_Problem_feasible_point xsb_stub_ppl_LP_Problem_feasible_point
+#define ppl_LP_Problem_optimizing_point xsb_stub_ppl_LP_Problem_optimizing_point
+#define ppl_LP_Problem_optimal_value xsb_stub_ppl_LP_Problem_optimal_value
+#define ppl_LP_Problem_evaluate_objective_function xsb_stub_ppl_LP_Problem_evaluate_objective_function
+#define ppl_LP_Problem_OK xsb_stub_ppl_LP_Problem_OK
+
+#include "../ppl_prolog.icc"
+
+#undef ppl_version_major
+#undef ppl_version_minor
+#undef ppl_version_revision
+#undef ppl_version_beta
+#undef ppl_version
+#undef ppl_banner
+#undef ppl_max_space_dimension
+#undef ppl_Coefficient_is_bounded
+#undef ppl_Coefficient_max
+#undef ppl_Coefficient_min
+#undef ppl_initialize
+#undef ppl_finalize
+#undef ppl_set_timeout_exception_atom
+#undef ppl_timeout_exception_atom
+#undef ppl_set_timeout
+#undef ppl_reset_timeout
+#undef ppl_new_C_Polyhedron_from_space_dimension
+#undef ppl_new_NNC_Polyhedron_from_space_dimension
+#undef ppl_new_C_Polyhedron_from_C_Polyhedron
+#undef ppl_new_C_Polyhedron_from_NNC_Polyhedron
+#undef ppl_new_NNC_Polyhedron_from_C_Polyhedron
+#undef ppl_new_NNC_Polyhedron_from_NNC_Polyhedron
+#undef ppl_new_C_Polyhedron_from_constraints
+#undef ppl_new_NNC_Polyhedron_from_constraints
+#undef ppl_new_C_Polyhedron_from_generators
+#undef ppl_new_NNC_Polyhedron_from_generators
+#undef ppl_new_C_Polyhedron_from_bounding_box
+#undef ppl_new_NNC_Polyhedron_from_bounding_box
+#undef ppl_Polyhedron_swap
+#undef ppl_delete_Polyhedron
+#undef ppl_Polyhedron_space_dimension
+#undef ppl_Polyhedron_affine_dimension
+#undef ppl_Polyhedron_get_constraints
+#undef ppl_Polyhedron_get_minimized_constraints
+#undef ppl_Polyhedron_get_generators
+#undef ppl_Polyhedron_get_minimized_generators
+#undef ppl_Polyhedron_relation_with_constraint
+#undef ppl_Polyhedron_relation_with_generator
+#undef ppl_Polyhedron_get_bounding_box
+#undef ppl_Polyhedron_is_empty
+#undef ppl_Polyhedron_is_universe
+#undef ppl_Polyhedron_is_bounded
+#undef ppl_Polyhedron_bounds_from_above
+#undef ppl_Polyhedron_bounds_from_below
+#undef ppl_Polyhedron_maximize
+#undef ppl_Polyhedron_maximize_with_point
+#undef ppl_Polyhedron_minimize
+#undef ppl_Polyhedron_minimize_with_point
+#undef ppl_Polyhedron_is_topologically_closed
+#undef ppl_Polyhedron_contains_Polyhedron
+#undef ppl_Polyhedron_strictly_contains_Polyhedron
+#undef ppl_Polyhedron_is_disjoint_from_Polyhedron
+#undef ppl_Polyhedron_equals_Polyhedron
+#undef ppl_Polyhedron_OK
+#undef ppl_Polyhedron_add_constraint
+#undef ppl_Polyhedron_add_constraint_and_minimize
+#undef ppl_Polyhedron_add_generator
+#undef ppl_Polyhedron_add_generator_and_minimize
+#undef ppl_Polyhedron_add_constraints
+#undef ppl_Polyhedron_add_constraints_and_minimize
+#undef ppl_Polyhedron_add_generators
+#undef ppl_Polyhedron_add_generators_and_minimize
+#undef ppl_Polyhedron_intersection_assign
+#undef ppl_Polyhedron_intersection_assign_and_minimize
+#undef ppl_Polyhedron_poly_hull_assign
+#undef ppl_Polyhedron_poly_hull_assign_and_minimize
+#undef ppl_Polyhedron_poly_difference_assign
+#undef ppl_Polyhedron_affine_image
+#undef ppl_Polyhedron_affine_preimage
+#undef ppl_Polyhedron_bounded_affine_image
+#undef ppl_Polyhedron_bounded_affine_preimage
+#undef ppl_Polyhedron_generalized_affine_image
+#undef ppl_Polyhedron_generalized_affine_preimage
+#undef ppl_Polyhedron_generalized_affine_image_lhs_rhs
+#undef ppl_Polyhedron_generalized_affine_preimage_lhs_rhs
+#undef ppl_Polyhedron_time_elapse_assign
+#undef ppl_Polyhedron_topological_closure_assign
+#undef ppl_Polyhedron_BHRZ03_widening_assign_with_tokens
+#undef ppl_Polyhedron_BHRZ03_widening_assign
+#undef ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_limited_BHRZ03_extrapolation_assign
+#undef ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign
+#undef ppl_Polyhedron_H79_widening_assign_with_tokens
+#undef ppl_Polyhedron_H79_widening_assign
+#undef ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_limited_H79_extrapolation_assign
+#undef ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens
+#undef ppl_Polyhedron_bounded_H79_extrapolation_assign
+#undef ppl_Polyhedron_add_space_dimensions_and_project
+#undef ppl_Polyhedron_add_space_dimensions_and_embed
+#undef ppl_Polyhedron_concatenate_assign
+#undef ppl_Polyhedron_remove_space_dimensions
+#undef ppl_Polyhedron_remove_higher_space_dimensions
+#undef ppl_Polyhedron_expand_space_dimension
+#undef ppl_Polyhedron_fold_space_dimensions
+#undef ppl_Polyhedron_map_space_dimensions
+#undef ppl_new_LP_Problem_trivial
+#undef ppl_new_LP_Problem
+#undef ppl_new_LP_Problem_from_LP_Problem
+#undef ppl_LP_Problem_swap
+#undef ppl_delete_LP_Problem
+#undef ppl_LP_Problem_space_dimension
+#undef ppl_LP_Problem_constraints
+#undef ppl_LP_Problem_objective_function
+#undef ppl_LP_Problem_optimization_mode
+#undef ppl_LP_Problem_clear
+#undef ppl_LP_Problem_add_constraint
+#undef ppl_LP_Problem_add_constraints
+#undef ppl_LP_Problem_set_objective_function
+#undef ppl_LP_Problem_set_optimization_mode
+#undef ppl_LP_Problem_is_satisfiable
+#undef ppl_LP_Problem_solve
+#undef ppl_LP_Problem_feasible_point
+#undef ppl_LP_Problem_optimizing_point
+#undef ppl_LP_Problem_optimal_value
+#undef ppl_LP_Problem_evaluate_objective_function
+#undef ppl_LP_Problem_OK
+
+#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); \
+}
+
+XSB_ENTRY_1(ppl_version_major)
+XSB_ENTRY_1(ppl_version_minor)
+XSB_ENTRY_1(ppl_version_revision)
+XSB_ENTRY_1(ppl_version_beta)
+XSB_ENTRY_1(ppl_version)
+XSB_ENTRY_1(ppl_banner)
+XSB_ENTRY_1(ppl_max_space_dimension)
+XSB_ENTRY_0(ppl_Coefficient_is_bounded)
+XSB_ENTRY_1(ppl_Coefficient_max)
+XSB_ENTRY_1(ppl_Coefficient_min)
+XSB_ENTRY_0(ppl_initialize)
+XSB_ENTRY_0(ppl_finalize)
+XSB_ENTRY_1(ppl_set_timeout_exception_atom)
+XSB_ENTRY_1(ppl_timeout_exception_atom)
+XSB_ENTRY_1(ppl_set_timeout)
+XSB_ENTRY_0(ppl_reset_timeout)
+XSB_ENTRY_3(ppl_new_C_Polyhedron_from_space_dimension)
+XSB_ENTRY_3(ppl_new_NNC_Polyhedron_from_space_dimension)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_constraints)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_constraints)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_generators)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_generators)
+XSB_ENTRY_2(ppl_new_C_Polyhedron_from_bounding_box)
+XSB_ENTRY_2(ppl_new_NNC_Polyhedron_from_bounding_box)
+XSB_ENTRY_2(ppl_Polyhedron_swap)
+XSB_ENTRY_1(ppl_delete_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_space_dimension)
+XSB_ENTRY_2(ppl_Polyhedron_affine_dimension)
+XSB_ENTRY_2(ppl_Polyhedron_get_constraints)
+XSB_ENTRY_2(ppl_Polyhedron_get_minimized_constraints)
+XSB_ENTRY_2(ppl_Polyhedron_get_generators)
+XSB_ENTRY_2(ppl_Polyhedron_get_minimized_generators)
+XSB_ENTRY_3(ppl_Polyhedron_relation_with_constraint)
+XSB_ENTRY_3(ppl_Polyhedron_relation_with_generator)
+XSB_ENTRY_3(ppl_Polyhedron_get_bounding_box)
+XSB_ENTRY_1(ppl_Polyhedron_is_empty)
+XSB_ENTRY_1(ppl_Polyhedron_is_universe)
+XSB_ENTRY_1(ppl_Polyhedron_is_bounded)
+XSB_ENTRY_2(ppl_Polyhedron_bounds_from_above)
+XSB_ENTRY_2(ppl_Polyhedron_bounds_from_below)
+XSB_ENTRY_5(ppl_Polyhedron_maximize)
+XSB_ENTRY_6(ppl_Polyhedron_maximize_with_point)
+XSB_ENTRY_5(ppl_Polyhedron_minimize)
+XSB_ENTRY_6(ppl_Polyhedron_minimize_with_point)
+XSB_ENTRY_1(ppl_Polyhedron_is_topologically_closed)
+XSB_ENTRY_2(ppl_Polyhedron_contains_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_strictly_contains_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
+XSB_ENTRY_2(ppl_Polyhedron_equals_Polyhedron)
+XSB_ENTRY_1(ppl_Polyhedron_OK)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraint)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraint_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_add_generator)
+XSB_ENTRY_2(ppl_Polyhedron_add_generator_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraints)
+XSB_ENTRY_2(ppl_Polyhedron_add_constraints_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_add_generators)
+XSB_ENTRY_2(ppl_Polyhedron_add_generators_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_intersection_assign)
+XSB_ENTRY_2(ppl_Polyhedron_intersection_assign_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_poly_hull_assign)
+XSB_ENTRY_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
+XSB_ENTRY_2(ppl_Polyhedron_poly_difference_assign)
+XSB_ENTRY_4(ppl_Polyhedron_affine_image)
+XSB_ENTRY_4(ppl_Polyhedron_affine_preimage)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_affine_image)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_affine_preimage)
+XSB_ENTRY_5(ppl_Polyhedron_generalized_affine_image)
+XSB_ENTRY_5(ppl_Polyhedron_generalized_affine_preimage)
+XSB_ENTRY_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
+XSB_ENTRY_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
+XSB_ENTRY_2(ppl_Polyhedron_time_elapse_assign)
+XSB_ENTRY_1(ppl_Polyhedron_topological_closure_assign)
+XSB_ENTRY_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
+XSB_ENTRY_2(ppl_Polyhedron_BHRZ03_widening_assign)
+XSB_ENTRY_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
+XSB_ENTRY_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
+XSB_ENTRY_2(ppl_Polyhedron_H79_widening_assign)
+XSB_ENTRY_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
+XSB_ENTRY_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
+XSB_ENTRY_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
+XSB_ENTRY_2(ppl_Polyhedron_add_space_dimensions_and_project)
+XSB_ENTRY_2(ppl_Polyhedron_add_space_dimensions_and_embed)
+XSB_ENTRY_2(ppl_Polyhedron_concatenate_assign)
+XSB_ENTRY_2(ppl_Polyhedron_remove_space_dimensions)
+XSB_ENTRY_2(ppl_Polyhedron_remove_higher_space_dimensions)
+XSB_ENTRY_3(ppl_Polyhedron_expand_space_dimension)
+XSB_ENTRY_3(ppl_Polyhedron_fold_space_dimensions)
+XSB_ENTRY_2(ppl_Polyhedron_map_space_dimensions)
+XSB_ENTRY_1(ppl_new_LP_Problem_trivial)
+XSB_ENTRY_4(ppl_new_LP_Problem)
+XSB_ENTRY_2(ppl_new_LP_Problem_from_LP_Problem)
+XSB_ENTRY_2(ppl_LP_Problem_swap)
+XSB_ENTRY_1(ppl_delete_LP_Problem)
+XSB_ENTRY_2(ppl_LP_Problem_space_dimension)
+XSB_ENTRY_2(ppl_LP_Problem_constraints)
+XSB_ENTRY_2(ppl_LP_Problem_objective_function)
+XSB_ENTRY_2(ppl_LP_Problem_optimization_mode)
+XSB_ENTRY_1(ppl_LP_Problem_clear)
+XSB_ENTRY_2(ppl_LP_Problem_add_constraint)
+XSB_ENTRY_2(ppl_LP_Problem_add_constraints)
+XSB_ENTRY_2(ppl_LP_Problem_set_objective_function)
+XSB_ENTRY_2(ppl_LP_Problem_set_optimization_mode)
+XSB_ENTRY_1(ppl_LP_Problem_is_satisfiable)
+XSB_ENTRY_2(ppl_LP_Problem_solve)
+XSB_ENTRY_2(ppl_LP_Problem_feasible_point)
+XSB_ENTRY_2(ppl_LP_Problem_optimizing_point)
+XSB_ENTRY_3(ppl_LP_Problem_optimal_value)
+XSB_ENTRY_4(ppl_LP_Problem_evaluate_objective_function)
+XSB_ENTRY_1(ppl_LP_Problem_OK)
+
+extern "C" void
+init() {
+ ppl_initialize();
+}
diff --git a/interfaces/Prolog/XSB/xsb_clpq.P b/interfaces/Prolog/XSB/xsb_clpq.P
new file mode 100644
index 0000000..b09b9fe
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq.P
@@ -0,0 +1,52 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_space_dimension/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/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..fa976d6
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_clpq2.P
@@ -0,0 +1,53 @@
+/* Prolog main program for the toy PPL/XSB-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_space_dimension/2,
+ ppl_Polyhedron_get_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/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_pl_check.P b/interfaces/Prolog/XSB/xsb_pl_check.P
new file mode 100644
index 0000000..807ad36
--- /dev/null
+++ b/interfaces/Prolog/XSB/xsb_pl_check.P
@@ -0,0 +1,163 @@
+/* Prolog main program for the PPL/XSB-Prolog predicate checker.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_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_new_C_Polyhedron_from_bounding_box/2,
+ ppl_new_NNC_Polyhedron_from_bounding_box/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_get_bounding_box/3,
+ ppl_Polyhedron_is_empty/1,
+ ppl_Polyhedron_is_universe/1,
+ ppl_Polyhedron_is_bounded/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_constraint_and_minimize/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_generator_and_minimize/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_add_generators_and_minimize/2,
+ ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_intersection_assign_and_minimize/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_hull_assign_and_minimize/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_new_LP_Problem_trivial/1,
+ ppl_new_LP_Problem/4,
+ ppl_new_LP_Problem_from_LP_Problem/2,
+ ppl_LP_Problem_swap/2,
+ ppl_delete_LP_Problem/1,
+ ppl_LP_Problem_space_dimension/2,
+ ppl_LP_Problem_constraints/2,
+ ppl_LP_Problem_objective_function/2,
+ ppl_LP_Problem_optimization_mode/2,
+ ppl_LP_Problem_clear/1,
+ ppl_LP_Problem_add_constraint/2,
+ ppl_LP_Problem_add_constraints/2,
+ ppl_LP_Problem_set_objective_function/2,
+ ppl_LP_Problem_set_optimization_mode/2,
+ ppl_LP_Problem_is_satisfiable/1,
+ ppl_LP_Problem_solve/2,
+ ppl_LP_Problem_feasible_point/2,
+ ppl_LP_Problem_optimizing_point/2,
+ ppl_LP_Problem_optimal_value/3,
+ ppl_LP_Problem_evaluate_objective_function/4,
+ ppl_LP_Problem_OK/1
+ 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..7a8740d
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.am
@@ -0,0 +1,125 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+EXTRA_DIST = ppl_yap.pl yap_clpq.pl yap_clpq2.pl yap_pl_check.pl
+
+if BUILD_YAP_PROLOG_INTERFACE
+if ENABLE_SHARED
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog/src \
+ at extra_includes@
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+endif NO_UNDEFINED
+
+pkglib_LTLIBRARIES = ppl_yap.la
+ppl_yap_la_SOURCES = ppl_yap.cc
+ppl_yap_la_LIBADD = \
+-lYap \
+$(top_builddir)/src/libppl.la \
+$(top_builddir)/Watchdog/src/libpwl.la \
+ at extra_libraries@
+
+ppl_yap_la_LDFLAGS = $(NO_UNDEFINED_FLAG) -module -avoid-version
+
+pkglib_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
+
+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 ../../../Watchdog/src/libpwl.la \
+ -dlopen ppl_yap.la \
+ yap -l $(srcdir)/yap_pl_check.pl \
+ <script_pchk >obtained_pchk
+ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ echo "main." >script_clpq
+ cat $(srcdir)/../tests/script_clpq >>script_clpq
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen ppl_yap.la \
+ yap -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)
+ LANG=C; \
+ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ echo "main." >script_clpq2
+ cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+ $(LIBTOOL) --mode=execute \
+ -dlopen ../../../src/libppl.la \
+ -dlopen ../../../Watchdog/src/libpwl.la \
+ -dlopen ppl_yap.la \
+ yap -l $(srcdir)/yap_clpq2.pl \
+ <script_clpq2 >obtained_clpq2
+ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+
+MOSTLYCLEANFILES = \
+script_clpq script_clpq2 script_pchk \
+obtained_clpq obtained_clpq2 obtained_pchk \
+$(CLPQ_TESTS)
+
+endif ENABLE_SHARED
+endif BUILD_YAP_PROLOG_INTERFACE
diff --git a/interfaces/Prolog/YAP/Makefile.in b/interfaces/Prolog/YAP/Makefile.in
new file mode 100644
index 0000000..d998ca5
--- /dev/null
+++ b/interfaces/Prolog/YAP/Makefile.in
@@ -0,0 +1,685 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(pkglibdir)" "$(DESTDIR)$(pkglibdir)"
+pkglibLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(pkglib_LTLIBRARIES)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_DEPENDENCIES = $(top_builddir)/src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(top_builddir)/Watchdog/src/libpwl.la
+am__ppl_yap_la_SOURCES_DIST = ppl_yap.cc
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_ppl_yap_la_OBJECTS = ppl_yap.lo
+ppl_yap_la_OBJECTS = $(am_ppl_yap_la_OBJECTS)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at am_ppl_yap_la_rpath = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -rpath \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(pkglibdir)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(ppl_yap_la_SOURCES)
+DIST_SOURCES = $(am__ppl_yap_la_SOURCES_DIST)
+pkglibDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(pkglib_DATA)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+EXTRA_DIST = ppl_yap.pl yap_clpq.pl yap_clpq2.pl yap_pl_check.pl
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at AM_CPPFLAGS = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/src \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -I$(top_builddir)/Watchdog/src \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_includes@
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@NO_UNDEFINED_TRUE at NO_UNDEFINED_FLAG = -no-undefined
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_LTLIBRARIES = ppl_yap.la
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_SOURCES = ppl_yap.cc
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_LIBADD = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at -lYap \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(top_builddir)/Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@@extra_libraries@
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ppl_yap_la_LDFLAGS = $(NO_UNDEFINED_FLAG) -module -avoid-version
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pkglib_DATA = ppl_yap.pl
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_NONSTRICT = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ack.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at ackn.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at fib.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at mc91.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at smm.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at sumto.clpq \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at tak.clpq
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS_STRICT = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at schedule.clpq
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at CLPQ_TESTS = $(CLPQ_TESTS_NONSTRICT) $(CLPQ_TESTS_STRICT)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at COEFFICIENT_MNEMONIC = @coefficient_mnemonic@
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ = $(srcdir)/../tests/expected_clpq_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_CLPQ2 = $(srcdir)/../tests/expected_clpq2_$(COEFFICIENT_MNEMONIC)_a
+ at ASSERTIONS_ENABLED_FALSE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)
+ at ASSERTIONS_ENABLED_TRUE@@BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at EXPECTED_PCHK = $(srcdir)/../tests/expected_pchk_$(COEFFICIENT_MNEMONIC)_a
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at MOSTLYCLEANFILES = \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at script_clpq script_clpq2 script_pchk \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at obtained_clpq obtained_clpq2 obtained_pchk \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@$(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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/YAP/Makefile'; \
+ 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
+install-pkglibLTLIBRARIES: $(pkglib_LTLIBRARIES)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(pkglibLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-pkglibLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(pkglibdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(pkglibdir)/$$p"; \
+ done
+
+clean-pkglibLTLIBRARIES:
+ -test -z "$(pkglib_LTLIBRARIES)" || rm -f $(pkglib_LTLIBRARIES)
+ @list='$(pkglib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+ppl_yap.la: $(ppl_yap_la_OBJECTS) $(ppl_yap_la_DEPENDENCIES)
+ $(CXXLINK) $(am_ppl_yap_la_rpath) $(ppl_yap_la_LDFLAGS) $(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_yap.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-pkglibDATA: $(pkglib_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(pkglibdir)" || $(mkdir_p) "$(DESTDIR)$(pkglibdir)"
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(pkglibDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ $(pkglibDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+uninstall-pkglibDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(pkglib_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(pkglibdir)/$$f'"; \
+ rm -f "$(DESTDIR)$(pkglibdir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
+ else \
+ test -f $(distdir)/$$file \
+ || cp -p $$d/$$file $(distdir)/$$file \
+ || exit 1; \
+ fi; \
+ done
+ at BUILD_YAP_PROLOG_INTERFACE_FALSE@check-local:
+ 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)$(pkglibdir)"; 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am: install-pkglibDATA install-pkglibLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am uninstall-pkglibDATA \
+ uninstall-pkglibLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am check-local clean \
+ clean-generic clean-libtool clean-pkglibLTLIBRARIES ctags \
+ 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-exec install-exec-am install-info \
+ install-info-am install-man install-pkglibDATA \
+ install-pkglibLTLIBRARIES 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 uninstall uninstall-am uninstall-info-am \
+ uninstall-pkglibDATA uninstall-pkglibLTLIBRARIES
+
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at check-local: pl_check_test clpq_test clpq2_test
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at pl_check_test: yap_pl_check.pl ppl_yap.pl ../tests/pl_check.pl $(EXPECTED_PCHK)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ echo "main." >script_pchk
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ yap -l $(srcdir)/yap_pl_check.pl \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ <script_pchk >obtained_pchk
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_PCHK) obtained_pchk
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq_test: yap_clpq.pl ppl_yap.pl ../tests/clpq.pl ../tests/script_clpq $(EXPECTED_CLPQ)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ LANG=C; \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ echo "main." >script_clpq
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cat $(srcdir)/../tests/script_clpq >>script_clpq
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ yap -l $(srcdir)/yap_clpq.pl \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ <script_clpq >obtained_clpq
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ) obtained_clpq
+
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE at clpq2_test: yap_clpq2.pl ppl_yap.pl ../tests/clpq2.pl ../tests/script_clpq2 $(EXPECTED_CLPQ2)
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ LANG=C; \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ for k in $(CLPQ_TESTS); do cp -f $(srcdir)/../tests/$$k .; done
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ echo "main." >script_clpq2
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ cat $(srcdir)/../tests/script_clpq2 >>script_clpq2
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ $(LIBTOOL) --mode=execute \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../src/libppl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ../../../Watchdog/src/libpwl.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ -dlopen ppl_yap.la \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ yap -l $(srcdir)/yap_clpq2.pl \
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ <script_clpq2 >obtained_clpq2
+ at BUILD_YAP_PROLOG_INTERFACE_TRUE@@ENABLE_SHARED_TRUE@ diff -u --ignore-all-space $(EXPECTED_CLPQ2) obtained_clpq2
+# 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/ppl_yap.cc b/interfaces/Prolog/YAP/ppl_yap.cc
new file mode 100644
index 0000000..9bd77fb
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_yap.cc
@@ -0,0 +1,725 @@
+/* YAP Prolog interface: system-dependent part.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include <Yap/YapInterface.h>
+#include <cassert>
+#include <cassert>
+#include <climits>
+
+typedef YAP_Term Prolog_term_ref;
+typedef YAP_Atom Prolog_atom;
+typedef YAP_Bool Prolog_foreign_return_type;
+
+namespace {
+
+const Prolog_foreign_return_type PROLOG_SUCCESS = TRUE;
+const Prolog_foreign_return_type PROLOG_FAILURE = FALSE;
+
+} // namespace
+
+#include "../exceptions.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+Prolog_atom a_throw;
+
+/*!
+ True if and only if the Prolog engine supports unbounded integers.
+*/
+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.
+*/
+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.
+*/
+long Prolog_max_integer;
+
+/*!
+ Temporary used to communicate big integers between C++ and Prolog.
+*/
+mpz_class tmp_mpz_class;
+
+/*!
+ Performs system-dependent initialization.
+*/
+void
+ppl_Prolog_sysdep_init() {
+ Prolog_has_unbounded_integers = true;
+ Prolog_min_integer = 0;
+ Prolog_max_integer = 0;
+
+ a_throw = YAP_LookupAtom("throw");
+}
+
+/*!
+ Perform system-dependent de-itialization.
+*/
+void
+ppl_Prolog_sysdep_deinit() {
+}
+
+/*!
+ 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;
+}
+
+/*!
+ 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 {
+ tmp_mpz_class = ul;
+ t = YAP_MkBigNumTerm(tmp_mpz_class.get_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) {
+ t = YAP_MkIntTerm(reinterpret_cast<long>(p));
+ return 1;
+}
+
+/*!
+ Return an atom whose name is given by the null-terminated string \p s.
+*/
+Prolog_atom
+Prolog_atom_from_string(const char* s) {
+ return YAP_FullLookupAtom(s);
+}
+
+Prolog_term_ref args[4];
+
+/*!
+ 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) {
+ 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) {
+ 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) {
+ 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) {
+ 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 list, 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) {
+ YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
+ if (tmp_mpz_class >= LONG_MIN && tmp_mpz_class <= LONG_MAX)
+ PPL::assign_r(*lp, tmp_mpz_class, PPL::ROUND_NOT_NEEDED);
+ 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 \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;
+}
+
+PPL::Coefficient
+integer_term_to_Coefficient(Prolog_term_ref t) {
+ PPL::Coefficient n;
+ if (YAP_IsBigNumTerm(t) != FALSE) {
+ YAP_BigNumOfTerm(t, tmp_mpz_class.get_mpz_t());
+ n = tmp_mpz_class;
+ }
+ else
+ n = YAP_IntOfTerm(t);
+ return n;
+}
+
+Prolog_term_ref
+Coefficient_to_integer_term(const PPL::Coefficient& n) {
+ if (n >= LONG_MIN && n <= LONG_MAX) {
+ long l = 0;
+ PPL::assign_r(l, n, PPL::ROUND_NOT_NEEDED);
+ return YAP_MkIntTerm(l);
+ }
+ else {
+ PPL::assign_r(tmp_mpz_class, n, PPL::ROUND_NOT_NEEDED);
+ return YAP_MkBigNumTerm(tmp_mpz_class.get_mpz_t());
+ }
+}
+
+} // namespace
+
+#include "../ppl_prolog.icc"
+
+#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); \
+}
+
+YAP_STUB_1(ppl_version_major)
+YAP_STUB_1(ppl_version_minor)
+YAP_STUB_1(ppl_version_revision)
+YAP_STUB_1(ppl_version_beta)
+YAP_STUB_1(ppl_version)
+YAP_STUB_1(ppl_banner)
+YAP_STUB_1(ppl_max_space_dimension)
+YAP_STUB_0(ppl_Coefficient_is_bounded)
+YAP_STUB_1(ppl_Coefficient_max)
+YAP_STUB_1(ppl_Coefficient_min)
+YAP_STUB_0(ppl_initialize)
+YAP_STUB_0(ppl_finalize)
+YAP_STUB_1(ppl_set_timeout_exception_atom)
+YAP_STUB_1(ppl_timeout_exception_atom)
+YAP_STUB_1(ppl_set_timeout)
+YAP_STUB_0(ppl_reset_timeout)
+YAP_STUB_3(ppl_new_C_Polyhedron_from_space_dimension)
+YAP_STUB_3(ppl_new_NNC_Polyhedron_from_space_dimension)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_C_Polyhedron)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_NNC_Polyhedron)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_C_Polyhedron)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_constraints)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_constraints)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_generators)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_generators)
+YAP_STUB_2(ppl_new_C_Polyhedron_from_bounding_box)
+YAP_STUB_2(ppl_new_NNC_Polyhedron_from_bounding_box)
+YAP_STUB_2(ppl_Polyhedron_swap)
+YAP_STUB_1(ppl_delete_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_space_dimension)
+YAP_STUB_2(ppl_Polyhedron_affine_dimension)
+YAP_STUB_2(ppl_Polyhedron_get_constraints)
+YAP_STUB_2(ppl_Polyhedron_get_minimized_constraints)
+YAP_STUB_2(ppl_Polyhedron_get_generators)
+YAP_STUB_2(ppl_Polyhedron_get_minimized_generators)
+YAP_STUB_3(ppl_Polyhedron_relation_with_constraint)
+YAP_STUB_3(ppl_Polyhedron_relation_with_generator)
+YAP_STUB_3(ppl_Polyhedron_get_bounding_box)
+YAP_STUB_1(ppl_Polyhedron_is_empty)
+YAP_STUB_1(ppl_Polyhedron_is_universe)
+YAP_STUB_1(ppl_Polyhedron_is_bounded)
+YAP_STUB_2(ppl_Polyhedron_bounds_from_above)
+YAP_STUB_2(ppl_Polyhedron_bounds_from_below)
+YAP_STUB_5(ppl_Polyhedron_maximize)
+YAP_STUB_6(ppl_Polyhedron_maximize_with_point)
+YAP_STUB_5(ppl_Polyhedron_minimize)
+YAP_STUB_6(ppl_Polyhedron_minimize_with_point)
+YAP_STUB_1(ppl_Polyhedron_is_topologically_closed)
+YAP_STUB_2(ppl_Polyhedron_contains_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_strictly_contains_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_is_disjoint_from_Polyhedron)
+YAP_STUB_2(ppl_Polyhedron_equals_Polyhedron)
+YAP_STUB_1(ppl_Polyhedron_OK)
+YAP_STUB_2(ppl_Polyhedron_add_constraint)
+YAP_STUB_2(ppl_Polyhedron_add_constraint_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_add_generator)
+YAP_STUB_2(ppl_Polyhedron_add_generator_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_add_constraints)
+YAP_STUB_2(ppl_Polyhedron_add_constraints_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_add_generators)
+YAP_STUB_2(ppl_Polyhedron_add_generators_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_intersection_assign)
+YAP_STUB_2(ppl_Polyhedron_intersection_assign_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_poly_hull_assign)
+YAP_STUB_2(ppl_Polyhedron_poly_hull_assign_and_minimize)
+YAP_STUB_2(ppl_Polyhedron_poly_difference_assign)
+YAP_STUB_4(ppl_Polyhedron_affine_image)
+YAP_STUB_4(ppl_Polyhedron_affine_preimage)
+YAP_STUB_5(ppl_Polyhedron_bounded_affine_image)
+YAP_STUB_5(ppl_Polyhedron_bounded_affine_preimage)
+YAP_STUB_5(ppl_Polyhedron_generalized_affine_image)
+YAP_STUB_5(ppl_Polyhedron_generalized_affine_preimage)
+YAP_STUB_4(ppl_Polyhedron_generalized_affine_image_lhs_rhs)
+YAP_STUB_4(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs)
+YAP_STUB_2(ppl_Polyhedron_time_elapse_assign)
+YAP_STUB_1(ppl_Polyhedron_topological_closure_assign)
+YAP_STUB_4(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens)
+YAP_STUB_2(ppl_Polyhedron_BHRZ03_widening_assign)
+YAP_STUB_5(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign)
+YAP_STUB_5(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign)
+YAP_STUB_4(ppl_Polyhedron_H79_widening_assign_with_tokens)
+YAP_STUB_2(ppl_Polyhedron_H79_widening_assign)
+YAP_STUB_5(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_limited_H79_extrapolation_assign)
+YAP_STUB_5(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens)
+YAP_STUB_3(ppl_Polyhedron_bounded_H79_extrapolation_assign)
+YAP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_project)
+YAP_STUB_2(ppl_Polyhedron_add_space_dimensions_and_embed)
+YAP_STUB_2(ppl_Polyhedron_concatenate_assign)
+YAP_STUB_2(ppl_Polyhedron_remove_space_dimensions)
+YAP_STUB_2(ppl_Polyhedron_remove_higher_space_dimensions)
+YAP_STUB_3(ppl_Polyhedron_expand_space_dimension)
+YAP_STUB_3(ppl_Polyhedron_fold_space_dimensions)
+YAP_STUB_2(ppl_Polyhedron_map_space_dimensions)
+YAP_STUB_1(ppl_new_LP_Problem_trivial)
+YAP_STUB_4(ppl_new_LP_Problem)
+YAP_STUB_2(ppl_new_LP_Problem_from_LP_Problem)
+YAP_STUB_2(ppl_LP_Problem_swap)
+YAP_STUB_1(ppl_delete_LP_Problem)
+YAP_STUB_2(ppl_LP_Problem_space_dimension)
+YAP_STUB_2(ppl_LP_Problem_constraints)
+YAP_STUB_2(ppl_LP_Problem_objective_function)
+YAP_STUB_2(ppl_LP_Problem_optimization_mode)
+YAP_STUB_1(ppl_LP_Problem_clear)
+YAP_STUB_2(ppl_LP_Problem_add_constraint)
+YAP_STUB_2(ppl_LP_Problem_add_constraints)
+YAP_STUB_2(ppl_LP_Problem_set_objective_function)
+YAP_STUB_2(ppl_LP_Problem_set_optimization_mode)
+YAP_STUB_1(ppl_LP_Problem_is_satisfiable)
+YAP_STUB_2(ppl_LP_Problem_solve)
+YAP_STUB_2(ppl_LP_Problem_feasible_point)
+YAP_STUB_2(ppl_LP_Problem_optimizing_point)
+YAP_STUB_3(ppl_LP_Problem_optimal_value)
+YAP_STUB_4(ppl_LP_Problem_evaluate_objective_function)
+YAP_STUB_1(ppl_LP_Problem_OK)
+
+#define YAP_USER_C_PREDICATE(name, arity) \
+ YAP_UserCPredicate(#name, reinterpret_cast<int(*)()>(yap_stub_##name), arity)
+
+extern "C" void
+init() {
+ ppl_initialize();
+ YAP_USER_C_PREDICATE(ppl_version_major, 1);
+ YAP_USER_C_PREDICATE(ppl_version_minor, 1);
+ YAP_USER_C_PREDICATE(ppl_version_revision, 1);
+ YAP_USER_C_PREDICATE(ppl_version_beta, 1);
+ YAP_USER_C_PREDICATE(ppl_version, 1);
+ YAP_USER_C_PREDICATE(ppl_banner, 1);
+ YAP_USER_C_PREDICATE(ppl_max_space_dimension, 1);
+ YAP_USER_C_PREDICATE(ppl_Coefficient_is_bounded, 0);
+ YAP_USER_C_PREDICATE(ppl_Coefficient_max, 1);
+ YAP_USER_C_PREDICATE(ppl_Coefficient_min, 1);
+ YAP_USER_C_PREDICATE(ppl_initialize, 0);
+ YAP_USER_C_PREDICATE(ppl_finalize, 0);
+ YAP_USER_C_PREDICATE(ppl_set_timeout_exception_atom, 1);
+ YAP_USER_C_PREDICATE(ppl_timeout_exception_atom, 1);
+ YAP_USER_C_PREDICATE(ppl_set_timeout, 1);
+ YAP_USER_C_PREDICATE(ppl_reset_timeout, 0);
+ YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_space_dimension, 3);
+ YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_space_dimension, 3);
+ YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_C_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_NNC_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_C_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_NNC_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_constraints, 2);
+ YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_constraints, 2);
+ YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_generators, 2);
+ YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_generators, 2);
+ YAP_USER_C_PREDICATE(ppl_new_C_Polyhedron_from_bounding_box, 2);
+ YAP_USER_C_PREDICATE(ppl_new_NNC_Polyhedron_from_bounding_box, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_swap, 2);
+ YAP_USER_C_PREDICATE(ppl_delete_Polyhedron, 1);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_space_dimension, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_dimension, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_get_constraints, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_get_minimized_constraints, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_get_generators, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_get_minimized_generators, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_relation_with_constraint, 3);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_relation_with_generator, 3);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_get_bounding_box, 3);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_is_empty, 1);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_is_universe, 1);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_is_bounded, 1);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_bounds_from_above, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_bounds_from_below, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_maximize, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_maximize_with_point, 6);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_minimize, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_minimize_with_point, 6);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_is_topologically_closed, 1);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_contains_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_strictly_contains_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_is_disjoint_from_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_equals_Polyhedron, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_OK, 1);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraint, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraint_and_minimize, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generator, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generator_and_minimize, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraints, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_constraints_and_minimize, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generators, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_generators_and_minimize, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_intersection_assign, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_intersection_assign_and_minimize, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_hull_assign, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_hull_assign_and_minimize, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_poly_difference_assign, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_image, 4);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_affine_preimage, 4);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_affine_image, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_affine_preimage, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_image, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_image_lhs_rhs, 4);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_generalized_affine_preimage_lhs_rhs, 4);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_time_elapse_assign, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_topological_closure_assign, 1);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign_with_tokens, 4);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_BHRZ03_widening_assign, 2);
+ YAP_USER_C_PREDICATE(
+ ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign, 3);
+ YAP_USER_C_PREDICATE(
+ ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign, 3);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_H79_widening_assign_with_tokens, 4);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_H79_widening_assign, 2);
+ YAP_USER_C_PREDICATE(
+ ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_limited_H79_extrapolation_assign, 3);
+ YAP_USER_C_PREDICATE(
+ ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens, 5);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_bounded_H79_extrapolation_assign, 3);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_project, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_add_space_dimensions_and_embed, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_concatenate_assign, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_remove_space_dimensions, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_remove_higher_space_dimensions, 2);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_expand_space_dimension, 3);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_fold_space_dimensions, 3);
+ YAP_USER_C_PREDICATE(ppl_Polyhedron_map_space_dimensions, 2);
+ YAP_USER_C_PREDICATE(ppl_new_LP_Problem_trivial, 1);
+ YAP_USER_C_PREDICATE(ppl_new_LP_Problem, 4);
+ YAP_USER_C_PREDICATE(ppl_new_LP_Problem_from_LP_Problem, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_swap, 2);
+ YAP_USER_C_PREDICATE(ppl_delete_LP_Problem, 1);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_space_dimension, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_constraints, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_objective_function, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_optimization_mode, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_clear, 1);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_add_constraint, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_add_constraints, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_set_objective_function, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_set_optimization_mode, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_is_satisfiable, 1);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_solve, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_feasible_point, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_optimizing_point, 2);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_optimal_value, 3);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_evaluate_objective_function, 4);
+ YAP_USER_C_PREDICATE(ppl_LP_Problem_OK, 1);
+}
diff --git a/interfaces/Prolog/YAP/ppl_yap.pl b/interfaces/Prolog/YAP/ppl_yap.pl
new file mode 100644
index 0000000..2420b2a
--- /dev/null
+++ b/interfaces/Prolog/YAP/ppl_yap.pl
@@ -0,0 +1,23 @@
+/* Loader for the YAP Prolog interface.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+:- load_foreign_files(['ppl_yap'],[],init).
diff --git a/interfaces/Prolog/YAP/yap_clpq.pl b/interfaces/Prolog/YAP/yap_clpq.pl
new file mode 100644
index 0000000..83e6c56
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq.pl
@@ -0,0 +1,30 @@
+/* Prolog main program for the toy PPL/YAP-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..95dfb2f
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_clpq2.pl
@@ -0,0 +1,30 @@
+/* Prolog main program for the 2nd toy PPL/YAP-Prolog CLP(Q) interpreter.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_pl_check.pl b/interfaces/Prolog/YAP/yap_pl_check.pl
new file mode 100644
index 0000000..7df31e1
--- /dev/null
+++ b/interfaces/Prolog/YAP/yap_pl_check.pl
@@ -0,0 +1,34 @@
+/* Prolog main program for the PPL/YAP-Prolog predicate checker.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/exceptions.hh b/interfaces/Prolog/exceptions.hh
new file mode 100644
index 0000000..51e5322
--- /dev/null
+++ b/interfaces/Prolog/exceptions.hh
@@ -0,0 +1,174 @@
+/* Exceptions used internally by the Prolog interfaces.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+class internal_exception {
+private:
+ Prolog_term_ref tr;
+
+public:
+ explicit internal_exception(Prolog_term_ref t)
+ : tr(t) {
+ }
+
+ virtual ~internal_exception() {
+ }
+
+ virtual Prolog_term_ref term() const {
+ return tr;
+ }
+};
+
+class Prolog_unsigned_out_of_range : public internal_exception {
+private:
+ unsigned long m;
+
+public:
+ explicit Prolog_unsigned_out_of_range(Prolog_term_ref t, unsigned long max)
+ : internal_exception(t),
+ m(max) {
+ }
+
+ unsigned long max() const {
+ return m;
+ }
+
+};
+
+class non_linear : public internal_exception {
+private:
+ const char* w;
+
+public:
+ explicit non_linear(const char* s, Prolog_term_ref t)
+ : internal_exception(t), w(s) {
+ }
+
+ const char* where() const {
+ return w;
+ }
+};
+
+class not_an_integer : public internal_exception {
+public:
+ explicit not_an_integer(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_unsigned_integer : public internal_exception {
+public:
+ explicit not_unsigned_integer(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_a_variable : public internal_exception {
+public:
+ explicit not_a_variable(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_a_polyhedron_kind : public internal_exception {
+public:
+ explicit not_a_polyhedron_kind(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_a_polyhedron_handle : public internal_exception {
+public:
+ explicit not_a_polyhedron_handle(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_an_optimization_mode : public internal_exception {
+public:
+ explicit not_an_optimization_mode(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_an_lp_problem_handle : public internal_exception {
+public:
+ explicit not_an_lp_problem_handle(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_a_complexity_class : public internal_exception {
+public:
+ explicit not_a_complexity_class(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_universe_or_empty : public internal_exception {
+public:
+ explicit not_universe_or_empty(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_a_relation : public internal_exception {
+public:
+ explicit not_a_relation(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class not_a_nil_terminated_list : public internal_exception {
+public:
+ explicit not_a_nil_terminated_list(Prolog_term_ref t)
+ : internal_exception(t) {
+ }
+};
+
+class PPL_integer_out_of_range {
+private:
+ Parma_Polyhedra_Library::Coefficient n;
+
+public:
+ explicit
+ PPL_integer_out_of_range(const Parma_Polyhedra_Library::Coefficient& i)
+ : n(i) {
+ }
+
+ const Parma_Polyhedra_Library::Coefficient i() const {
+ return n;
+ }
+};
+
+class unknown_interface_error {
+private:
+ const char* w;
+
+public:
+ unknown_interface_error(const char* s)
+ : w(s) {
+ }
+
+ const char* where() const {
+ return w;
+ }
+};
diff --git a/interfaces/Prolog/ppl_prolog.icc b/interfaces/Prolog/ppl_prolog.icc
new file mode 100644
index 0000000..eb8df70
--- /dev/null
+++ b/interfaces/Prolog/ppl_prolog.icc
@@ -0,0 +1,3483 @@
+/* Common part of the Prolog interfaces. -*- C++ -*-
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.hh"
+#include "pwl.hh"
+#include "track_allocation.hh"
+#include <set>
+#include <vector>
+#include <exception>
+#include <stdexcept>
+#include <sstream>
+#include <climits>
+
+using namespace Parma_Polyhedra_Library;
+
+namespace {
+
+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 generators.
+Prolog_atom a_line;
+Prolog_atom a_ray;
+Prolog_atom a_point;
+Prolog_atom a_closure_point;
+
+// 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 outcomes of LP 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;
+
+// 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_invalid_argument;
+Prolog_atom a_ppl_overflow_error;
+Prolog_atom a_ppl_domain_error;
+Prolog_atom a_ppl_length_error;
+Prolog_atom a_ppl_representation_error;
+Prolog_atom a_expected;
+Prolog_atom a_found;
+Prolog_atom a_where;
+
+struct {
+ Prolog_atom* p_atom;
+ const char* name;
+} const prolog_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_line, "line" },
+ { &a_ray, "ray" },
+ { &a_point, "point" },
+ { &a_closure_point, "closure_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_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_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_representation_error, "ppl_representation_error" },
+ { &a_expected, "expected" },
+ { &a_found, "found" },
+ { &a_where, "where" }
+};
+
+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_than_or_equal_to"),
+ 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("term_to_unsigned"));
+
+ 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("term_to_unsigned"));
+
+ 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("term_to_Variable"));
+
+ 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
+ ("term_to_Coefficient"));
+
+ 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_polyhedron_handle& 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("polyhedron_handle"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string
+ ("term_to_polyhedron_handle"));
+
+ 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
+ ("term_to_optimization_mode"));
+ 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_lp_problem_handle& 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("lp_problem_handle"));
+
+ Prolog_term_ref where = Prolog_new_term_ref();
+ Prolog_construct_compound(where, a_where,
+ Prolog_atom_term_from_string
+ ("term_to_lp_problem_handle"));
+
+ 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
+ ("term_to_complexity_class"));
+ 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
+ ("term_to_universe_or_empty"));
+ 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
+ ("term_to_relation"));
+ 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
+ ("check_nil_terminating"));
+ 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.i();
+ Prolog_construct_compound(exception_term, a_ppl_representation_error,
+ Prolog_atom_term_from_string(s.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::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::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);
+}
+
+class timeout_exception : public Throwable {
+public:
+ void throw_me() const {
+ throw *this;
+ }
+ int priority() const {
+ return 0;
+ }
+ timeout_exception() {
+ }
+};
+
+Prolog_atom timeout_exception_atom;
+
+Parma_Watchdog_Library::Watchdog* p_timeout_object = 0;
+
+void
+reset_timeout() {
+ if (p_timeout_object) {
+ delete p_timeout_object;
+ p_timeout_object = 0;
+ abandon_expensive_computations = 0;
+ }
+}
+
+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);
+}
+
+#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 not_a_polyhedron_handle& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_an_optimization_mode& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_an_lp_problem_handle& e) { \
+ handle_exception(e); \
+ } \
+ catch (const not_a_complexity_class& 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 std::overflow_error& e) { \
+ handle_exception(e); \
+ } \
+ catch(const std::length_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) {
+ 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;
+}
+
+#if 0
+unsigned int
+get_unsigned_int(long n) {
+ if (n >= 0 && static_cast<unsigned long>(n) <= UINT_MAX)
+ return n;
+ else {
+ Prolog_term_ref n_term = Prolog_new_term_ref();
+ Prolog_put_long(n_term, n);
+ throw not_unsigned_integer(n_term);
+ }
+}
+#endif
+
+template <typename U>
+U
+term_to_unsigned(Prolog_term_ref t) {
+ if (!Prolog_is_integer(t))
+ throw not_unsigned_integer(t);
+
+ U d = 0;
+ long l;
+ if (Prolog_get_long(t, &l))
+ if (l < 0)
+ throw not_unsigned_integer(t);
+ else if (static_cast<unsigned long>(l) > std::numeric_limits<U>::max())
+ throw Prolog_unsigned_out_of_range(t, std::numeric_limits<U>::max());
+ else
+ d = l;
+ else {
+ Coefficient v = integer_term_to_Coefficient(t);
+ if (v < 0)
+ throw not_unsigned_integer(t);
+ if (assign_r(d, raw_value(v), ROUND_NOT_NEEDED) != V_EQ)
+ throw Prolog_unsigned_out_of_range(t, std::numeric_limits<U>::max());
+ }
+ return d;
+}
+
+Prolog_atom
+term_to_universe_or_empty(Prolog_term_ref t) {
+ 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);
+}
+
+Linear_Expression
+build_linear_expression(Prolog_term_ref t) {
+ 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);
+ else if (functor == a_dollar_VAR)
+ // Variable.
+ return Variable(term_to_unsigned<dimension_type>(arg));
+ }
+ 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);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ + integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1)
+ + build_linear_expression(arg2);
+ else if (functor == a_minus)
+ // Minus.
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ - build_linear_expression(arg2);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ - integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1)
+ - build_linear_expression(arg2);
+ else if (functor == a_asterisk)
+ // Times.
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ * build_linear_expression(arg2);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ * integer_term_to_Coefficient(arg2);
+ }
+ }
+ }
+ // Invalid.
+ throw non_linear("build_linear_expression", t);
+}
+
+
+Constraint
+build_constraint(Prolog_term_ref t) {
+ 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);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ == integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1)
+ == build_linear_expression(arg2);
+ else if (functor == a_equal_less_than)
+ // =<
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ <= build_linear_expression(arg2);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ <= integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1)
+ <= build_linear_expression(arg2);
+ else if (functor == a_greater_than_equal)
+ // >=
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ >= build_linear_expression(arg2);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ >= integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1)
+ >= build_linear_expression(arg2);
+ else if (functor == a_less_than)
+ // <
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ < build_linear_expression(arg2);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ < integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1)
+ < build_linear_expression(arg2);
+ else if (functor == a_greater_than)
+ // >
+ if (Prolog_is_integer(arg1))
+ return integer_term_to_Coefficient(arg1)
+ > build_linear_expression(arg2);
+ else if (Prolog_is_integer(arg2))
+ return build_linear_expression(arg1)
+ > integer_term_to_Coefficient(arg2);
+ else
+ return build_linear_expression(arg1)
+ > build_linear_expression(arg2);
+ }
+ }
+ // Invalid.
+ throw non_linear("build_constraint", t);
+}
+
+Generator
+build_generator(Prolog_term_ref t) {
+ 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));
+ else if (functor == a_ray)
+ return Generator::ray(build_linear_expression(arg));
+ else if (functor == a_point)
+ return Generator::point(build_linear_expression(arg));
+ else if (functor == a_closure_point)
+ return Generator::closure_point(build_linear_expression(arg));
+ }
+ 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),
+ integer_term_to_Coefficient(arg2));
+ else if (functor == a_closure_point)
+ return Generator::closure_point(build_linear_expression(arg1),
+ integer_term_to_Coefficient(arg2));
+ }
+ }
+ }
+ // Invalid.
+ throw non_linear("build_generator", t);
+}
+
+template <typename R>
+Prolog_term_ref
+get_linear_expression(const R& r) {
+ Prolog_term_ref so_far = Prolog_new_term_ref();
+ 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
+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_linear_expression(c),
+ Coefficient_to_integer_term(-c.inhomogeneous_term()));
+ 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_linear_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_linear_expression(g),
+ Coefficient_to_integer_term(divisor));
+ return t;
+ }
+ }
+ default:
+ throw unknown_interface_error("generator_term()");
+ }
+ Prolog_construct_compound(t, constructor, get_linear_expression(g));
+ return t;
+}
+
+Variable
+term_to_Variable(Prolog_term_ref t) {
+ 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));
+ }
+ }
+ throw not_a_variable(t);
+}
+
+Coefficient
+term_to_Coefficient(Prolog_term_ref t) {
+ if (Prolog_is_integer(t))
+ return integer_term_to_Coefficient(t);
+ else
+ throw not_an_integer(t);
+}
+
+Polyhedron*
+term_to_polyhedron_handle(Prolog_term_ref t_ph) {
+ if (Prolog_is_address(t_ph)) {
+ void* p;
+ if (Prolog_get_address(t_ph, &p))
+ return static_cast<Polyhedron*>(p);
+ }
+ throw not_a_polyhedron_handle(t_ph);
+}
+
+LP_Problem*
+term_to_lp_problem_handle(Prolog_term_ref t_lp) {
+ if (Prolog_is_address(t_lp)) {
+ void* p;
+ if (Prolog_get_address(t_lp, &p))
+ return static_cast<LP_Problem*>(p);
+ }
+ throw not_an_lp_problem_handle(t_lp);
+}
+
+Prolog_atom
+term_to_optimization_mode(Prolog_term_ref t) {
+ 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);
+}
+
+bool Prolog_interface_initialized = false;
+
+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);
+}
+
+void
+check_nil_terminating(Prolog_term_ref t) {
+ 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);
+}
+
+} // namespace
+
+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;
+}
+
+namespace {
+
+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));
+}
+
+} // namespace
+
+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;
+ for (size_t
+ i = sizeof(prolog_atoms)/sizeof(prolog_atoms[0]); i-- > 0; ) {
+ Prolog_atom a = Prolog_atom_from_string(prolog_atoms[i].name);
+ *prolog_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;
+ // 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_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_time) {
+ try {
+ // In case a timeout was already set.
+ reset_timeout();
+ static timeout_exception e;
+ unsigned hundredth_secs = term_to_unsigned<unsigned>(t_time);
+ p_timeout_object =
+ new Parma_Watchdog_Library::Watchdog(hundredth_secs,
+ 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_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) {
+ Coefficient min = std::numeric_limits<Coefficient>::min();
+ if (Prolog_has_unbounded_integers
+ || (min >= Prolog_min_integer && min <= Prolog_min_integer))
+ return Prolog_unify(t_min, Coefficient_to_integer_term(min));
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Coefficient_max(Prolog_term_ref t_max) {
+ try {
+ if (std::numeric_limits<Coefficient>::is_bounded) {
+ Coefficient max = std::numeric_limits<Coefficient>::max();
+ if (Prolog_has_unbounded_integers
+ || (max >= Prolog_min_integer && max <= Prolog_min_integer))
+ return Prolog_unify(t_max, Coefficient_to_integer_term(max));
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_space_dimension(Prolog_term_ref t_nd,
+ Prolog_term_ref t_uoe,
+ Prolog_term_ref t_ph) {
+ try {
+ Polyhedron* ph;
+ Prolog_atom uoe = term_to_universe_or_empty(t_uoe);
+
+ if (uoe == a_empty)
+ ph = new C_Polyhedron(term_to_unsigned<dimension_type>(t_nd),
+ EMPTY);
+ else
+ ph = new C_Polyhedron(term_to_unsigned<dimension_type>(t_nd));
+
+
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_space_dimension(Prolog_term_ref t_nd,
+ Prolog_term_ref t_uoe,
+ Prolog_term_ref t_ph) {
+ try {
+ Polyhedron* ph;
+ Prolog_atom uoe = term_to_universe_or_empty(t_uoe);
+
+ if (uoe == a_empty)
+ ph = new NNC_Polyhedron(term_to_unsigned<dimension_type>(t_nd),
+ EMPTY);
+ else
+ ph = new NNC_Polyhedron(term_to_unsigned<dimension_type>(t_nd));
+
+
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_C_Polyhedron(Prolog_term_ref t_ph_source,
+ Prolog_term_ref t_ph) {
+ try {
+ Polyhedron* ph;
+ const C_Polyhedron* ph_source
+ = static_cast<const C_Polyhedron*>
+ (term_to_polyhedron_handle(t_ph_source));
+ CHECK(ph_source);
+ ph = new C_Polyhedron(*ph_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_C_Polyhedron(Prolog_term_ref t_ph_source,
+ Prolog_term_ref t_ph) {
+ try {
+ Polyhedron* ph;
+ const C_Polyhedron* ph_source
+ = static_cast<const C_Polyhedron*>
+ (term_to_polyhedron_handle(t_ph_source));
+ CHECK(ph_source);
+ ph = new NNC_Polyhedron(*ph_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_NNC_Polyhedron(Prolog_term_ref t_ph_source,
+ Prolog_term_ref t_ph) {
+ try {
+ Polyhedron* ph;
+ const NNC_Polyhedron* ph_source
+ = static_cast<const NNC_Polyhedron*>
+ (term_to_polyhedron_handle(t_ph_source));
+ CHECK(ph_source);
+ ph = new C_Polyhedron(*ph_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_NNC_Polyhedron(Prolog_term_ref t_ph_source,
+ Prolog_term_ref t_ph) {
+ try {
+ Polyhedron* ph;
+ const NNC_Polyhedron* ph_source
+ = static_cast<const NNC_Polyhedron*>
+ (term_to_polyhedron_handle(t_ph_source));
+ CHECK(ph_source);
+ ph = new NNC_Polyhedron(*ph_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_constraints(Prolog_term_ref t_clist,
+ Prolog_term_ref t_ph) {
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ Polyhedron* ph;
+ ph = new C_Polyhedron(cs);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_constraints(Prolog_term_ref t_clist,
+ Prolog_term_ref t_ph) {
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ Polyhedron* ph;
+ ph = new NNC_Polyhedron(cs);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_generators(Prolog_term_ref t_glist,
+ Prolog_term_ref t_ph) {
+ try {
+ Generator_System gs;
+ Prolog_term_ref g = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_glist)) {
+ Prolog_get_cons(t_glist, g, t_glist);
+ gs.insert(build_generator(g));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_glist);
+
+ Polyhedron* ph;
+ ph = new C_Polyhedron(gs);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_generators(Prolog_term_ref t_glist,
+ Prolog_term_ref t_ph) {
+ try {
+ Generator_System gs;
+ Prolog_term_ref g = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_glist)) {
+ Prolog_get_cons(t_glist, g, t_glist);
+ gs.insert(build_generator(g));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_glist);
+
+ Polyhedron* ph;
+ ph = new NNC_Polyhedron(gs);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+namespace {
+
+enum Boundary_Kind {
+ LOWER,
+ UPPER
+};
+
+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 ? 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;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_new_C_Polyhedron_from_bounding_box(Prolog_term_ref t_bb,
+ Prolog_term_ref t_ph) {
+ try {
+ // Compute the space dimension.
+ Prolog_term_ref t_l = Prolog_new_term_ref();
+ Prolog_term_ref t_interval = Prolog_new_term_ref();
+ Prolog_put_term(t_l, t_bb);
+ dimension_type dimension;
+ for (dimension = 0; Prolog_is_cons(t_l); ++dimension)
+ Prolog_get_cons(t_l, t_interval, t_l);
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_l);
+
+ Bounding_Box bbox(dimension);
+ // Set bbox to reflect its Prolog representation.
+ for (dimension_type i = 0; i < dimension; ++i) {
+ Prolog_get_cons(t_bb, t_interval, t_bb);
+ // An interval is either the atom empty or of the form
+ // i(Lower_Bound, Upper_Bound).
+ if (Prolog_is_atom(t_interval)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t_interval, &name) && name == a_empty) {
+ bbox.set_empty();
+ continue;
+ }
+ else
+ return PROLOG_FAILURE;
+ }
+
+ if (!Prolog_is_compound(t_interval))
+ return PROLOG_FAILURE;
+
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t_interval, &functor, &arity);
+ if (arity != 2 || functor != a_i)
+ return PROLOG_FAILURE;
+
+ bool finite;
+ bool closed;
+ Coefficient n;
+ Coefficient d;
+ Prolog_term_ref t_bound = Prolog_new_term_ref();
+
+ // Get and raise the lower bound.
+ Prolog_get_arg(1, t_interval, t_bound);
+ if (!term_to_boundary(t_bound, LOWER, finite, closed, n, d))
+ return PROLOG_FAILURE;
+ if (finite)
+ bbox.raise_lower_bound(i, closed, n, d);
+
+ // Get and lower the upper bound.
+ Prolog_get_arg(2, t_interval, t_bound);
+ if (!term_to_boundary(t_bound, UPPER, finite, closed, n, d))
+ return PROLOG_FAILURE;
+ if (finite)
+ bbox.lower_upper_bound(i, closed, n, d);
+ }
+
+ Polyhedron* ph;
+ ph = new C_Polyhedron(bbox, From_Bounding_Box());
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_NNC_Polyhedron_from_bounding_box(Prolog_term_ref t_bb,
+ Prolog_term_ref t_ph) {
+ try {
+ // Compute the space dimension.
+ Prolog_term_ref t_l = Prolog_new_term_ref();
+ Prolog_term_ref t_interval = Prolog_new_term_ref();
+ Prolog_put_term(t_l, t_bb);
+ dimension_type dimension;
+ for (dimension = 0; Prolog_is_cons(t_l); ++dimension)
+ Prolog_get_cons(t_l, t_interval, t_l);
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_l);
+
+ Bounding_Box bbox(dimension);
+ // Set bbox to reflect its Prolog representation.
+ for (dimension_type i = 0; i < dimension; ++i) {
+ Prolog_get_cons(t_bb, t_interval, t_bb);
+ // An interval is either the atom empty or of the form
+ // i(Lower_Bound, Upper_Bound).
+ if (Prolog_is_atom(t_interval)) {
+ Prolog_atom name;
+ if (Prolog_get_atom_name(t_interval, &name) && name == a_empty) {
+ bbox.set_empty();
+ continue;
+ }
+ else
+ return PROLOG_FAILURE;
+ }
+
+ if (!Prolog_is_compound(t_interval))
+ return PROLOG_FAILURE;
+
+ Prolog_atom functor;
+ int arity;
+ Prolog_get_compound_name_arity(t_interval, &functor, &arity);
+ if (arity != 2 || functor != a_i)
+ return PROLOG_FAILURE;
+
+ bool finite;
+ bool closed;
+ Coefficient n;
+ Coefficient d;
+ Prolog_term_ref t_bound = Prolog_new_term_ref();
+
+ // Get and raise the lower bound.
+ Prolog_get_arg(1, t_interval, t_bound);
+ if (!term_to_boundary(t_bound, LOWER, finite, closed, n, d))
+ return PROLOG_FAILURE;
+ if (finite)
+ bbox.raise_lower_bound(i, closed, n, d);
+
+ // Get and lower the upper bound.
+ Prolog_get_arg(2, t_interval, t_bound);
+ if (!term_to_boundary(t_bound, UPPER, finite, closed, n, d))
+ return PROLOG_FAILURE;
+ if (finite)
+ bbox.lower_upper_bound(i, closed, n, d);
+ }
+
+ Polyhedron* ph;
+ ph = new NNC_Polyhedron(bbox, From_Bounding_Box());
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, ph);
+ if (Prolog_unify(t_ph, tmp)) {
+ REGISTER(ph);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete ph;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ lhs->swap(*rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_Polyhedron(Prolog_term_ref t_ph) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ UNREGISTER(ph);
+ delete ph;
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_space_dimension(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (unify_ulong(t_sd, ph->space_dimension()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_affine_dimension(Prolog_term_ref t_ph, Prolog_term_ref t_sd) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (unify_ulong(t_sd, ph->affine_dimension()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_constraints(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Constraint_System& cs = ph->constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_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_Polyhedron_get_minimized_constraints(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Constraint_System& cs = ph->minimized_constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_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_Polyhedron_get_generators(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Generator_System& gs = ph->generators();
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ Prolog_construct_cons(tail, generator_term(*i), tail);
+
+ if (Prolog_unify(t_glist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_minimized_generators(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Generator_System& gs = ph->minimized_generators();
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i)
+ Prolog_construct_cons(tail, generator_term(*i), tail);
+
+ if (Prolog_unify(t_glist, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_relation_with_constraint(Prolog_term_ref t_ph,
+ Prolog_term_ref t_c,
+ Prolog_term_ref t_r) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Poly_Con_Relation r = ph->relation_with(build_constraint(t_c));
+
+ 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();
+ }
+ }
+ if (Prolog_unify(t_r, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_relation_with_generator(Prolog_term_ref t_ph,
+ Prolog_term_ref t_g,
+ Prolog_term_ref t_r) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Poly_Gen_Relation r = ph->relation_with(build_generator(t_g));
+
+ 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();
+ }
+ }
+ if (Prolog_unify(t_r, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+namespace {
+
+Prolog_term_ref
+extended_rational_term(const ERational& e) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ if (is_plus_infinity(e))
+ Prolog_put_atom(t, a_pinf);
+ else if (is_minus_infinity(e))
+ Prolog_put_atom(t, a_minf);
+ else {
+ Coefficient numerator = raw_value(e).get_num();
+ Coefficient denominator = raw_value(e).get_den();
+ if (denominator == 1)
+ Prolog_put_term(t, Coefficient_to_integer_term(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 Interval& i) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ if (i.is_empty())
+ Prolog_put_atom(t, a_empty);
+ else {
+ // Lower bound.
+ const LBoundary& l = i.lower_bound();
+ Prolog_term_ref lt = Prolog_new_term_ref();
+ if (l.is_closed())
+ Prolog_construct_compound(lt, a_c, extended_rational_term(l.bound()));
+ else
+ Prolog_construct_compound(lt, a_o, extended_rational_term(l.bound()));
+
+ // Upper bound.
+ const UBoundary& u = i.upper_bound();
+ Prolog_term_ref ut = Prolog_new_term_ref();
+ if (u.is_closed())
+ Prolog_construct_compound(ut, a_c, extended_rational_term(u.bound()));
+ else
+ Prolog_construct_compound(ut, a_o, extended_rational_term(u.bound()));
+
+ Prolog_construct_compound(t, a_i, lt, ut);
+ }
+ return t;
+}
+
+Prolog_atom
+term_to_complexity_class(Prolog_term_ref t) {
+ 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);
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_get_bounding_box(Prolog_term_ref t_ph,
+ Prolog_term_ref t_cc,
+ Prolog_term_ref t_bb) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+
+ Prolog_atom p_cc = term_to_complexity_class(t_cc);
+ Complexity_Class cc;
+ if (p_cc == a_polynomial)
+ cc = POLYNOMIAL_COMPLEXITY;
+ else if (p_cc == a_simplex)
+ cc = SIMPLEX_COMPLEXITY;
+ else
+ cc = ANY_COMPLEXITY;
+
+ dimension_type dimension = ph->space_dimension();
+ Bounding_Box bbox(dimension);
+ ph->shrink_bounding_box(bbox, cc);
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ for (dimension_type i = dimension; i-- > 0; )
+ Prolog_construct_cons(tail, interval_term(bbox[i]), tail);
+ if (Prolog_unify(t_bb, tail))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_empty(Prolog_term_ref t_ph) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (ph->is_empty())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_universe(Prolog_term_ref t_ph) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (ph->is_universe())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_bounded(Prolog_term_ref t_ph) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (ph->is_bounded())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounds_from_above(Prolog_term_ref t_ph,
+ Prolog_term_ref t_expr) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Linear_Expression l = build_linear_expression(t_expr);
+ if (ph->bounds_from_above(l))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounds_from_below(Prolog_term_ref t_ph,
+ Prolog_term_ref t_expr) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Linear_Expression l = build_linear_expression(t_expr);
+ if (ph->bounds_from_below(l))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_maximize(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_max) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ const Linear_Expression le = build_linear_expression(t_le_expr);
+ Coefficient n;
+ Coefficient d;
+ bool max;
+ if (ph->maximize(le, n, d, max)) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom a = (max ? a_true : a_false);
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+ && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+ && Prolog_unify(t_max, t))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_maximize_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_max,
+ Prolog_term_ref t_g) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ const Linear_Expression le = build_linear_expression(t_le_expr);
+ Coefficient n;
+ Coefficient d;
+ bool max;
+ Generator g(point());
+ if (ph->maximize(le, n, d, max, g)) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom a = (max ? a_true : a_false);
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+ && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+ && Prolog_unify(t_max, t)
+ && Prolog_unify(t_g, generator_term(g)))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_minimize(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_min) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ const Linear_Expression le = build_linear_expression(t_le_expr);
+ Coefficient n;
+ Coefficient d;
+ bool min;
+ if (ph->minimize(le, n, d, min)) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom a = (min ? a_true : a_false);
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+ && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+ && Prolog_unify(t_min, t))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_minimize_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_min,
+ Prolog_term_ref t_g) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ const Linear_Expression le = build_linear_expression(t_le_expr);
+ Coefficient n;
+ Coefficient d;
+ bool min;
+ Generator g(point());
+ if (ph->minimize(le, n, d, min, g)) {
+ Prolog_term_ref t = Prolog_new_term_ref();
+ Prolog_atom a = (min ? a_true : a_false);
+ Prolog_put_atom(t, a);
+ if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+ && Prolog_unify(t_d, Coefficient_to_integer_term(d))
+ && Prolog_unify(t_min, t)
+ && Prolog_unify(t_g, generator_term(g)))
+ return PROLOG_SUCCESS;
+ }
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_topologically_closed(Prolog_term_ref t_ph) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (ph->is_topologically_closed())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_topological_closure_assign(Prolog_term_ref t_ph) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->topological_closure_assign();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_contains_Polyhedron(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ try {
+ const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ if (lhs->contains(*rhs))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_strictly_contains_Polyhedron(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ try {
+ const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ if (lhs->strictly_contains(*rhs))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_is_disjoint_from_Polyhedron(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ try {
+ const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ if (lhs->is_disjoint_from(*rhs))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_equals_Polyhedron(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ try {
+ const Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ if (*lhs == *rhs)
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_OK(Prolog_term_ref t_ph) {
+ try {
+ const Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (ph->OK())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraint(Prolog_term_ref t_ph, Prolog_term_ref t_c) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->add_constraint(build_constraint(t_c));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraint_and_minimize(Prolog_term_ref t_ph,
+ Prolog_term_ref t_c) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (ph->add_constraint_and_minimize(build_constraint(t_c)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generator(Prolog_term_ref t_ph, Prolog_term_ref t_g) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->add_generator(build_generator(t_g));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generator_and_minimize(Prolog_term_ref t_ph,
+ Prolog_term_ref t_g) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ if (ph->add_generator_and_minimize(build_generator(t_g)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraints(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ ph->add_constraints(cs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_constraints_and_minimize(Prolog_term_ref t_ph,
+ Prolog_term_ref t_clist) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ if (ph->add_constraints_and_minimize(cs))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generators(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Generator_System gs;
+ Prolog_term_ref g = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_glist)) {
+ Prolog_get_cons(t_glist, g, t_glist);
+ gs.insert(build_generator(g));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_glist);
+
+ ph->add_generators(gs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_generators_and_minimize(Prolog_term_ref t_ph,
+ Prolog_term_ref t_glist) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Generator_System gs;
+ Prolog_term_ref g = Prolog_new_term_ref();
+
+ while (Prolog_is_cons(t_glist)) {
+ Prolog_get_cons(t_glist, g, t_glist);
+ gs.insert(build_generator(g));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_glist);
+
+ if (ph->add_generators_and_minimize(gs))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+namespace {
+
+Prolog_foreign_return_type
+bop_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ void (Polyhedron::* bop_assign)(const Polyhedron&)) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ (lhs->*bop_assign)(*rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+bop_assign_and_minimize(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ bool (Polyhedron::*
+ bop_assign_and_minimize)(const Polyhedron&)) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ if ((lhs->*bop_assign_and_minimize)(*rhs))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_intersection_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return bop_assign(t_lhs, t_rhs,
+ &Polyhedron::intersection_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_intersection_assign_and_minimize(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return bop_assign_and_minimize(t_lhs, t_rhs,
+ &Polyhedron::intersection_assign_and_minimize);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_poly_hull_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return bop_assign(t_lhs, t_rhs,
+ &Polyhedron::poly_hull_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_poly_hull_assign_and_minimize(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return bop_assign_and_minimize(t_lhs, t_rhs,
+ &Polyhedron::poly_hull_assign_and_minimize);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_poly_difference_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return bop_assign(t_lhs, t_rhs,
+ &Polyhedron::poly_difference_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_time_elapse_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return bop_assign(t_lhs, t_rhs,
+ &Polyhedron::time_elapse_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_affine_image(Prolog_term_ref t_ph, Prolog_term_ref t_v,
+ Prolog_term_ref t_le, Prolog_term_ref t_d) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->affine_image(term_to_Variable(t_v),
+ build_linear_expression(t_le),
+ term_to_Coefficient(t_d));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_affine_preimage(Prolog_term_ref t_ph, Prolog_term_ref t_v,
+ Prolog_term_ref t_le, Prolog_term_ref t_d) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->affine_preimage(term_to_Variable(t_v),
+ build_linear_expression(t_le),
+ term_to_Coefficient(t_d));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+namespace {
+
+Prolog_atom
+term_to_relation(Prolog_term_ref t) {
+ 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);
+}
+
+Relation_Symbol
+term_to_relation_symbol(Prolog_term_ref t_r) {
+ Prolog_atom ra = term_to_relation(t_r);
+ Relation_Symbol r;
+ if (ra == a_less_than)
+ r = LESS_THAN;
+ else if (ra == a_equal_less_than)
+ r = LESS_THAN_OR_EQUAL;
+ else if (ra == a_equal)
+ r = EQUAL;
+ else if (ra == a_greater_than_equal)
+ r = GREATER_THAN_OR_EQUAL;
+ else r = GREATER_THAN;
+
+ return r;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_image(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) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Relation_Symbol r = term_to_relation_symbol(t_r);
+ ph->generalized_affine_image(term_to_Variable(t_v),
+ r,
+ build_linear_expression(t_le),
+ term_to_Coefficient(t_d));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_preimage(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) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Relation_Symbol r = term_to_relation_symbol(t_r);
+ ph->generalized_affine_preimage(term_to_Variable(t_v),
+ r,
+ build_linear_expression(t_le),
+ term_to_Coefficient(t_d));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_image_lhs_rhs(Prolog_term_ref t_ph,
+ Prolog_term_ref t_lhs,
+ Prolog_term_ref t_r,
+ Prolog_term_ref t_rhs) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Relation_Symbol r = term_to_relation_symbol(t_r);
+ ph->generalized_affine_image(build_linear_expression(t_lhs),
+ r,
+ build_linear_expression(t_rhs));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_generalized_affine_preimage_lhs_rhs(Prolog_term_ref t_ph,
+ Prolog_term_ref t_lhs,
+ Prolog_term_ref t_r,
+ Prolog_term_ref t_rhs) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ Relation_Symbol r = term_to_relation_symbol(t_r);
+ ph->generalized_affine_preimage(build_linear_expression(t_lhs),
+ r,
+ build_linear_expression(t_rhs));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_affine_image(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) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->bounded_affine_image(term_to_Variable(t_v),
+ build_linear_expression(t_lb_le),
+ build_linear_expression(t_ub_le),
+ term_to_Coefficient(t_d));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_affine_preimage(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) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->bounded_affine_preimage(term_to_Variable(t_v),
+ build_linear_expression(t_lb_le),
+ build_linear_expression(t_ub_le),
+ term_to_Coefficient(t_d));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+namespace {
+
+Prolog_foreign_return_type
+widening_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ void (Polyhedron::* widening_assign)(const Polyhedron&,
+ unsigned* tp)) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ (lhs->*widening_assign)(*rhs, 0);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+widening_assign_with_tokens(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti,
+ Prolog_term_ref t_to,
+ void (Polyhedron::*
+ widening_assign)(const Polyhedron&,
+ unsigned* tp)) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ unsigned t = term_to_unsigned<unsigned>(t_ti);
+ (lhs->*widening_assign)(*rhs, &t);
+ if (unify_long(t_to, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+widening_assign_with_token(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_t,
+ void (Polyhedron::*
+ widening_assign)(const Polyhedron&,
+ unsigned* tp)) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ unsigned t = 1;
+ (lhs->*widening_assign)(*rhs, &t);
+ if (unify_long(t_t, 1-t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+limited_extrapolation_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_clist,
+ void (Polyhedron::*
+ limited_extrap_assign)(const Polyhedron&,
+ const Constraint_System&,
+ unsigned* tp)) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ (lhs->*limited_extrap_assign)(*rhs, cs, 0);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+Prolog_foreign_return_type
+limited_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,
+ void (Polyhedron::*
+ limited_extrap_assign)(const Polyhedron&,
+ const Constraint_System&,
+ unsigned* tp)) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ unsigned t = term_to_unsigned<unsigned>(t_ti);
+ (lhs->*limited_extrap_assign)(*rhs, cs, &t);
+ if (unify_long(t_to, t))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_BHRZ03_widening_assign_with_tokens(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti,
+ Prolog_term_ref t_to) {
+ return widening_assign_with_tokens(t_lhs, t_rhs, t_ti, t_to,
+ &Polyhedron::BHRZ03_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_BHRZ03_widening_assign_with_token(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_t) {
+ return widening_assign_with_token(t_lhs, t_rhs, t_t,
+ &Polyhedron::BHRZ03_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_BHRZ03_widening_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return widening_assign(t_lhs, t_rhs, &Polyhedron::BHRZ03_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_BHRZ03_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) {
+ return limited_extrapolation_assign_with_tokens(t_lhs,
+ t_rhs,
+ t_clist,
+ t_ti,
+ t_to,
+ &Polyhedron::
+ limited_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_clist) {
+ return limited_extrapolation_assign(t_lhs,
+ t_rhs,
+ t_clist,
+ &Polyhedron::
+ limited_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_BHRZ03_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) {
+ return limited_extrapolation_assign_with_tokens(t_lhs,
+ t_rhs,
+ t_clist,
+ t_ti,
+ t_to,
+ &Polyhedron::
+ bounded_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_clist) {
+ return limited_extrapolation_assign(t_lhs,
+ t_rhs,
+ t_clist,
+ &Polyhedron::
+ bounded_BHRZ03_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_H79_widening_assign_with_tokens(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_ti,
+ Prolog_term_ref t_to) {
+ return widening_assign_with_tokens(t_lhs, t_rhs, t_ti, t_to,
+ &Polyhedron::H79_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_H79_widening_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ return widening_assign(t_lhs, t_rhs, &Polyhedron::H79_widening_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_H79_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) {
+ return limited_extrapolation_assign_with_tokens(t_lhs,
+ t_rhs,
+ t_clist,
+ t_ti,
+ t_to,
+ &Polyhedron::
+ limited_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_limited_H79_extrapolation_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_clist) {
+ return limited_extrapolation_assign(t_lhs,
+ t_rhs,
+ t_clist,
+ &Polyhedron::
+ limited_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_H79_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) {
+ return limited_extrapolation_assign_with_tokens(t_lhs,
+ t_rhs,
+ t_clist,
+ t_ti,
+ t_to,
+ &Polyhedron::
+ bounded_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_bounded_H79_extrapolation_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs,
+ Prolog_term_ref t_clist) {
+ return limited_extrapolation_assign(t_lhs,
+ t_rhs,
+ t_clist,
+ &Polyhedron::
+ bounded_H79_extrapolation_assign);
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_space_dimensions_and_project(Prolog_term_ref t_ph,
+ Prolog_term_ref t_nnd) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ dimension_type d = term_to_unsigned<dimension_type>(t_nnd);
+ ph->add_space_dimensions_and_project(d);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_add_space_dimensions_and_embed(Prolog_term_ref t_ph,
+ Prolog_term_ref t_nnd) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ dimension_type d = term_to_unsigned<dimension_type>(t_nnd);
+ ph->add_space_dimensions_and_embed(d);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_concatenate_assign(Prolog_term_ref t_lhs,
+ Prolog_term_ref t_rhs) {
+ try {
+ Polyhedron* lhs = term_to_polyhedron_handle(t_lhs);
+ const Polyhedron* rhs = term_to_polyhedron_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ lhs->concatenate_assign(*rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_remove_space_dimensions(Prolog_term_ref t_ph,
+ Prolog_term_ref t_vlist) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist);
+
+ ph->remove_space_dimensions(dead_variables);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_remove_higher_space_dimensions(Prolog_term_ref t_ph,
+ Prolog_term_ref t_nd) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->remove_higher_space_dimensions(term_to_unsigned<dimension_type>(t_nd));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_expand_space_dimension(Prolog_term_ref t_ph,
+ Prolog_term_ref t_v,
+ Prolog_term_ref t_nd) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ CHECK(ph);
+ ph->expand_space_dimension(term_to_Variable(t_v),
+ term_to_unsigned<dimension_type>(t_nd));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_fold_space_dimensions(Prolog_term_ref t_ph,
+ Prolog_term_ref t_vlist,
+ Prolog_term_ref t_v) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_vlist);
+
+ ph->fold_space_dimensions(fold_variables, term_to_Variable(t_v));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+namespace {
+
+class PFunc {
+private:
+ std::set<dimension_type> codomain;
+ std::vector<dimension_type> vec;
+
+public:
+ PFunc() {
+ }
+
+ bool has_empty_codomain() const {
+ return codomain.empty();
+ }
+
+ dimension_type max_in_codomain() const {
+ if (codomain.empty())
+ throw unknown_interface_error("PFunc::max_in_codomain()");
+ return *codomain.rbegin();
+ }
+
+ bool 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;
+ }
+
+ bool insert(dimension_type i, dimension_type j) {
+ std::pair<std::set<dimension_type>::iterator, bool> s
+ = codomain.insert(j);
+ if (!s.second)
+ // *this is not injective!
+ return false;
+ if (i > vec.size())
+ vec.insert(vec.end(), i - vec.size(), not_a_dimension());
+ if (i == vec.size()) {
+ vec.insert(vec.end(), j);
+ return true;
+ }
+ dimension_type& vec_i = vec[i];
+ if (vec_i != not_a_dimension())
+ // Already mapped: *this is not a function!
+ return false;
+ vec_i = j;
+ return true;
+ }
+};
+
+} // namespace
+
+extern "C" Prolog_foreign_return_type
+ppl_Polyhedron_map_space_dimensions(Prolog_term_ref t_ph,
+ Prolog_term_ref t_pfunc) {
+ try {
+ Polyhedron* ph = term_to_polyhedron_handle(t_ph);
+ dimension_type space_dim = ph->space_dimension();
+ CHECK(ph);
+ PFunc 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).id();
+ dimension_type j = term_to_Variable(t_j).id();
+ if (i >= space_dim || !pfunc.insert(i, j))
+ return PROLOG_FAILURE;
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_pfunc);
+
+ ph->map_space_dimensions(pfunc);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+
+}
+
+
+extern "C" Prolog_foreign_return_type
+ppl_new_LP_Problem_trivial(Prolog_term_ref t_lp) {
+ try {
+ LP_Problem* lp = new LP_Problem;
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, lp);
+ if (Prolog_unify(t_lp, tmp)) {
+ REGISTER(lp);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete lp;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_LP_Problem(Prolog_term_ref t_clist,
+ Prolog_term_ref t_le_expr,
+ Prolog_term_ref t_opt,
+ Prolog_term_ref t_lp) {
+ 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));
+ }
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ const Linear_Expression le = build_linear_expression(t_le_expr);
+ Prolog_atom opt = term_to_optimization_mode(t_opt);
+ Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+
+ LP_Problem* lp = new LP_Problem(cs, le, mode);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, lp);
+ if (Prolog_unify(t_lp, tmp)) {
+ REGISTER(lp);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete lp;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_new_LP_Problem_from_LP_Problem(Prolog_term_ref t_lp_source,
+ Prolog_term_ref t_lp) {
+ try {
+ const LP_Problem* lp_source
+ = static_cast<const LP_Problem*>
+ (term_to_lp_problem_handle(t_lp_source));
+ CHECK(lp_source);
+ LP_Problem* lp = new LP_Problem(*lp_source);
+ Prolog_term_ref tmp = Prolog_new_term_ref();
+ Prolog_put_address(tmp, lp);
+ if (Prolog_unify(t_lp, tmp)) {
+ REGISTER(lp);
+ return PROLOG_SUCCESS;
+ }
+ else
+ delete lp;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_swap(Prolog_term_ref t_lhs, Prolog_term_ref t_rhs) {
+ try {
+ LP_Problem* lhs = term_to_lp_problem_handle(t_lhs);
+ LP_Problem* rhs = term_to_lp_problem_handle(t_rhs);
+ CHECK(lhs);
+ CHECK(rhs);
+ lhs->swap(*rhs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_delete_LP_Problem(Prolog_term_ref t_lp) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ UNREGISTER(lp);
+ delete lp;
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_space_dimension(Prolog_term_ref t_lp, Prolog_term_ref t_sd) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ if (unify_ulong(t_sd, lp->space_dimension()))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_constraints(Prolog_term_ref t_lp,
+ Prolog_term_ref t_clist) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+
+ Prolog_term_ref tail = Prolog_new_term_ref();
+ Prolog_put_atom(tail, a_nil);
+ const Constraint_System& cs = lp->constraints();
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_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_LP_Problem_objective_function(Prolog_term_ref t_lp,
+ Prolog_term_ref t_le_expr) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+
+ const Linear_Expression& le = lp->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_LP_Problem_optimization_mode(Prolog_term_ref t_lp,
+ Prolog_term_ref t_opt) {
+ try {
+ LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+
+ Optimization_Mode mode = lp->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_LP_Problem_clear(Prolog_term_ref t_lp) {
+ try {
+ LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ lp->clear();
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_add_constraint(Prolog_term_ref t_lp, Prolog_term_ref t_c) {
+ try {
+ LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ lp->add_constraint(build_constraint(t_c));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_add_constraints(Prolog_term_ref t_lp,
+ Prolog_term_ref t_clist) {
+ try {
+ LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ 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));
+ }
+
+ // Check the list is properly terminated.
+ check_nil_terminating(t_clist);
+
+ lp->add_constraints(cs);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_set_objective_function(Prolog_term_ref t_lp,
+ Prolog_term_ref t_le_expr) {
+ try {
+ LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ lp->set_objective_function(build_linear_expression(t_le_expr));
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_set_optimization_mode(Prolog_term_ref t_lp,
+ Prolog_term_ref t_opt) {
+ try {
+ LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+
+ Prolog_atom opt = term_to_optimization_mode(t_opt);
+ Optimization_Mode mode = (opt == a_max) ? MAXIMIZATION : MINIMIZATION;
+ lp->set_optimization_mode(mode);
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_is_satisfiable(Prolog_term_ref t_lp) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ if (lp->is_satisfiable())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_solve(Prolog_term_ref t_lp, Prolog_term_ref t_status) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+
+ Prolog_atom a;
+ switch (lp->solve()) {
+ case UNFEASIBLE_LP_PROBLEM:
+ a = a_unfeasible;
+ break;
+ case UNBOUNDED_LP_PROBLEM:
+ a = a_unbounded;
+ break;
+ case OPTIMIZED_LP_PROBLEM:
+ a = a_optimized;
+ break;
+ default:
+ throw unknown_interface_error("ppl_LP_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_LP_Problem_feasible_point(Prolog_term_ref t_lp,
+ Prolog_term_ref t_g) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ const Generator& g = lp->feasible_point();
+ if (Prolog_unify(t_g, generator_term(g)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_optimizing_point(Prolog_term_ref t_lp,
+ Prolog_term_ref t_g) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ const Generator& g = lp->optimizing_point();
+ if (Prolog_unify(t_g, generator_term(g)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_optimal_value(Prolog_term_ref t_lp,
+ Prolog_term_ref t_n,
+ Prolog_term_ref t_d) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ Coefficient n;
+ Coefficient d;
+ lp->optimal_value(n, d);
+ if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+ && Prolog_unify(t_d, Coefficient_to_integer_term(d)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_evaluate_objective_function(Prolog_term_ref t_lp,
+ Prolog_term_ref t_g,
+ Prolog_term_ref t_n,
+ Prolog_term_ref t_d) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ Coefficient n;
+ Coefficient d;
+ lp->evaluate_objective_function(build_generator(t_g), n, d);
+ if (Prolog_unify(t_n, Coefficient_to_integer_term(n))
+ && Prolog_unify(t_d, Coefficient_to_integer_term(d)))
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
+
+extern "C" Prolog_foreign_return_type
+ppl_LP_Problem_OK(Prolog_term_ref t_lp) {
+ try {
+ const LP_Problem* lp = term_to_lp_problem_handle(t_lp);
+ CHECK(lp);
+ if (lp->OK())
+ return PROLOG_SUCCESS;
+ }
+ CATCH_ALL;
+}
diff --git a/interfaces/Prolog/tests/Makefile.am b/interfaces/Prolog/tests/Makefile.am
new file mode 100644
index 0000000..6522380
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.am
@@ -0,0 +1,51 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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 \
+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
diff --git a/interfaces/Prolog/tests/Makefile.in b/interfaces/Prolog/tests/Makefile.in
new file mode 100644
index 0000000..0a111d0
--- /dev/null
+++ b/interfaces/Prolog/tests/Makefile.in
@@ -0,0 +1,465 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+SOURCES =
+DIST_SOURCES =
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_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 \
+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
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign interfaces/Prolog/tests/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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
+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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-man install-strip \
+ installcheck installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-generic \
+ mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
+ uninstall-info-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/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..ed75fea
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq.pl
@@ -0,0 +1,801 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can 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.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/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),
+ % Fails if `Polyhedron' becomes empty.
+ ppl_Polyhedron_add_constraints_and_minimize(Polyhedron, Constraints_List).
+
+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-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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..5853afe
--- /dev/null
+++ b/interfaces/Prolog/tests/clpq2.pl
@@ -0,0 +1,1119 @@
+% A toy, non-ground meta-interpreter for CLP(Q)
+% for testing the Parma Polyhedra Library and its Prolog interface.
+%
+% Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+%
+% This file is part of the Parma Polyhedra Library (PPL).
+%
+% The PPL is free software; you can 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.
+%
+% The PPL is distributed in the hope that it will be useful, but WITHOUT
+% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+% for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software Foundation,
+% Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+%
+% For the most up-to-date information see the Parma Polyhedra Library
+% site: http://www.cs.unipr.it/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.
+ terms2wanted_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.
+ term2PPLterm(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.
+ constraints2list(Constraints, Constraints_List),
+
+ % Fails if `Poly' becomes empty.
+ ppl_Polyhedron_add_constraints_and_minimize(Poly, Constraints_List).
+
+% 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.
+ terms2PPLterms(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_and_minimize(Poly_Copy, Binding_Constraints),
+ % 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.
+ term2wanted_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) :-
+ % 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) :-
+ !,
+ 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('$VAR'(N), Variable_Names) :-
+% write_var('$VAR'(N), Variable_Names).
+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),
+ !,
+ 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 %%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% term2wanted_dims(?Term, -List_of_Integers)
+%
+% Takes a term and returns list of numbers in the PPL variables
+% of the form '$VAR'(k).
+
+term2wanted_dims(V, Ns, Ns) :-
+ var(V),
+ !.
+term2wanted_dims('$VAR'(N), Ns, [N|Ns]) :-
+ !.
+term2wanted_dims(Term, Ns_In, Ns_Out) :-
+ Term =.. [_F|Args],
+ terms2wanted_dims(Args, Ns_In, Ns_Out).
+
+terms2wanted_dims([], Ns, Ns).
+terms2wanted_dims([Arg|Args], Ns_In, Ns_Out) :-
+ term2wanted_dims(Arg, Ns_In, Ns1),
+ terms2wanted_dims(Args, Ns1, Ns_Out).
+
+constraints2list(C, LC) :-
+ constraints2list(C, [], LC).
+
+constraints2list((A, B), Rest, LC) :-
+ !,
+ constraints2list(B, Rest, BRest),
+ constraints2list(A, BRest, LC).
+constraints2list(C, Rest, Rest1) :-
+ (check_constraint(C) ->
+ Rest1 = [C|Rest]
+ ;
+ Rest1 = [0 = 1]
+ ).
+
+% term2PPLterm(?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.
+term2PPLterm('$VAR'(In_N), In_N, Out_N) :-
+ !,
+ Out_N is In_N + 1.
+term2PPLterm(Term, In_N, Out_N) :-
+ Term =.. [_|Args],
+ terms2PPLterms(Args, In_N, Out_N).
+
+terms2PPLterms([], In_N, In_N).
+terms2PPLterms([Arg|Args], In_N, Out_N) :-
+ term2PPLterm(Arg, In_N, Tmp_N),
+ terms2PPLterms(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-2006 Roberto Bagnara <bagnara at cs.unipr.it>\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..0229065
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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: Unknown result due to 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_int16_a b/interfaces/Prolog/tests/expected_clpq2_int16_a
new file mode 100644
index 0000000..0d41bf6
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int16_a
@@ -0,0 +1,103 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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: Unknown result due to negative 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 ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int32 b/interfaces/Prolog/tests/expected_clpq2_int32
new file mode 100644
index 0000000..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..61d3188
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int32_a
@@ -0,0 +1,102 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int64_a
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..f16bdf1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8
@@ -0,0 +1,101 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 ?-
+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 ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_int8_a b/interfaces/Prolog/tests/expected_clpq2_int8_a
new file mode 100644
index 0000000..f16bdf1
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_int8_a
@@ -0,0 +1,101 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 ?-
+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 ?-
\ No newline at end of file
diff --git a/interfaces/Prolog/tests/expected_clpq2_mpz b/interfaces/Prolog/tests/expected_clpq2_mpz
new file mode 100644
index 0000000..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..d095df4
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq2_mpz_a
@@ -0,0 +1,109 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..3578056
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..3578056
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int16_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int32_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int64_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..3c3c0b3
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8
@@ -0,0 +1,29 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..3c3c0b3
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_int8_a
@@ -0,0 +1,29 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..31d77fe
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_clpq_mpz_a
@@ -0,0 +1,35 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+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..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int16_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int32 b/interfaces/Prolog/tests/expected_pchk_int32
new file mode 100644
index 0000000..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+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..2bf7000
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int32_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+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..2aed667
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int64_a
@@ -0,0 +1,3 @@
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+OK
diff --git a/interfaces/Prolog/tests/expected_pchk_int8 b/interfaces/Prolog/tests/expected_pchk_int8
new file mode 100644
index 0000000..b19de5d
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+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: Negative 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..f6b1402
--- /dev/null
+++ b/interfaces/Prolog/tests/expected_pchk_int8_a
@@ -0,0 +1,9 @@
+
+Error: an overflow has been detected by the PPL: Negative overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Positive overflow.
+
+Error: an overflow has been detected by the PPL: Negative 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/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..99ba081
--- /dev/null
+++ b/interfaces/Prolog/tests/pl_check.pl
@@ -0,0 +1,3314 @@
+/* Various tests on the Prolog interface.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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
+% 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
+% This alo executes all the test predicates with no output.
+
+check_quiet :-
+ make_quiet,
+ check_all.
+
+% check_noisy
+% This alo 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.
+
+check_extra_noisy :-
+ make_extra_noisy,
+ check_all.
+
+run_all([Group|Groups]):-
+ ppl_initialize,
+ (catch(run_one(Group), Exception,
+ run_exception(Group, Exception)) -> true ; run_fail(Group)),
+ !,
+ ppl_finalize,
+ run_all(Groups).
+
+run_all([]).
+
+run_all([_|_]) :-
+ error_message(['Prolog interface checks failed.']),
+ !,
+ ppl_finalize,
+ fail.
+
+run_fail(Group) :-
+ group_predicates(Group, Predicates),
+ error_message(['Error occurred while performing test', Group,
+ 'which checks predicates:', nl, Predicates]),
+ !,
+ ppl_finalize,
+ fail.
+
+run_exception(Group, ppl_overflow_error(Cause)) :-
+ !,
+ group_predicates(Group, Predicates),
+ display_message(
+ ['Overflow exception occurred while performing test ', Group,
+ 'which checks predicates ', nl, Predicates]),
+ print_exception_term(ppl_overflow_error(Cause)).
+
+run_exception(Group, Exception) :-
+ group_predicates(Group, Predicates),
+ display_message(
+ ['Exception occurred while performing test ', Group,
+ 'which checks predicates ', nl, Predicates]),
+ print_exception_term(Exception),
+ fail.
+
+% 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/miniumums
+% are printed.
+run_one(numeric_bounds) :-
+ max_dimension,
+ coefficient_bounds.
+
+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,
+ new_polyhedron_from_bounding_box.
+
+run_one(swap_polyhedra) :-
+ swap.
+
+run_one(polyhedron_dimension) :-
+ space,
+ affine_dim.
+
+run_one(basic_operators) :-
+ inters_assign,
+ inters_assign_min,
+ polyhull_assign,
+ polyhull_assign_min,
+ polydiff_assign,
+ time_elapse,
+ top_close_assign.
+
+run_one(add_to_system) :-
+ add_con,
+ add_con_min,
+ add_gen,
+ add_gen_min,
+ add_cons,
+ add_cons_min,
+ add_gens,
+ add_gens_min.
+
+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(polyhedron_boxes) :-
+ get_bounding_box.
+
+run_one(catch_time) :-
+ time_out.
+
+run_one(lp_problem) :-
+ lp_problem.
+
+% 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
+ ).
+
+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 configuartion, 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).
+
+%%%%%%%%%%%%%%%%% 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).
+
+% Tests ppl_new_C_Polyhedron_from_bounding_box/2 and
+% ppl_new_NNC_Polyhedron_from_bounding_box/2.
+new_polyhedron_from_bounding_box :-
+ new_polyhedron_from_bounding_box(c, [i(c(1/2), o(pinf)), i(o(minf), c(-1/2))]),
+ new_polyhedron_from_bounding_box(c, [empty]),
+ new_polyhedron_from_bounding_box(nnc,[i(o(0/2), o(pinf)), i(o(minf), o(1))]),
+ Max = -4,
+ new_polyhedron_from_bounding_box(c, [i(c(Max), c(1)), i(c(-1), c(1))]),
+ new_polyhedron_from_bounding_box(nnc, [i(c(Max), c(1)), i(c(-1), c(1))]).
+
+new_polyhedron_from_bounding_box(T, Box) :-
+ clean_ppl_new_Polyhedron_from_bounding_box(T, Box, P),
+ ppl_Polyhedron_get_bounding_box(P, any, Box1),
+ clean_ppl_new_Polyhedron_from_bounding_box(T, Box1, P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T, Box, 0),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(x, c(1/2)), i(c(0), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(x(minf), c(1/2)), i(c(0), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(o(minf), c(1/2)), i(c(0), c(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(c(minf), c(1/2)), i(c(0), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(o(minf), c(inf)), i(c(0), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(c(minf), c(1+2)), i(c(0), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(c(minf), c(n/2)), i(c(0), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(c(minf), c(2/d)), i(c(0), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(e), i(c(n), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [i(c(minf), c(2/1), c(1)), i(c(n), o(pinf))], _),
+ \+ clean_ppl_new_Polyhedron_from_bounding_box(T,
+ [x(c(minf), c(2/1)), i(c(n), o(pinf))], _),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+%%%%%%%%%%%%%%%%% 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).
+
+%%%%%%%%%%%%%%%% 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_intersection_assign_and_minimize/2.
+inters_assign_min :-
+ inters_assign_min(c), inters_assign_min(nnc).
+
+inters_assign_min(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)],
+ P2),
+ ppl_Polyhedron_intersection_assign_and_minimize(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_and_minimize(P1, P3),
+ !,
+ 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_hull_assign_and_minimize/2.
+polyhull_assign_min :-
+ polyhull_assign_min(c), polyhull_assign_min(nnc).
+
+polyhull_assign_min(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P2),
+ \+ ppl_Polyhedron_poly_hull_assign_and_minimize(P1, P2),
+ ppl_Polyhedron_add_generators(P1, [point(0), point(B),
+ point(A), point(A, 2)]),
+ ppl_Polyhedron_add_generators(P2, [point(0), point(A),
+ point(A + B), point(A, 2)]),
+ ppl_Polyhedron_poly_hull_assign_and_minimize(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_constraint_and_minimize/2.
+add_con_min :-
+ add_con_min(c), add_con_min(nnc).
+
+add_con_min(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraint_and_minimize(P, A - B >= 1),
+ clean_ppl_new_Polyhedron_from_constraints(T,
+ [A - B >= 1],
+ P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ \+ ppl_Polyhedron_add_constraint_and_minimize(P, A - B =< 0),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1).
+
+% 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_generator_and_minimize/2.
+add_gen_min :-
+ add_gen_min(c), add_gen_min(nnc).
+
+add_gen_min(T) :-
+ make_vars(2, [A, B]),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, empty, P),
+ ppl_Polyhedron_add_generator(P, point(A + B)),
+ ppl_Polyhedron_add_generator(P, point(0)),
+ ppl_Polyhedron_add_generator_and_minimize(P, point(2*A + 2*B, 1)),
+ ppl_Polyhedron_get_generators(P,[_G1,_G2]),
+ clean_ppl_new_Polyhedron_from_generators(T,
+ [point(2*A + 2*B), point(0)],
+ 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_constraints_and_minimize/2.
+add_cons_min :-
+ make_vars(2, [A, B]),
+ add_cons_min(c, [A >= 1, B >= 0], [A + B =< 0]),
+ add_cons_min(nnc, [A > 1, B >= 0], [A < 0]).
+
+add_cons_min(T, CS, CS1) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraints_and_minimize(P, CS),
+ clean_ppl_new_Polyhedron_from_constraints(T, CS, P1),
+ ppl_Polyhedron_equals_Polyhedron(P, P1),
+ \+ppl_Polyhedron_add_constraints_and_minimize(P, CS1),
+ !,
+ 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).
+
+% Tests ppl_Polyhedron_add_generators_and_minimize/2.
+add_gens_min :-
+ make_vars(3, [A, B, C]),
+ add_gens_min(c, [point(A + B + C), ray(A), ray(2*A), point(A + B + C)]),
+ add_gens_min(nnc, [point(A + B + C), ray(A), ray(2*A),
+ closure_point(A + B + C)]).
+
+add_gens_min(T, GS) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 3, empty, P),
+ \+ ppl_Polyhedron_add_generators_and_minimize(P, []),
+ ppl_Polyhedron_add_generators_and_minimize(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_Polyhedron_map_space_dimensions(P0, [A+C, C-A, B-B]), % A+C not map
+ \+ppl_Polyhedron_map_space_dimensions(P0, [A, C-A, B-B]), % A not map
+ \+ppl_Polyhedron_map_space_dimensions(P0, [D-A, C-A, B-B]), % D not dimension
+ \+ppl_Polyhedron_map_space_dimensions(P0, [B-A, C-A, B-B]), % not injective
+ \+ppl_Polyhedron_map_space_dimensions(P0, [B-A, C-A, B-C]), % not function
+ 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.
+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_add_generators(P1, [point(A + B + C)]),
+ ppl_Polyhedron_is_bounded(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_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_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).
+
+%%%%%%%%%%%%%%%%%%%%%%%%% Polyhedron Bounding Values %%%%%%%%%%%%%%%%%%%%%%%
+
+% Tests ppl_Polyhedron_get_bounding_box/3.
+
+get_bounding_box:-
+ make_vars(2, [A, B]),
+ get_bounding_box(c, [B >= 0, 4*A =< 2],
+ [i(o(minf), c(1/2)), i(c(0), o(pinf))]),
+ get_bounding_box(c, [], [i(o(minf), o(pinf)), i(o(minf), o(pinf))]),
+ get_bounding_box(c, [1=0], [empty, empty]),
+ get_bounding_box(c, [A =< 4, B =< 4, 3*A + B >= 2],
+ [i(c(-2/3), c(4)), i(c(-10), c(4))]),
+ get_bounding_box(nnc, [B > 0, 4*A =< 2],
+ [i(o(minf), c(1/2)), i(o(0), o(pinf))]),
+ get_bounding_box(nnc,[A > 1, B > 1, A < 1, B < 1], [empty, empty]),
+ get_bounding_box(nnc, [A =< 4, B =< 4, 3*A + B > 2],
+ [i(o(-2/3), c(4)), i(o(-10), c(4))]).
+
+get_bounding_box(T, CS, Box) :-
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 2, universe, P),
+ ppl_Polyhedron_add_constraints(P, CS),
+ \+ppl_Polyhedron_get_bounding_box(P, any, box),
+ ppl_Polyhedron_get_bounding_box(P, any, Box),
+ ppl_Polyhedron_get_bounding_box(P, polynomial, Box1),
+ ppl_Polyhedron_get_bounding_box(P, simplex, Box2),
+ clean_ppl_new_Polyhedron_from_bounding_box(T, Box, P1),
+ clean_ppl_new_Polyhedron_from_bounding_box(T, Box1, P2),
+ clean_ppl_new_Polyhedron_from_bounding_box(T, Box2, P3),
+ ppl_Polyhedron_contains_Polyhedron(P1, P),
+ ppl_Polyhedron_contains_Polyhedron(P2, P1),
+ ppl_Polyhedron_contains_Polyhedron(P3, P1),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(P2),
+ ppl_delete_Polyhedron(P3).
+
+% 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 :-
+ time_out(c), time_out(nnc).
+
+time_out(T) :-
+ make_vars(6, [A, B, C, D, E, F]),
+ CS = [8*A - 7*B + 4*D - E - 8*F >= -3,
+ 6*A + 8*B + 4*C - 6*D + 6*E + 6*F >= 5,
+ 6*A + 7*B - 6*C + 3*D + 3*E + 5*F >= 4,
+ 6*A + C + 8*D - 2*E - 3*F >= -6,
+ 4*A - 3*B + 3*D - 3*E + 4*F >= 0,
+ 3*A - 3*B - 7*C - 4*D - 7*E + 8*F >= 8,
+ -2*A + 5*B + C + 2*D - 2*E + 6*F >= -7,
+ -4*A + 7*B - 7*C + 2*D - 2*E - 7*F >= 1,
+ -5*A + 7*B + 5*C + 6*D - 5*E - 2*F >= -7,
+ -5*A + 6*B - 6*C - 2*D + 4*E - 2*F >= -5,
+ -5*A + 5*B + 8*C + D + E - 6*F >= -6],
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, Q),
+ ppl_set_timeout_exception_atom(pl_time_out),
+ \+ ppl_timeout_exception_atom(pl_x),
+ ppl_timeout_exception_atom(pl_time_out),
+ N1 = 1,
+ ppl_set_timeout(N1),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, P),
+ time_watch(T, ppl_Polyhedron_add_constraints_and_minimize(P, CS),
+ (ppl_Polyhedron_add_constraints_and_minimize(Q, CS)),
+ (true, (display_message(
+ ['while testing the time_out, polyhedron with topology',
+ T, 'timeout after', N1,ms])))),
+ ppl_Polyhedron_equals_Polyhedron(P, Q),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, Q1),
+ N2 = 10,
+ ppl_set_timeout(N2),
+ clean_ppl_new_Polyhedron_from_space_dimension(T, 6, universe, P1),
+ time_watch(T, ppl_Polyhedron_add_constraints_and_minimize(P1, CS),
+ (ppl_Polyhedron_add_constraints_and_minimize(Q1, CS)),
+ (true, display_message(
+ ['polyhedron with topology',T,'timeout after',N2,ms]))),
+ ppl_Polyhedron_equals_Polyhedron(P1, Q1),
+ ppl_set_timeout_exception_atom(time_out),
+ !,
+ ppl_delete_Polyhedron(P1),
+ ppl_delete_Polyhedron(Q1),
+ ppl_finalize.
+
+% time_watch(+Topology, +Goal, +No_Time_Out, +Time_Out)
+% time_watch/4 makes a copy of Goal with a copy of the polyhedron
+% and executes it with the currrent timeout exception settings.
+% If the call exceeds the time allowed, it catches the exception
+% and performs the Time_Out goal.
+% If the call does not exceed the time allowed,
+% then the timeout exception time is reset and
+% then Goal is executed and then the No_Time_Out is executed.
+
+time_watch(Topology, Goal, No_Time_Out, Time_Out) :-
+ !,
+ Goal =.. [PPLFunct, Poly|Args],
+ clean_ppl_new_Polyhedron_from_Polyhedron(Topology, Poly,
+ Topology, Polyhedron_Copy),
+ Goal_Copy =.. [PPLFunct, Polyhedron_Copy|Args],
+ ppl_timeout_exception_atom(Time_Out_Atom),
+ (catch(Goal_Copy, Time_Out_Atom, fail) ->
+ (ppl_reset_timeout,
+ ppl_Polyhedron_swap(Poly, Polyhedron_Copy),
+ call(No_Time_Out))
+ ;
+ call(Time_Out)
+ ),
+ !,
+ ppl_delete_Polyhedron(Polyhedron_Copy).
+
+%%%%%%%%%%%%%%%%% LP_Problem tests %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+lp_problem :-
+ lp_trivial,
+ lp_from_cons,
+ lp_from_lp,
+ lp_swap,
+ lp_get,
+ lp_clear,
+ lp_satisfiable,
+ lp_set,
+ lp_solve,
+ lp_eval.
+
+lp_trivial :-
+ clean_ppl_new_LP_Problem_trivial(LP),
+ ppl_LP_Problem_space_dimension(LP, 0),
+ ppl_LP_Problem_objective_function(LP, Obj),
+ compare_lin_expressions(Obj, 0),
+ ppl_LP_Problem_optimization_mode(LP, max),
+ ppl_LP_Problem_constraints(LP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_Polyhedron_is_universe(PH),
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_LP_Problem(LP).
+
+lp_from_cons :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
+ ppl_LP_Problem_space_dimension(LP, 3),
+ ppl_LP_Problem_constraints(LP, CS),
+ ppl_LP_Problem_objective_function(LP, Obj),
+ compare_lin_expressions(Obj, C),
+ ppl_LP_Problem_optimization_mode(LP, 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_LP_Problem(LP).
+
+lp_from_lp :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP1),
+ clean_ppl_new_LP_Problem_from_LP_Problem(LP1, LP),
+ ppl_LP_Problem_objective_function(LP, Obj),
+ compare_lin_expressions(Obj, C),
+ ppl_LP_Problem_optimization_mode(LP, max),
+ ppl_LP_Problem_constraints(LP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_LP_Problem_constraints(LP1, 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_LP_Problem(LP1),
+ ppl_delete_LP_Problem(LP).
+
+lp_swap :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem_trivial(LP),
+ clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP1),
+ ppl_LP_Problem_swap(LP, LP1),
+ ppl_LP_Problem_constraints(LP, CS),
+ ppl_LP_Problem_constraints(LP1, 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_LP_Problem(LP1),
+ ppl_delete_LP_Problem(LP).
+
+lp_get :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
+ ppl_LP_Problem_constraints(LP, 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_LP_Problem_objective_function(LP, Obj),
+ compare_lin_expressions(Obj, C),
+ ppl_LP_Problem_optimization_mode(LP, Opt),
+ Opt = max,
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_LP_Problem(LP).
+
+lp_clear :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, min, LP),
+ ppl_LP_Problem_clear(LP),
+ ppl_LP_Problem_space_dimension(LP, D),
+ D == 0,
+ ppl_LP_Problem_constraints(LP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_Polyhedron_is_universe(PH),
+ ppl_LP_Problem_objective_function(LP, Obj),
+ compare_lin_expressions(Obj, 0),
+ ppl_LP_Problem_optimization_mode(LP, Opt),
+ Opt == max,
+ !,
+ ppl_delete_Polyhedron(PH),
+ ppl_delete_LP_Problem(LP).
+
+lp_satisfiable :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem([A >= -1, B >= 5, C >= 0, C =< 3], C, max, LP),
+ ppl_LP_Problem_is_satisfiable(LP),
+ ppl_LP_Problem_add_constraint(LP, A + B =< 0),
+ \+ ppl_LP_Problem_is_satisfiable(LP),
+ !,
+ ppl_delete_LP_Problem(LP).
+
+lp_add :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem_trivial(LP),
+ ppl_LP_Problem_add_constraint(LP, A >= 0),
+ ppl_LP_Problem_add_constraints(LP, [A =< 3, A + B + C >= 9, B >= 5, C =< 5]),
+ clean_ppl_new_LP_Problem([A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5],
+ 2*B-C, max, LP1),
+ ppl_LP_Problem_solve(LP, Status),
+ ppl_LP_Problem_solve(LP1, Status),
+ ppl_LP_Problem_optimal_value(LP, N, D),
+ ppl_LP_Problem_optimal_value(LP1, N, D),
+ ppl_LP_Problem_constraints(LP, CS),
+ clean_ppl_new_Polyhedron_from_constraints(c, CS, PH),
+ ppl_LP_Problem_constraints(LP1, 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_LP_Problem(LP),
+ ppl_delete_LP_Problem(LP1).
+
+lp_set :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem(
+ [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, LP),
+ ppl_LP_Problem_objective_function(LP, 0),
+ ppl_LP_Problem_optimization_mode(LP, max),
+ ppl_LP_Problem_set_objective_function(LP, 2*B-C),
+ ppl_LP_Problem_set_optimization_mode(LP, min),
+ ppl_LP_Problem_objective_function(LP, Obj),
+ compare_lin_expressions(Obj, 2*B-C),
+ ppl_LP_Problem_optimization_mode(LP, min),
+ ppl_LP_Problem_solve(LP, optimized),
+ !,
+ ppl_delete_LP_Problem(LP).
+
+lp_solve :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem(
+ [A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5], 0, max, LP),
+ ppl_LP_Problem_objective_function(LP, 0),
+ ppl_LP_Problem_optimization_mode(LP, max),
+ ppl_LP_Problem_set_objective_function(LP, 2*B-C),
+ ppl_LP_Problem_set_optimization_mode(LP, min),
+ ppl_LP_Problem_solve(LP, optimized),
+ ppl_LP_Problem_set_objective_function(LP, C),
+ ppl_LP_Problem_solve(LP, unbounded),
+ ppl_LP_Problem_add_constraint(LP, B = 0),
+ ppl_LP_Problem_solve(LP, unfeasible),
+ \+ppl_LP_Problem_solve(LP, invalid_status),
+ !,
+ ppl_delete_LP_Problem(LP).
+
+lp_eval :-
+ make_vars(3, [A, B, C]),
+ clean_ppl_new_LP_Problem([A >= 0, A =< 3, A + B + C >= 9, B >= 5, C =< 5],
+ 2*B-C, min, LP),
+ \+ ppl_LP_Problem_optimizing_point(LP, closure_point(_X)),
+ ppl_LP_Problem_optimizing_point(LP, Point),
+ ppl_LP_Problem_feasible_point(LP, Point),
+ \+ ppl_LP_Problem_feasible_point(LP, 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_LP_Problem_optimal_value(LP, 2, 1),
+ ppl_LP_Problem_optimal_value(LP, N, D),
+ \+ ppl_LP_Problem_evaluate_objective_function(LP, Point, 2, 1),
+ ppl_LP_Problem_evaluate_objective_function(LP, Point, N1, D1),
+ N == N1,
+ D == D1,
+ ppl_LP_Problem_OK(LP),
+ !,
+ ppl_delete_LP_Problem(LP),
+ ppl_delete_Polyhedron(Expect_PH),
+ ppl_delete_Polyhedron(PH).
+
+% 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),
+ large_integers_prolog_cpp(Exps, Adds),
+ pl_check_prolog_flag(bounded, Y),
+ (Y == true ->
+ (out(sys_large_int, init),
+ large_integers_sys_prolog_cpp(Adds))
+ ;
+ true
+ ).
+
+large_integers_prolog_cpp([], _).
+large_integers_prolog_cpp([Exp|Exps], Adds) :-
+ pl_check_prolog_flag(bounded, F),
+ (F == true ->
+ pl_check_prolog_flag(max_integer, Max_int),
+ (Max_int >> 1 =< 1 << Exp + 3 ->
+ true
+ ;
+ large_integers_prolog_cpp1(Adds, Exp),
+ large_integers_prolog_cpp(Exps, Adds)
+ )
+ ;
+ large_integers_prolog_cpp1(Adds, Exp),
+ large_integers_prolog_cpp(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 :-
+ current_prolog_flag(bounded, Y),
+ make_vars(3, V),
+ exception_prolog(V),
+ (Y == true -> exception_sys_prolog(V) ; true),
+ exception_cplusplus(V),
+ !.
+
+%% 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(13, 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
+exception_prolog(1, _) :-
+ pl_check_prolog_flag(bounded, Y),
+ (Y == true ->
+ true
+ ;
+ (I = 21474836470,
+ must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(I))], _))
+ )
+ ).
+
+%% TEST: not_unsigned_integer
+exception_prolog(2, _) :-
+ must_catch(ppl_new_C_Polyhedron_from_space_dimension(n, universe, _)),
+ must_catch(ppl_new_C_Polyhedron_from_space_dimension(-1, universe, _)),
+ must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(n))], _)),
+ must_catch(ppl_new_C_Polyhedron_from_generators([point('$VAR'(-1))], _)).
+
+%% TEST: not_unsigned_integer
+exception_prolog(3, _) :-
+ must_catch(ppl_set_timeout(-1)).
+
+
+%% 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, _X)),
+ must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _X)),
+ must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _X)),
+ must_catch(ppl_Polyhedron_H79_widening_assign_with_tokens(
+ Q, P, -1, _X)),
+ must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _X)),
+ must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+ Q, P, [], -1, _X)),
+ !,
+ 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)], _)),
+ must_catch(ppl_new_C_Polyhedron_from_generators(
+ [point(C), ray(B + C, 1)], _)),
+ must_catch(ppl_new_C_Polyhedron_from_generators(
+ [point], _)),
+ must_catch(ppl_new_C_Polyhedron_from_generators(
+ [point(_D)], _)),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [_E >= 3], _)),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [A*B = 0], _)),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [A], _)).
+
+%% 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_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_delete_Polyhedron(P).
+
+%% TEST: not_a_polyhedron_handle
+exception_prolog(8, _) :-
+ must_catch(ppl_Polyhedron_space_dimension(_, _N)).
+
+%% TEST: not_a_complexity_class
+exception_prolog(9, [A, _, _]) :-
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(A)], P),
+ must_catch(ppl_Polyhedron_get_bounding_box(P, a, _Box)).
+
+%% TEST: not_universe_or_empty
+exception_prolog(10, _) :-
+ must_catch(ppl_new_C_Polyhedron_from_space_dimension(3, xxx, _)).
+
+%% 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)),
+ must_catch(
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x, A + 1)),
+ must_catch(
+ ppl_Polyhedron_generalized_affine_image_lhs_rhs(P, B - 1, x + y, A + 1)).
+
+%% 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], _)),
+ must_catch(ppl_new_C_Polyhedron_from_constraints(
+ [A = 0, B >= C | not_a_list], _)),
+ must_catch(ppl_new_C_Polyhedron_from_bounding_box(0, 0)),
+ must_catch(ppl_new_NNC_Polyhedron_from_bounding_box(
+ [i(c(minf), c(2/1)), i(c(n), o(pinf)) | d], _)),
+ must_catch(ppl_new_C_Polyhedron_from_bounding_box(
+ [i(c(minf), c(2/1)), i(c(n), o(pinf)) | _], _)),
+ clean_ppl_new_Polyhedron_from_space_dimension(nnc, 3, universe, P),
+ must_catch(ppl_Polyhedron_add_constraints(P, _)),
+ must_catch(ppl_Polyhedron_add_constraints(P, not_a_list)),
+ must_catch(ppl_Polyhedron_add_constraints_and_minimize(P, not_a_list)),
+ must_catch(ppl_Polyhedron_add_generators(P, not_a_list)),
+ must_catch(ppl_Polyhedron_add_generators(P, _)),
+ must_catch(ppl_Polyhedron_add_generators_and_minimize(P, _)),
+ clean_ppl_new_Polyhedron_from_space_dimension(c, 3, empty, Q),
+ must_catch(ppl_Polyhedron_map_space_dimensions(Q, not_a_list)),
+ must_catch(ppl_Polyhedron_fold_space_dimensions(Q, not_a_list, B)),
+ must_catch(ppl_Polyhedron_remove_space_dimensions(Q, not_a_list)),
+ must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign(
+ Q, P, not_a_list)),
+ must_catch(ppl_Polyhedron_limited_H79_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _)),
+ must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign(
+ Q, P, not_a_list)),
+ must_catch(ppl_Polyhedron_bounded_H79_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _)),
+ must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign(
+ Q, P, not_a_list)),
+ must_catch(ppl_Polyhedron_limited_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _)),
+ must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign(
+ Q, P, not_a_list)),
+ must_catch(ppl_Polyhedron_bounded_BHRZ03_extrapolation_assign_with_tokens(
+ Q, P, not_a_list, 1, _)),
+ !,
+ ppl_delete_Polyhedron(P),
+ ppl_delete_Polyhedron(Q).
+
+%% TEST: not_an_lp_problem_handle
+exception_prolog(13, _) :-
+ must_catch(ppl_LP_Problem_space_dimension(_, _N)),
+ must_catch(ppl_LP_Problem_constraints(p, [])).
+
+% 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_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_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_delete_Polyhedron(P)
+ ),
+ ppl_overflow_error(Cause),
+ check_exception_term(ppl_overflow_error(Cause))
+ ).
+
+exception_sys_prolog(4, [A,B,_]) :-
+ pl_check_prolog_flag(min_integer, Min_Int),
+ catch((
+ clean_ppl_new_Polyhedron_from_generators(c,
+ [point(Min_Int * A + B)], P),
+ ppl_Polyhedron_affine_image(P, A, A - 1, 1),
+ must_catch(ppl_Polyhedron_get_generators(P, _GS)),
+ !,
+ 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)], _)).
+
+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)),
+ !,
+ 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_and_minimize(P1, P2)),
+ !,
+ 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)], _)).
+
+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])),
+ !,
+ 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)),
+ !,
+ 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)),
+ !,
+ 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)),
+ !,
+ 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)),
+ !,
+ 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)),
+ !,
+ ppl_delete_Polyhedron(P).
+
+% must_catch(+Call) calls Call using catch and checks exception.
+% If exception it succeeds and fails if there is no exception caught.
+
+must_catch(Call) :-
+ ( catch(Call, M0, check_exception(M0) ) -> fail ; true).
+
+% check_exception(+Exception) checks and prints the exception message;
+% and then fails.
+
+check_exception(Exception):-
+ format_exception_message(Exception), 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_LP_Problem(_).
+cleanup_ppl_LP_Problem(LP) :-
+ out(lp, LP),
+ ppl_delete_LP_Problem(LP), 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(lp, LP):-
+ ((noisy(N), N < 2) -> true ;
+ ppl_LP_Problem_constraints(LP, CS),
+ ppl_LP_Problem_objective_function(LP, Obj),
+ ppl_LP_Problem_optimization_mode(LP, Opt),
+ nl,
+ write(' constraint system is: '), write(CS), nl,
+ write(' objective function is: '), write(Obj), nl,
+ write(' optimization mode is: '), write(Opt),
+ 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_bounding_box(T, Box, P) :-
+ (T = c ->
+ ppl_new_C_Polyhedron_from_bounding_box(Box, P)
+ ;
+ ppl_new_NNC_Polyhedron_from_bounding_box(Box, P)
+ ),
+ cleanup_ppl_Polyhedron(P).
+
+clean_ppl_new_LP_Problem_trivial(LP) :-
+ ppl_new_LP_Problem_trivial(LP),
+ cleanup_ppl_LP_Problem(LP).
+
+clean_ppl_new_LP_Problem(CS, Obj, Opt, LP) :-
+ ppl_new_LP_Problem(CS, Obj, Opt, LP),
+ cleanup_ppl_LP_Problem(LP).
+
+clean_ppl_new_LP_Problem_from_LP_Problem(LP1, LP) :-
+ ppl_new_LP_Problem_from_LP_Problem(LP1, LP),
+ cleanup_ppl_LP_Problem(LP).
+
+%%%%%%%%%%%% 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_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(Error) :-
+ display_message([Error]).
+
+%%%%%%%%%%%% predicates for output messages %%%%%%%%%%%%%%%%%%
+
+error_message(Message):-
+ write_all(Message),
+ fail.
+
+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,
+ lp_problem,
+ transform_polyhedron,
+ polyhedron_boxes,
+ 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
+ ]).
+
+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_Polyhedrom/3,
+ ppl_new_C_Polyhedron_from_NNC_Polyhedrom/3,
+ ppl_new_NNC_Polyhedron_from_C_Polyhedrom/3,
+ ppl_new_NNC_Polyhedron_from_NNC_Polyhedrom/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_genenerators/2,
+ ppl_new_NNC_Polyhedron_from_genenerators/2,
+ ppl_new_C_Polyhedron_from_bounding_box/2,
+ ppl_new_NNC_Polyhedron_from_bounding_box/2
+ ]).
+
+group_predicates(swap_polyhedra,
+ [ppl_Polyhedron_swap/2
+ ]).
+
+group_predicates(polyhedron_dimension,
+ [ppl_Polyhedron_affine_dimension/2,
+ ppl_Polyhedron_space_dimension/2]).
+
+group_predicates(basic_operators,
+ [ppl_Polyhedron_intersection_assign/2,
+ ppl_Polyhedron_intersection_assign_and_minimize/2,
+ ppl_Polyhedron_poly_hull_assign/2,
+ ppl_Polyhedron_poly_hull_assign_and_minimize/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_constraint_and_minimize/2,
+ ppl_Polyhedron_add_generator/2,
+ ppl_Polyhedron_add_generator_and_minimize/2,
+ ppl_Polyhedron_add_constraints/2,
+ ppl_Polyhedron_add_constraints_and_minimize/2,
+ ppl_Polyhedron_add_generators/2,
+ ppl_Polyhedron_add_generators_and_minimize/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_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
+ ]).
+
+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(polyhedron_boxes,
+ [ppl_Polyhedron_get_bounding_box/3]).
+
+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(lp_problem,
+ ['all LP_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) :-
+ \+ prolog_system('XSB'),
+ current_prolog_flag(bounded, TF).
+
+pl_check_prolog_flag(bounded, true) :-
+ prolog_system('XSB').
+
+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/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..bdfd2ff
--- /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/Prolog/track_allocation.hh b/interfaces/Prolog/track_allocation.hh
new file mode 100644
index 0000000..08604fe
--- /dev/null
+++ b/interfaces/Prolog/track_allocation.hh
@@ -0,0 +1,116 @@
+/* Code for keeping track of polyhedra allocations and deallocations.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_track_allocation_hh
+#define PPL_track_allocation_hh
+
+#ifndef PROLOG_TRACK_ALLOCATION
+#define PROLOG_TRACK_ALLOCATION 0
+#endif
+
+#if PROLOG_TRACK_ALLOCATION
+
+#include <set>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+class Poly_Tracker {
+public:
+ void insert(const void* pp);
+ void check(const void* pp) const;
+ void remove(const void* pp);
+
+ Poly_Tracker();
+ ~Poly_Tracker();
+
+private:
+ typedef std::set<const void*, std::less<const void*> > Set;
+ Set s;
+};
+
+inline
+Poly_Tracker::Poly_Tracker() {
+}
+
+inline
+Poly_Tracker::~Poly_Tracker() {
+ Set::size_type n = s.size();
+ if (n > 0)
+ std::cerr << "Poly_Tracker: " << n << " polyhedra leaked!" << std::endl;
+}
+
+inline void
+Poly_Tracker::insert(const void* pp) {
+ std::pair<Set::iterator, bool> stat = s.insert(pp);
+ if (!stat.second) {
+ std::cerr << "Poly_Tracker: two polyhedra at the same address "
+ << "at the same time?!" << std::endl;
+ abort();
+ }
+}
+
+inline void
+Poly_Tracker::check(const void* pp) const {
+ if (s.find(pp) == s.end()) {
+ std::cerr << "Poly_Tracker: attempt to access an inexistent polyhedron."
+ << std::endl;
+ abort();
+ }
+}
+
+void
+Poly_Tracker::remove(const void* pp) {
+ if (s.erase(pp) != 1) {
+ std::cerr << "Poly_Tracker: attempt to deallocate "
+ << "an inexistent polyhedron."
+ << std::endl;
+ abort();
+ }
+}
+
+namespace {
+
+inline Poly_Tracker&
+poly_tracker() {
+ static Poly_Tracker pt;
+ return pt;
+}
+
+} // namespace
+
+} // namespace Parma_Polyhedra_Library
+
+
+#define REGISTER(x) Parma_Polyhedra_Library::poly_tracker().insert(x)
+#define UNREGISTER(x) Parma_Polyhedra_Library::poly_tracker().remove(x)
+#define CHECK(x) Parma_Polyhedra_Library::poly_tracker().check(x)
+
+#else
+
+#define REGISTER(x)
+#define UNREGISTER(x)
+#define CHECK(x)
+
+#endif
+
+#endif // !defined(PPL_track_allocation_hh)
diff --git a/ltmain.sh b/ltmain.sh
new file mode 100644
index 0000000..06823e0
--- /dev/null
+++ b/ltmain.sh
@@ -0,0 +1,6863 @@
+# ltmain.sh - Provide generalized library-building support services.
+# NOTE: Changing this file will not affect anything until you rerun configure.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 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 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# 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.
+
+basename="s,^.*/,,g"
+
+# 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"
+
+# The name of this program:
+progname=`echo "$progpath" | $SED $basename`
+modename="$progname"
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+
+PROGRAM=ltmain.sh
+PACKAGE=libtool
+VERSION=1.5.22
+TIMESTAMP=" (1.1220.2.365 2005/12/18 22:14:06)"
+
+# 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
+
+# Check that we have a working $echo.
+if test "X$1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X$1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell, and then maybe $echo will work.
+ exec $SHELL "$progpath" --no-reexec ${1+"$@"}
+fi
+
+if test "X$1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+$*
+EOF
+ exit $EXIT_SUCCESS
+fi
+
+default_mode=
+help="Try \`$progname --help' for more information."
+magic="%%%MAGIC variable%%%"
+mkdir="mkdir"
+mv="mv -f"
+rm="rm -f"
+
+# 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'
+# 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
+ SP2NL='tr \040 \012'
+ NL2SP='tr \015\012 \040\040'
+ ;;
+ *) # EBCDIC based system
+ SP2NL='tr \100 \n'
+ NL2SP='tr \r\n \100\100'
+ ;;
+esac
+
+# NLS nuisances.
+# Only set LANG and LC_ALL to C if already set.
+# These must not be set unconditionally because not all systems understand
+# e.g. LANG=C (notably SCO).
+# We save the old values to restore during execute mode.
+if test "${LC_ALL+set}" = set; then
+ save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
+fi
+if test "${LANG+set}" = set; then
+ save_LANG="$LANG"; LANG=C; export LANG
+fi
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" $lt_nl"
+
+if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+ $echo "$modename: not configured to build any kind of library" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+fi
+
+# Global variables.
+mode=$default_mode
+nonopt=
+prev=
+prevopt=
+run=
+show="$echo"
+show_help=
+execute_dlfiles=
+duplicate_deps=no
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+
+#####################################
+# Shell function definitions:
+# This seems to be the best place for them
+
+# 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 "$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" || {
+ $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2
+ exit $EXIT_FAILURE
+ }
+ fi
+
+ $echo "X$my_tmpdir" | $Xsed
+}
+
+
+# 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.
+func_win32_libid ()
+{
+ 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
+ if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \
+ $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then
+ win32_nmres=`eval $NM -f posix -A $1 | \
+ $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_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 ()
+{
+ if test -n "$available_tags" && test -z "$tagname"; then
+ CC_quoted=
+ for arg in $CC; do
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;;
+ # 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.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ CC_quoted="$CC_quoted $arg"
+ done
+ case "$@ " in
+ " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*)
+ # 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
+ $echo "$modename: unable to infer tagged configuration"
+ $echo "$modename: specify a tag with \`--tag'" 1>&2
+ exit $EXIT_FAILURE
+# else
+# $echo "$modename: using $tagname tagged configuration"
+ fi
+ ;;
+ esac
+ fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+ f_ex_an_ar_dir="$1"; shift
+ f_ex_an_ar_oldlib="$1"
+
+ $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)"
+ $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $?
+ if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2
+ exit $EXIT_FAILURE
+ fi
+}
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+ my_gentop="$1"; shift
+ my_oldlibs=${1+"$@"}
+ my_oldobjs=""
+ my_xlib=""
+ my_xabs=""
+ my_xdir=""
+ my_status=""
+
+ $show "${rm}r $my_gentop"
+ $run ${rm}r "$my_gentop"
+ $show "$mkdir $my_gentop"
+ $run $mkdir "$my_gentop"
+ my_status=$?
+ if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then
+ exit $my_status
+ fi
+
+ 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
+ my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'`
+ my_xdir="$my_gentop/$my_xlib"
+
+ $show "${rm}r $my_xdir"
+ $run ${rm}r "$my_xdir"
+ $show "$mkdir $my_xdir"
+ $run $mkdir "$my_xdir"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then
+ exit $exit_status
+ fi
+ case $host in
+ *-darwin*)
+ $show "Extracting $my_xabs"
+ # Do not bother doing anything if just a dry run
+ if test -z "$run"; then
+ darwin_orig_dir=`pwd`
+ cd $my_xdir || exit $?
+ darwin_archive=$my_xabs
+ darwin_curdir=`pwd`
+ darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'`
+ darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null`
+ if test -n "$darwin_arches"; then
+ darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'`
+ darwin_arch=
+ $show "$darwin_base_archive has multiple architectures $darwin_arches"
+ for darwin_arch in $darwin_arches ; do
+ 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 have a bunch of thin objects, gotta fatten them up :)
+ darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP`
+ darwin_file=
+ darwin_files=
+ for darwin_file in $darwin_filelist; do
+ darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`
+ lipo -create -output "$darwin_file" $darwin_files
+ done # $darwin_filelist
+ ${rm}r unfat-$$
+ cd "$darwin_orig_dir"
+ else
+ cd "$darwin_orig_dir"
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ fi # $darwin_arches
+ fi # $run
+ ;;
+ *)
+ func_extract_an_archive "$my_xdir" "$my_xabs"
+ ;;
+ esac
+ my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP`
+ done
+ func_extract_archives_result="$my_oldobjs"
+}
+# End of Shell function definitions
+#####################################
+
+# Darwin sucks
+eval std_shrext=\"$shrext_cmds\"
+
+disable_libs=no
+
+# Parse our command line options once, thoroughly.
+while test "$#" -gt 0
+do
+ arg="$1"
+ shift
+
+ case $arg in
+ -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
+ esac
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ execute_dlfiles)
+ execute_dlfiles="$execute_dlfiles $arg"
+ ;;
+ tag)
+ tagname="$arg"
+ preserve_args="${preserve_args}=$arg"
+
+ # Check whether tagname contains only valid characters
+ case $tagname in
+ *[!-_A-Za-z0-9,/]*)
+ $echo "$progname: invalid tag name: $tagname" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ case $tagname in
+ CC)
+ # Don't test for the "default" C tag, as we know, it's there, but
+ # not specially marked.
+ ;;
+ *)
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then
+ taglist="$taglist $tagname"
+ # Evaluate the configuration.
+ eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`"
+ else
+ $echo "$progname: ignoring unknown tag $tagname" 1>&2
+ fi
+ ;;
+ esac
+ ;;
+ *)
+ eval "$prev=\$arg"
+ ;;
+ esac
+
+ prev=
+ prevopt=
+ continue
+ fi
+
+ # Have we seen a non-optional argument yet?
+ case $arg in
+ --help)
+ show_help=yes
+ ;;
+
+ --version)
+ $echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP"
+ $echo
+ $echo "Copyright (C) 2005 Free Software Foundation, Inc."
+ $echo "This is free software; see the source for copying conditions. There is NO"
+ $echo "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+ exit $?
+ ;;
+
+ --config)
+ ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath
+ # Now print the configurations for the tags.
+ for tagname in $taglist; do
+ ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath"
+ done
+ exit $?
+ ;;
+
+ --debug)
+ $echo "$progname: enabling shell trace mode"
+ set -x
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --dry-run | -n)
+ run=:
+ ;;
+
+ --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 $?
+ ;;
+
+ --finish) mode="finish" ;;
+
+ --mode) prevopt="--mode" prev=mode ;;
+ --mode=*) mode="$optarg" ;;
+
+ --preserve-dup-deps) duplicate_deps="yes" ;;
+
+ --quiet | --silent)
+ show=:
+ preserve_args="$preserve_args $arg"
+ ;;
+
+ --tag)
+ prevopt="--tag"
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+ --tag=*)
+ set tag "$optarg" ${1+"$@"}
+ shift
+ prev=tag
+ preserve_args="$preserve_args --tag"
+ ;;
+
+ -dlopen)
+ prevopt="-dlopen"
+ prev=execute_dlfiles
+ ;;
+
+ -*)
+ $echo "$modename: unrecognized option \`$arg'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+
+ *)
+ nonopt="$arg"
+ break
+ ;;
+ esac
+done
+
+if test -n "$prevopt"; then
+ $echo "$modename: option \`$prevopt' requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+fi
+
+case $disable_libs in
+no)
+ ;;
+shared)
+ build_libtool_libs=no
+ build_old_libs=yes
+ ;;
+static)
+ build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+ ;;
+esac
+
+# 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=
+
+if test -z "$show_help"; then
+
+ # Infer the operation mode.
+ if test -z "$mode"; then
+ $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2
+ $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2
+ case $nonopt in
+ *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*)
+ mode=link
+ for arg
+ do
+ case $arg in
+ -c)
+ mode=compile
+ break
+ ;;
+ esac
+ done
+ ;;
+ *db | *dbx | *strace | *truss)
+ mode=execute
+ ;;
+ *install*|cp|mv)
+ mode=install
+ ;;
+ *rm)
+ mode=uninstall
+ ;;
+ *)
+ # If we have no mode, but dlfiles were specified, then do execute mode.
+ test -n "$execute_dlfiles" && mode=execute
+
+ # Just use the default operation mode.
+ if test -z "$mode"; then
+ if test -n "$nonopt"; then
+ $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2
+ else
+ $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2
+ fi
+ fi
+ ;;
+ esac
+ fi
+
+ # Only execute mode is allowed to have -dlopen flags.
+ if test -n "$execute_dlfiles" && test "$mode" != execute; then
+ $echo "$modename: unrecognized option \`-dlopen'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Change the help message to a mode-specific one.
+ generic_help="$help"
+ help="Try \`$modename --help --mode=$mode' for more information."
+
+ # These modes are in order of execution frequency so that they run quickly.
+ case $mode in
+ # libtool compile mode
+ compile)
+ modename="$modename: compile"
+ # 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=
+
+ 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)
+ if test -n "$libobj" ; then
+ $echo "$modename: you cannot specify \`-o' more than once" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ arg_mode=target
+ continue
+ ;;
+
+ -static | -prefer-pic | -prefer-non-pic)
+ later="$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,*)
+ args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
+ lastarg=
+ save_ifs="$IFS"; IFS=','
+ for arg in $args; do
+ IFS="$save_ifs"
+
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, so we specify it separately.
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ lastarg="$lastarg $arg"
+ done
+ IFS="$save_ifs"
+ lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"`
+
+ # Add the arguments to base_compile.
+ base_compile="$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.
+ lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"`
+
+ case $lastarg in
+ # Double-quote args containing other shell metacharacters.
+ # Many Bourne shells cannot handle close brackets correctly
+ # in scan sets, and some SunOS ksh mistreat backslash-escaping
+ # in scan sets (worked around with variable expansion),
+ # and furthermore cannot handle '|' '&' '(' ')' in scan sets
+ # at all, so we specify them separately.
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ lastarg="\"$lastarg\""
+ ;;
+ esac
+
+ base_compile="$base_compile $lastarg"
+ done # for arg
+
+ case $arg_mode in
+ arg)
+ $echo "$modename: you must specify an argument for -Xcompile"
+ exit $EXIT_FAILURE
+ ;;
+ target)
+ $echo "$modename: you must specify a target with \`-o'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *)
+ # Get the name of the library object.
+ [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'`
+ ;;
+ esac
+
+ # Recognize several different file suffixes.
+ # If the user specifies -o file.o, it is replaced with file.lo
+ xform='[cCFSifmso]'
+ case $libobj in
+ *.ada) xform=ada ;;
+ *.adb) xform=adb ;;
+ *.ads) xform=ads ;;
+ *.asm) xform=asm ;;
+ *.c++) xform=c++ ;;
+ *.cc) xform=cc ;;
+ *.ii) xform=ii ;;
+ *.class) xform=class ;;
+ *.cpp) xform=cpp ;;
+ *.cxx) xform=cxx ;;
+ *.f90) xform=f90 ;;
+ *.for) xform=for ;;
+ *.java) xform=java ;;
+ esac
+
+ libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"`
+
+ case $libobj in
+ *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;;
+ *)
+ $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ func_infer_tag $base_compile
+
+ for arg in $later; do
+ case $arg in
+ -static)
+ build_old_libs=yes
+ continue
+ ;;
+
+ -prefer-pic)
+ pic_mode=yes
+ continue
+ ;;
+
+ -prefer-non-pic)
+ pic_mode=no
+ continue
+ ;;
+ esac
+ done
+
+ qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"`
+ case $qlibobj in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qlibobj="\"$qlibobj\"" ;;
+ esac
+ test "X$libobj" != "X$qlibobj" \
+ && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \
+ && $echo "$modename: libobj name \`$libobj' may not contain shell special characters."
+ objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$obj"; then
+ xdir=
+ else
+ xdir=$xdir/
+ fi
+ lobj=${xdir}$objdir/$objname
+
+ if test -z "$base_compile"; then
+ $echo "$modename: you must specify a compilation command" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # 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
+
+ $run $rm $removelist
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+
+ # On Cygwin there's no "real" PIC flag so we must build both object types
+ case $host_os in
+ cygwin* | mingw* | pw32* | os2*)
+ 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 "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext}
+ lockfile="$output_obj.lock"
+ removelist="$removelist $output_obj $lockfile"
+ trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15
+ 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 $run ln "$progpath" "$lockfile" 2>/dev/null; do
+ $show "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."
+
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+ $echo "$srcfile" > "$lockfile"
+ fi
+
+ if test -n "$fix_srcfile_path"; then
+ eval srcfile=\"$fix_srcfile_path\"
+ fi
+ qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"`
+ case $qsrcfile in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qsrcfile="\"$qsrcfile\"" ;;
+ esac
+
+ $run $rm "$libobj" "${libobj}T"
+
+ # Create a libtool object file (analogous to a ".la" file),
+ # but don't create it if we're doing a dry run.
+ test -z "$run" && cat > ${libobj}T <<EOF
+# $libobj - a libtool object file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+EOF
+
+ # 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
+
+ if test ! -d "${xdir}$objdir"; then
+ $show "$mkdir ${xdir}$objdir"
+ $run $mkdir ${xdir}$objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "${xdir}$objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ if test -z "$output_obj"; then
+ # Place PIC objects in $objdir
+ command="$command -o $lobj"
+ fi
+
+ $run $rm "$lobj" "$output_obj"
+
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ test -n "$output_obj" && $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ 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."
+
+ $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
+ $show "$mv $output_obj $lobj"
+ if $run $mv $output_obj $lobj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the PIC object to the libtool object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object='$objdir/$objname'
+
+EOF
+
+ # Allow error messages only from the first compilation.
+ if test "$suppress_opt" = yes; then
+ suppress_output=' >/dev/null 2>&1'
+ fi
+ else
+ # No PIC object so indicate it doesn't exist in the libtool
+ # object file.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+pic_object=none
+
+EOF
+ 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"
+ else
+ command="$base_compile $qsrcfile $pic_flag"
+ fi
+ if test "$compiler_c_o" = yes; then
+ command="$command -o $obj"
+ fi
+
+ # Suppress compiler output if we already did a PIC compilation.
+ command="$command$suppress_output"
+ $run $rm "$obj" "$output_obj"
+ $show "$command"
+ if $run eval "$command"; then :
+ else
+ $run $rm $removelist
+ exit $EXIT_FAILURE
+ fi
+
+ 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."
+
+ $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
+ $show "$mv $output_obj $obj"
+ if $run $mv $output_obj $obj; then :
+ else
+ error=$?
+ $run $rm $removelist
+ exit $error
+ fi
+ fi
+
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object='$objname'
+
+EOF
+ else
+ # Append the name of the non-PIC object the libtool object file.
+ # Only append if the libtool object file exists.
+ test -z "$run" && cat >> ${libobj}T <<EOF
+# Name of the non-PIC object.
+non_pic_object=none
+
+EOF
+ fi
+
+ $run $mv "${libobj}T" "${libobj}"
+
+ # Unlock the critical section if it was locked
+ if test "$need_locks" != no; then
+ $run $rm "$lockfile"
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool link mode
+ link | relink)
+ modename="$modename: link"
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # 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=
+
+ avoid_version=no
+ dlfiles=
+ dlprefiles=
+ dlself=no
+ export_dynamic=no
+ export_symbols=
+ export_symbols_regex=
+ generated=
+ libobjs=
+ ltlibs=
+ module=no
+ no_install=no
+ objs=
+ non_pic_objects=
+ notinst_path= # paths that contain not-installed libtool libraries
+ 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
+
+ func_infer_tag $base_compile
+
+ # We need to know -static, to get the right output filenames.
+ for arg
+ do
+ case $arg in
+ -all-static | -static)
+ if test "X$arg" = "X-all-static"; then
+ if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+ $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2
+ fi
+ if test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=yes
+ else
+ if test -z "$pic_flag" && test -n "$link_static_flag"; then
+ dlopen_self=$dlopen_self_static
+ fi
+ prefer_static_libs=built
+ fi
+ 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
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test
+ ;;
+ *) qarg=$arg ;;
+ esac
+ libtool_args="$libtool_args $qarg"
+
+ # If the previous option needs an argument, assign it.
+ if test -n "$prev"; then
+ case $prev in
+ output)
+ compile_command="$compile_command @OUTPUT@"
+ finalize_command="$finalize_command @OUTPUT@"
+ ;;
+ esac
+
+ case $prev in
+ dlfiles|dlprefiles)
+ if test "$preload" = no; then
+ # Add the symbol object into the linking commands.
+ compile_command="$compile_command @SYMFILE@"
+ finalize_command="$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
+ dlfiles="$dlfiles $arg"
+ else
+ dlprefiles="$dlprefiles $arg"
+ fi
+ prev=
+ continue
+ ;;
+ esac
+ ;;
+ expsyms)
+ export_symbols="$arg"
+ if test ! -f "$arg"; then
+ $echo "$modename: symbol file \`$arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ prev=
+ continue
+ ;;
+ expsyms_regex)
+ export_symbols_regex="$arg"
+ prev=
+ continue
+ ;;
+ inst_prefix)
+ inst_prefix_dir="$arg"
+ prev=
+ continue
+ ;;
+ precious_regex)
+ precious_files_regex="$arg"
+ prev=
+ continue
+ ;;
+ release)
+ release="-$arg"
+ prev=
+ continue
+ ;;
+ objectlist)
+ if test -f "$arg"; then
+ save_arg=$arg
+ moreargs=
+ for fil in `cat $save_arg`
+ do
+# moreargs="$moreargs $fil"
+ arg=$fil
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ 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
+ dlfiles="$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.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$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
+ non_pic_objects="$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"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ done
+ else
+ $echo "$modename: link input file \`$save_arg' does not exist"
+ exit $EXIT_FAILURE
+ fi
+ arg=$save_arg
+ prev=
+ continue
+ ;;
+ rpath | xrpath)
+ # We need an absolute path.
+ case $arg in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ if test "$prev" = rpath; then
+ case "$rpath " in
+ *" $arg "*) ;;
+ *) rpath="$rpath $arg" ;;
+ esac
+ else
+ case "$xrpath " in
+ *" $arg "*) ;;
+ *) xrpath="$xrpath $arg" ;;
+ esac
+ fi
+ prev=
+ continue
+ ;;
+ xcompiler)
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ xlinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $wl$qarg"
+ prev=
+ compile_command="$compile_command $wl$qarg"
+ finalize_command="$finalize_command $wl$qarg"
+ continue
+ ;;
+ xcclinker)
+ linker_flags="$linker_flags $qarg"
+ compiler_flags="$compiler_flags $qarg"
+ prev=
+ compile_command="$compile_command $qarg"
+ finalize_command="$finalize_command $qarg"
+ continue
+ ;;
+ shrext)
+ shrext_cmds="$arg"
+ prev=
+ continue
+ ;;
+ darwin_framework|darwin_framework_skip)
+ test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ prev=
+ 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
+ compile_command="$compile_command $link_static_flag"
+ finalize_command="$finalize_command $link_static_flag"
+ fi
+ continue
+ ;;
+
+ -allow-undefined)
+ # FIXME: remove this flag sometime in the future.
+ $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2
+ continue
+ ;;
+
+ -avoid-version)
+ avoid_version=yes
+ 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
+ $echo "$modename: more than one -exported-symbols argument is not allowed"
+ exit $EXIT_FAILURE
+ fi
+ if test "X$arg" = "X-export-symbols"; then
+ prev=expsyms
+ else
+ prev=expsyms_regex
+ fi
+ continue
+ ;;
+
+ -framework|-arch|-isysroot)
+ case " $CC " in
+ *" ${arg} ${1} "* | *" ${arg} ${1} "*)
+ prev=darwin_framework_skip ;;
+ *) compiler_flags="$compiler_flags $arg"
+ prev=darwin_framework ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ 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*)
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ ;;
+ esac
+ continue
+ ;;
+
+ -L*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-L//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ notinst_path="$notinst_path $dir"
+ fi
+ dir="$absdir"
+ ;;
+ esac
+ case "$deplibs " in
+ *" -L$dir "*) ;;
+ *)
+ deplibs="$deplibs -L$dir"
+ lib_search_path="$lib_search_path $dir"
+ ;;
+ esac
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$dir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$dir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$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*)
+ # 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
+ deplibs="$deplibs -framework System"
+ 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
+ deplibs="$deplibs $arg"
+ continue
+ ;;
+
+ # Tru64 UNIX uses -model [arg] to determine the layout of C++
+ # classes, name mangling, and exception handling.
+ -model)
+ compile_command="$compile_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ finalize_command="$finalize_command $arg"
+ prev=xcompiler
+ continue
+ ;;
+
+ -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe)
+ compiler_flags="$compiler_flags $arg"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ continue
+ ;;
+
+ -module)
+ module=yes
+ continue
+ ;;
+
+ # -64, -mips[0-9] enable 64-bit mode on the SGI compiler
+ # -r[0-9][0-9]* specifies the processor on the SGI compiler
+ # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler
+ # +DA*, +DD* enable 64-bit mode on the HP compiler
+ # -q* pass through compiler args for the IBM compiler
+ # -m* pass through architecture-specific compiler args for GCC
+ # -m*, -t[45]*, -txscale* pass through architecture-specific
+ # compiler args for GCC
+ # -pg pass through profiling flag for GCC
+ # @file GCC response files
+ -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*|-pg| \
+ -t[45]*|-txscale*|@*)
+
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ compiler_flags="$compiler_flags $arg"
+ continue
+ ;;
+
+ -shrext)
+ prev=shrext
+ continue
+ ;;
+
+ -no-fast-install)
+ fast_install=no
+ continue
+ ;;
+
+ -no-install)
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ # The PATH hackery in wrapper scripts is required on Windows
+ # in order for the loader to find any dlls it needs.
+ $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2
+ $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2
+ 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*)
+ dir=`$echo "X$arg" | $Xsed -e 's/^-R//'`
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ $echo "$modename: only absolute run-paths are allowed" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ continue
+ ;;
+
+ -static)
+ # 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
+ ;;
+
+ -Wc,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Wl,*)
+ args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
+ arg=
+ save_ifs="$IFS"; IFS=','
+ for flag in $args; do
+ IFS="$save_ifs"
+ case $flag in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ flag="\"$flag\""
+ ;;
+ esac
+ arg="$arg $wl$flag"
+ compiler_flags="$compiler_flags $wl$flag"
+ linker_flags="$linker_flags $flag"
+ done
+ IFS="$save_ifs"
+ arg=`$echo "X$arg" | $Xsed -e "s/^ //"`
+ ;;
+
+ -Xcompiler)
+ prev=xcompiler
+ continue
+ ;;
+
+ -Xlinker)
+ prev=xlinker
+ continue
+ ;;
+
+ -XCClinker)
+ prev=xcclinker
+ continue
+ ;;
+
+ # Some other compiler flag.
+ -* | +*)
+ # Unknown arguments in both finalize_command and compile_command need
+ # to be aesthetically quoted because they are evaled later.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+
+ *.$objext)
+ # A standard object.
+ objs="$objs $arg"
+ ;;
+
+ *.lo)
+ # A libtool-controlled object.
+
+ # Check to see that this really is a libtool object.
+ if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ pic_object=
+ non_pic_object=
+
+ # Read the .lo file
+ # If there is no directory component, then add one.
+ case $arg in
+ */* | *\\*) . $arg ;;
+ *) . ./$arg ;;
+ esac
+
+ if test -z "$pic_object" || \
+ test -z "$non_pic_object" ||
+ test "$pic_object" = none && \
+ test "$non_pic_object" = none; then
+ $echo "$modename: cannot find name of object for \`$arg'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ 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
+ dlfiles="$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.
+ dlprefiles="$dlprefiles $pic_object"
+ prev=
+ fi
+
+ # A PIC object.
+ libobjs="$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
+ non_pic_objects="$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"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ else
+ # Only an error if not doing a dry-run.
+ if test -z "$run"; then
+ $echo "$modename: \`$arg' is not a valid libtool object" 1>&2
+ exit $EXIT_FAILURE
+ else
+ # Dry-run case.
+
+ # Extract subdirectory from the argument.
+ xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$xdir" = "X$arg"; then
+ xdir=
+ else
+ xdir="$xdir/"
+ fi
+
+ pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"`
+ non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"`
+ libobjs="$libobjs $pic_object"
+ non_pic_objects="$non_pic_objects $non_pic_object"
+ fi
+ fi
+ ;;
+
+ *.$libext)
+ # An archive.
+ deplibs="$deplibs $arg"
+ old_deplibs="$old_deplibs $arg"
+ continue
+ ;;
+
+ *.la)
+ # A libtool-controlled library.
+
+ if test "$prev" = dlfiles; then
+ # This library was specified with -dlopen.
+ dlfiles="$dlfiles $arg"
+ prev=
+ elif test "$prev" = dlprefiles; then
+ # The library was specified with -dlpreopen.
+ dlprefiles="$dlprefiles $arg"
+ prev=
+ else
+ deplibs="$deplibs $arg"
+ 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.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ ;;
+ esac # arg
+
+ # Now actually substitute the argument into the commands.
+ if test -n "$arg"; then
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+ done # argument parsing loop
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prevarg' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+ eval arg=\"$export_dynamic_flag_spec\"
+ compile_command="$compile_command $arg"
+ finalize_command="$finalize_command $arg"
+ fi
+
+ oldlibs=
+ # calculate the name of the file, without its directory
+ outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'`
+ libobjs_save="$libobjs"
+
+ if test -n "$shlibpath_var"; then
+ # get the directories listed in $shlibpath_var
+ eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\"
+
+ output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$output_objdir" = "X$output"; then
+ output_objdir="$objdir"
+ else
+ output_objdir="$output_objdir/$objdir"
+ fi
+ # Create the object directory.
+ if test ! -d "$output_objdir"; then
+ $show "$mkdir $output_objdir"
+ $run $mkdir $output_objdir
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then
+ exit $exit_status
+ fi
+ fi
+
+ # Determine the type of output
+ case $output in
+ "")
+ $echo "$modename: you must specify an output file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ *.$libext) linkmode=oldlib ;;
+ *.lo | *.$objext) linkmode=obj ;;
+ *.la) linkmode=lib ;;
+ *) linkmode=prog ;; # Anything else should be a program.
+ esac
+
+ case $host in
+ *cygwin* | *mingw* | *pw32*)
+ # don't eliminate duplications in $postdeps and $predeps
+ duplicate_compiler_generated_deps=yes
+ ;;
+ *)
+ duplicate_compiler_generated_deps=$duplicate_deps
+ ;;
+ 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 test "X$duplicate_deps" = "Xyes" ; then
+ case "$libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ libs="$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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then
+ for pre_post_dep in $predeps $postdeps; do
+ case "$pre_post_deps " in
+ *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;;
+ esac
+ pre_post_deps="$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
+ case $linkmode in
+ lib)
+ passes="conv link"
+ for file in $dlfiles $dlprefiles; do
+ case $file in
+ *.la) ;;
+ *)
+ $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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
+ 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 "$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)
+ if test "$linkmode,$pass" = "prog,link"; then
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ compiler_flags="$compiler_flags $deplib"
+ fi
+ continue
+ ;;
+ -l*)
+ if test "$linkmode" != lib && test "$linkmode" != prog; then
+ $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2
+ continue
+ fi
+ name=`$echo "X$deplib" | $Xsed -e 's/^-l//'`
+ for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; 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 (${SED} -e '2q' $lib |
+ grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ library_names=
+ old_library=
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ 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
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+ 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
+ -L*)
+ case $linkmode in
+ lib)
+ deplibs="$deplib $deplibs"
+ test "$pass" = conv && continue
+ newdependency_libs="$deplib $newdependency_libs"
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ 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
+ newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`
+ ;;
+ *)
+ $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2
+ ;;
+ esac # linkmode
+ continue
+ ;; # -L
+ -R*)
+ if test "$pass" = link; then
+ dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'`
+ # Make sure the xrpath contains only unique directories.
+ case "$xrpath " in
+ *" $dir "*) ;;
+ *) xrpath="$xrpath $dir" ;;
+ esac
+ fi
+ deplibs="$deplib $deplibs"
+ continue
+ ;;
+ *.la) lib="$deplib" ;;
+ *.$libext)
+ if test "$pass" = conv; then
+ deplibs="$deplib $deplibs"
+ continue
+ fi
+ case $linkmode in
+ lib)
+ valid_a_lib=no
+ case $deplibs_check_method in
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ 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 used here."
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the"
+ $echo "*** static library $deplib is not portable!"
+ deplibs="$deplib $deplibs"
+ fi
+ 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.
+ newdlprefiles="$newdlprefiles $deplib"
+ compile_deplibs="$deplib $compile_deplibs"
+ finalize_deplibs="$deplib $finalize_deplibs"
+ else
+ newdlfiles="$newdlfiles $deplib"
+ fi
+ fi
+ continue
+ ;;
+ %DEPLIBS%)
+ alldeplibs=yes
+ continue
+ ;;
+ esac # case $deplib
+ if test "$found" = yes || test -f "$lib"; then :
+ else
+ $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$ladir" = "X$lib" && ladir="."
+
+ dlname=
+ dlopen=
+ dlpreopen=
+ libdir=
+ library_names=
+ old_library=
+ # 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
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+
+ if test "$linkmode,$pass" = "lib,link" ||
+ test "$linkmode,$pass" = "prog,scan" ||
+ { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+ test -n "$dlopen" && dlfiles="$dlfiles $dlopen"
+ test -n "$dlpreopen" && dlprefiles="$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
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # It is a libtool convenience library, so add in its objects.
+ convenience="$convenience $ladir/$objdir/$old_library"
+ old_convenience="$old_convenience $ladir/$objdir/$old_library"
+ tmp_libs=
+ for deplib in $dependency_libs; do
+ deplibs="$deplib $deplibs"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+ elif test "$linkmode" != prog && test "$linkmode" != lib; then
+ $echo "$modename: \`$lib' is not a convenience library" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ continue
+ fi # $pass = conv
+
+
+ # Get the name of the library we link against.
+ linklib=
+ for l in $old_library $library_names; do
+ linklib="$l"
+ done
+ if test -z "$linklib"; then
+ $echo "$modename: cannot find name of link library for \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # This library was specified with -dlopen.
+ if test "$pass" = dlopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ 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.
+ dlprefiles="$dlprefiles $lib $dependency_libs"
+ else
+ newdlfiles="$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
+ $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2
+ $echo "$modename: passing it literally to the linker, although it might fail" 1>&2
+ abs_ladir="$ladir"
+ fi
+ ;;
+ esac
+ laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+
+ # Find the relevant object directory and library name.
+ if test "X$installed" = Xyes; then
+ if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+ $echo "$modename: warning: library \`$lib' was moved." 1>&2
+ dir="$ladir"
+ absdir="$abs_ladir"
+ libdir="$abs_ladir"
+ else
+ dir="$libdir"
+ absdir="$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
+ notinst_path="$notinst_path $abs_ladir"
+ else
+ dir="$ladir/$objdir"
+ absdir="$abs_ladir/$objdir"
+ # Remove this search path later
+ notinst_path="$notinst_path $abs_ladir"
+ fi
+ fi # $installed = yes
+ name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+
+ # This library was specified with -dlpreopen.
+ if test "$pass" = dlpreopen; then
+ if test -z "$libdir"; then
+ $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ # Prefer using a static library (so that no silly _DYNAMIC symbols
+ # are required to link).
+ if test -n "$old_library"; then
+ newdlprefiles="$newdlprefiles $dir/$old_library"
+ # Otherwise, use the dlname, so that lt_dlopen finds it.
+ elif test -n "$dlname"; then
+ newdlprefiles="$newdlprefiles $dir/$dlname"
+ else
+ newdlprefiles="$newdlprefiles $dir/$linklib"
+ fi
+ 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
+ newlib_search_path="$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*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test
+ 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 test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$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 -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
+ *" $dir "*) ;;
+ *" $absdir "*) ;;
+ *) temp_rpath="$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 "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$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
+ if test "$installed" = no; then
+ notinst_deplibs="$notinst_deplibs $lib"
+ need_relink=yes
+ fi
+ # This is a shared library
+
+ # Warn about portability, can't link against -module's on
+ # some systems (darwin)
+ if 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 "*) ;;
+ *) compile_rpath="$compile_rpath $absdir"
+ esac
+ ;;
+ esac
+ case " $sys_lib_dlsearch_path " in
+ *" $libdir "*) ;;
+ *)
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$finalize_rpath $libdir"
+ esac
+ ;;
+ esac
+ fi
+
+ if test -n "$old_archive_from_expsyms_cmds"; then
+ # figure out the soname
+ set dummy $library_names
+ realname="$2"
+ shift; 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*)
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+ esac
+ eval soname=\"$soname_spec\"
+ else
+ soname="$realname"
+ fi
+
+ # Make a new name for the extract_expsyms_cmds to use
+ soroot="$soname"
+ soname=`$echo $soroot | ${SED} -e 's/^.*\///'`
+ newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a"
+
+ # If the library has no export list, then create one now
+ if test -f "$output_objdir/$soname-def"; then :
+ else
+ $show "extracting exported symbol list from \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$extract_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Create $newlib
+ if test -f "$output_objdir/$newlib"; then :; else
+ $show "generating import library for \`$soname'"
+ save_ifs="$IFS"; IFS='~'
+ cmds=$old_archive_from_expsyms_cmds
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ 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 "$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 module then we can not link against
+ # it, someone is ignoring the new warnings I added
+ if /usr/bin/file -L $add 2> /dev/null |
+ $EGREP ": [^:]* bundle" >/dev/null ; 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
+ 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; then
+ add="$dir/$linklib"
+ elif test "$hardcode_minus_L" = yes; then
+ add_dir="-L$dir"
+ # Try looking first in the location we're being installed to.
+ if test -n "$inst_prefix_dir"; then
+ case $libdir in
+ [\\/]*)
+ add_dir="$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
+ $echo "$modename: configuration error: unsupported hardcode properties"
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$add_shlibpath"; then
+ case :$compile_shlibpath: in
+ *":$add_shlibpath:"*) ;;
+ *) compile_shlibpath="$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:"*) ;;
+ *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;;
+ esac
+ fi
+ fi
+ fi
+
+ if test "$linkmode" = prog || test "$mode" = relink; then
+ add_shlibpath=
+ add_dir=
+ add=
+ # Finalize command for both is simple: just hardcode it.
+ if test "$hardcode_direct" = yes; 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:"*) ;;
+ *) finalize_shlibpath="$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
+ [\\/]*)
+ add_dir="$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*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'`
+ case " $xrpath " in
+ *" $temp_xrpath "*) ;;
+ *) xrpath="$xrpath $temp_xrpath";;
+ esac;;
+ *) temp_deplibs="$temp_deplibs $libdir";;
+ esac
+ done
+ dependency_libs="$temp_deplibs"
+ fi
+
+ newlib_search_path="$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"
+ if test "X$duplicate_deps" = "Xyes" ; then
+ case "$tmp_libs " in
+ *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;;
+ esac
+ fi
+ tmp_libs="$tmp_libs $deplib"
+ done
+
+ if test "$link_all_deplibs" != no; then
+ # Add the search paths of all dependency libraries
+ for deplib in $dependency_libs; do
+ case $deplib in
+ -L*) path="$deplib" ;;
+ *.la)
+ dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$deplib" && dir="."
+ # We need an absolute path.
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+ *)
+ absdir=`cd "$dir" && pwd`
+ if test -z "$absdir"; then
+ $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2
+ absdir="$dir"
+ fi
+ ;;
+ esac
+ if grep "^installed=no" $deplib > /dev/null; then
+ path="$absdir/$objdir"
+ else
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$absdir" != "$libdir"; then
+ $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2
+ fi
+ path="$absdir"
+ fi
+ depdepl=
+ case $host in
+ *-*-darwin*)
+ # we do not want to link against static libs,
+ # but need to link against shared
+ 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 "$path/$depdepl" ; then
+ depdepl="$path/$depdepl"
+ fi
+ # do not add paths which are already there
+ case " $newlib_search_path " in
+ *" $path "*) ;;
+ *) newlib_search_path="$newlib_search_path $path";;
+ esac
+ fi
+ path=""
+ ;;
+ *)
+ path="-L$path"
+ ;;
+ esac
+ ;;
+ -l*)
+ case $host in
+ *-*-darwin*)
+ # Again, we only want to link against shared libraries
+ eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"`
+ for tmp in $newlib_search_path ; do
+ if test -f "$tmp/lib$tmp_libs.dylib" ; then
+ eval depdepl="$tmp/lib$tmp_libs.dylib"
+ break
+ fi
+ done
+ path=""
+ ;;
+ *) continue ;;
+ esac
+ ;;
+ *) continue ;;
+ esac
+ case " $deplibs " in
+ *" $path "*) ;;
+ *) deplibs="$path $deplibs" ;;
+ esac
+ case " $deplibs " in
+ *" $depdepl "*) ;;
+ *) deplibs="$depdepl $deplibs" ;;
+ esac
+ done
+ fi # link_all_deplibs != no
+ fi # linkmode = lib
+ done # for deplib in $libs
+ 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 "*) ;;
+ *) lib_search_path="$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 "*) ;;
+ *) tmp_libs="$tmp_libs $deplib" ;;
+ esac
+ ;;
+ *) tmp_libs="$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
+ tmp_libs="$tmp_libs $i"
+ fi
+ done
+ dependency_libs=$tmp_libs
+ done # for pass
+ if test "$linkmode" = prog; then
+ dlfiles="$newdlfiles"
+ dlprefiles="$newdlprefiles"
+ fi
+
+ case $linkmode in
+ oldlib)
+ if test -n "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
+ fi
+
+ if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+ $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2
+ fi
+
+ # Now set the variables for building old libraries.
+ build_libtool_libs=no
+ oldlibs="$output"
+ objs="$objs$old_deplibs"
+ ;;
+
+ lib)
+ # Make sure we only generate libraries of the form `libNAME.la'.
+ case $outputname in
+ lib*)
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ ;;
+ *)
+ if test "$module" = no; then
+ $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ if test "$need_lib_prefix" != no; then
+ # Add the "lib" prefix for modules if required
+ name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ eval shared_ext=\"$shrext_cmds\"
+ eval libname=\"$libname_spec\"
+ else
+ libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'`
+ fi
+ ;;
+ esac
+
+ if test -n "$objs"; then
+ if test "$deplibs_check_method" != pass_all; then
+ $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1
+ exit $EXIT_FAILURE
+ else
+ $echo
+ $echo "*** Warning: Linking the shared library $output against the non-libtool"
+ $echo "*** objects $objs is not portable!"
+ libobjs="$libobjs $objs"
+ fi
+ fi
+
+ if test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2
+ fi
+
+ set dummy $rpath
+ if test "$#" -gt 2; then
+ $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2
+ fi
+ install_libdir="$2"
+
+ 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
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
+ fi
+ else
+
+ # Parse the version information argument.
+ save_ifs="$IFS"; IFS=':'
+ set dummy $vinfo 0 0 0
+ IFS="$save_ifs"
+
+ if test -n "$8"; then
+ $echo "$modename: too many parameters to \`-version-info'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # 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="$2"
+ number_minor="$3"
+ number_revision="$4"
+ #
+ # 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
+ darwin|linux|osf|windows)
+ current=`expr $number_major + $number_minor`
+ age="$number_minor"
+ revision="$number_revision"
+ ;;
+ freebsd-aout|freebsd-elf|sunos)
+ current="$number_major"
+ revision="$number_minor"
+ age="0"
+ ;;
+ irix|nonstopux)
+ current=`expr $number_major + $number_minor - 1`
+ age="$number_minor"
+ revision="$number_minor"
+ ;;
+ esac
+ ;;
+ no)
+ current="$2"
+ revision="$3"
+ age="$4"
+ ;;
+ 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]) ;;
+ *)
+ $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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]) ;;
+ *)
+ $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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]) ;;
+ *)
+ $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test "$age" -gt "$current"; then
+ $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
+ $echo "$modename: \`$vinfo' is not valid version information" 1>&2
+ exit $EXIT_FAILURE
+ 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
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ # Darwin ld doesn't like 0 for these options...
+ minor_current=`expr $current + 1`
+ verstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+ ;;
+
+ freebsd-aout)
+ major=".$current"
+ versuffix=".$current.$revision";
+ ;;
+
+ freebsd-elf)
+ major=".$current"
+ versuffix=".$current";
+ ;;
+
+ irix | nonstopux)
+ major=`expr $current - $age + 1`
+
+ 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
+ iface=`expr $revision - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring_prefix$major.$iface:$verstring"
+ done
+
+ # Before this point, $major must not contain `.'.
+ major=.$major
+ versuffix="$major.$revision"
+ ;;
+
+ linux)
+ major=.`expr $current - $age`
+ versuffix="$major.$age.$revision"
+ ;;
+
+ osf)
+ major=.`expr $current - $age`
+ 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
+ iface=`expr $current - $loop`
+ loop=`expr $loop - 1`
+ verstring="$verstring:${iface}.0"
+ done
+
+ # Make executables depend on our current version.
+ verstring="$verstring:${current}.0"
+ ;;
+
+ sunos)
+ major=".$current"
+ versuffix=".$current.$revision"
+ ;;
+
+ windows)
+ # Use '-' rather than '.', since we only want one
+ # extension on DOS 8.3 filesystems.
+ major=`expr $current - $age`
+ versuffix="-$major"
+ ;;
+
+ *)
+ $echo "$modename: unknown library version type \`$version_type'" 1>&2
+ $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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
+ $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
+ build_libtool_libs=no
+ build_old_libs=yes
+ fi
+ else
+ # Don't allow undefined symbols.
+ allow_undefined_flag="$no_undefined_flag"
+ fi
+ fi
+
+ if test "$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)
+ ;;
+ $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
+ removelist="$removelist $p"
+ ;;
+ *) ;;
+ esac
+ done
+ if test -n "$removelist"; then
+ $show "${rm}r $removelist"
+ $run ${rm}r $removelist
+ fi
+ fi
+
+ # Now set the variables for building old libraries.
+ if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+ oldlibs="$oldlibs $output_objdir/$libname.$libext"
+
+ # Transform .lo files to .o files.
+ oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP`
+ fi
+
+ # Eliminate all temporary directories.
+ for path in $notinst_path; do
+ lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"`
+ deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"`
+ dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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
+ temp_xrpath="$temp_xrpath -R$libdir"
+ case "$finalize_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_rpath="$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 "*) ;;
+ *) dlfiles="$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 "*) ;;
+ *) dlprefiles="$dlprefiles $lib" ;;
+ esac
+ done
+
+ if test "$build_libtool_libs" = yes; then
+ if test -n "$rpath"; then
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*)
+ # these systems don't actually have a c library (as such)!
+ ;;
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # Rhapsody C library is in the System framework
+ deplibs="$deplibs -framework System"
+ ;;
+ *-*-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
+ deplibs="$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.
+ $rm conftest.c
+ cat > conftest.c <<EOF
+ int main() { return 0; }
+EOF
+ $rm conftest
+ $LTCC $LTCFLAGS -o conftest conftest.c $deplibs
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ for i in $deplibs; do
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" -ne "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$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
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$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
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ 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
+ name=`expr $i : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ $rm conftest
+ $LTCC $LTCFLAGS -o conftest conftest.c $i
+ # Did it work?
+ if test "$?" -eq 0 ; then
+ ldd_output=`ldd conftest`
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $i "*)
+ newdeplibs="$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
+ deplib_match=$2
+ if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+ newdeplibs="$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
+ else
+ newdeplibs="$newdeplibs $i"
+ fi
+ done
+ fi
+ ;;
+ file_magic*)
+ set dummy $deplibs_check_method
+ file_magic_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test "$name" != "" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$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
+ # 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 "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";;
+ esac
+ done
+ if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \
+ | ${SED} 10q \
+ | $EGREP "$file_magic_regex" > /dev/null; then
+ newdeplibs="$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
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ match_pattern*)
+ set dummy $deplibs_check_method
+ match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"`
+ for a_deplib in $deplibs; do
+ name=`expr $a_deplib : '-l\(.*\)'`
+ # If $name is empty we are operating on a -L argument.
+ if test -n "$name" && test "$name" != "0"; then
+ if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+ case " $predeps $postdeps " in
+ *" $a_deplib "*)
+ newdeplibs="$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
+ newdeplibs="$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
+ else
+ # Add a -L argument.
+ newdeplibs="$newdeplibs $a_deplib"
+ fi
+ done # Gone through all deplibs.
+ ;;
+ none | unknown | *)
+ newdeplibs=""
+ tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \
+ -e '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 "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"`
+ done
+ fi
+ if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \
+ | grep . >/dev/null; then
+ $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
+ fi
+ ;;
+ 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 is the System framework
+ newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ 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
+
+
+ # 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 "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$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
+ if test "$hardcode_into_libs" = yes; then
+ # Hardcode the library paths
+ hardcode_libdirs=
+ dep_rpath=
+ rpath="$finalize_rpath"
+ test "$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
+ 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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ dep_rpath="$dep_rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$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"
+ if test -n "$hardcode_libdir_flag_spec_ld"; then
+ eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\"
+ else
+ eval dep_rpath=\"$hardcode_libdir_flag_spec\"
+ fi
+ fi
+ if test -n "$runpath_var" && test -n "$perm_rpath"; then
+ # We should set the runpath_var.
+ rpath=
+ for dir in $perm_rpath; do
+ rpath="$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 "$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
+ realname="$2"
+ shift; 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
+ linknames="$linknames $link"
+ done
+
+ # Use standard objects if they are pic
+ test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ cmds=$export_symbols_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ if len=`expr "X$cmd" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ skipped_export=false
+ else
+ # The command line is too long to execute in one step.
+ $show "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"; then
+ $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\""
+ $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+ $show "$mv \"${export_symbols}T\" \"$export_symbols\""
+ $run eval '$mv "${export_symbols}T" "$export_symbols"'
+ fi
+ fi
+ fi
+
+ if test -n "$export_symbols" && test -n "$include_expsyms"; then
+ $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"'
+ fi
+
+ tmp_deplibs=
+ for test_deplib in $deplibs; do
+ case " $convenience " in
+ *" $test_deplib "*) ;;
+ *)
+ tmp_deplibs="$tmp_deplibs $test_deplib"
+ ;;
+ esac
+ done
+ deplibs="$tmp_deplibs"
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ save_libobjs=$libobjs
+ eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ libobjs="$libobjs $func_extract_archives_result"
+ fi
+ fi
+
+ if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+ eval flag=\"$thread_safe_flag_spec\"
+ linker_flags="$linker_flags $flag"
+ fi
+
+ # Make a backup of the uninstalled library when relinking
+ if test "$mode" = relink; then
+ $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:" &&
+ len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ :
+ else
+ # The command line is too long to link in one step, link piecewise.
+ $echo "creating reloadable object files..."
+
+ # 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
+ output_la=`$echo "X$output" | $Xsed -e "$basename"`
+
+ # Clear the reloadable object creation command queue and
+ # initialize k to one.
+ test_cmds=
+ concat_cmds=
+ objlist=
+ delfiles=
+ last_robj=
+ k=1
+ output=$output_objdir/$output_la-${k}.$objext
+ # Loop over the list of objects to be linked.
+ for obj in $save_libobjs
+ do
+ eval test_cmds=\"$reload_cmds $objlist $last_robj\"
+ if test "X$objlist" = X ||
+ { len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$max_cmd_len"; }; then
+ objlist="$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.
+ eval concat_cmds=\"$reload_cmds $objlist $last_robj\"
+ else
+ # All subsequent reloadable object files will link in
+ # the last one created.
+ eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\"
+ fi
+ last_robj=$output_objdir/$output_la-${k}.$objext
+ k=`expr $k + 1`
+ output=$output_objdir/$output_la-${k}.$objext
+ objlist=$obj
+ len=1
+ 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~
+ eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\"
+
+ if ${skipped_export-false}; then
+ $show "generating symbol list for \`$libname.la'"
+ export_symbols="$output_objdir/$libname.exp"
+ $run $rm $export_symbols
+ libobjs=$output
+ # Append the command to create the export file.
+ eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\"
+ fi
+
+ # Set up a command to remove the reloadable object files
+ # after they are used.
+ i=0
+ while test "$i" -lt "$k"
+ do
+ i=`expr $i + 1`
+ delfiles="$delfiles $output_objdir/$output_la-${i}.$objext"
+ done
+
+ $echo "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"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ 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\"
+ 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
+
+ # Append the command to remove the reloadable object files
+ # to the just-reset $cmds.
+ eval cmds=\"\$cmds~\$rm $delfiles\"
+ fi
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(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 "$mode" = relink; then
+ $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
+ $show "${rm}r $gentop"
+ $run ${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
+ $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)"
+ $run 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 "$deplibs"; then
+ $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
+ fi
+
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$rpath"; then
+ $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$xrpath"; then
+ $echo "$modename: warning: \`-R' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
+ fi
+
+ case $output in
+ *.lo)
+ if test -n "$objs$old_deplibs"; then
+ $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ libobj="$output"
+ obj=`$echo "X$output" | $Xsed -e "$lo2o"`
+ ;;
+ *)
+ libobj=
+ obj="$output"
+ ;;
+ esac
+
+ # Delete the old objects.
+ $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
+ wl=
+
+ if test -n "$convenience"; then
+ if test -n "$whole_archive_flag_spec"; then
+ eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\"
+ else
+ gentop="$output_objdir/${obj}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $convenience
+ reload_conv_objs="$reload_objs $func_extract_archives_result"
+ fi
+ fi
+
+ # Create the old-style object.
+ reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+ output="$obj"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+
+ # Exit if we aren't doing a library object file.
+ if test -z "$libobj"; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ fi
+
+ if test "$build_libtool_libs" != yes; then
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${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"
+ # $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"
+ cmds=$reload_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$gentop"; then
+ $show "${rm}r $gentop"
+ $run ${rm}r $gentop
+ fi
+
+ exit $EXIT_SUCCESS
+ ;;
+
+ prog)
+ case $host in
+ *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;;
+ esac
+ if test -n "$vinfo"; then
+ $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
+ fi
+
+ if test -n "$release"; then
+ $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
+ fi
+
+ if test "$preload" = yes; then
+ if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown &&
+ test "$dlopen_self_static" = unknown; then
+ $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support."
+ fi
+ fi
+
+ case $host in
+ *-*-rhapsody* | *-*-darwin1.[012])
+ # On Rhapsody replace the C library is the System framework
+ compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'`
+ ;;
+ esac
+
+ case $host in
+ *darwin*)
+ # Don't allow lazy linking, it breaks C++ global constructors
+ if test "$tagname" = CXX ; then
+ compile_command="$compile_command ${wl}-bind_at_load"
+ finalize_command="$finalize_command ${wl}-bind_at_load"
+ fi
+ ;;
+ 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 "*)
+ new_libs="$new_libs -L$path/$objdir" ;;
+ esac
+ ;;
+ esac
+ done
+ for deplib in $compile_deplibs; do
+ case $deplib in
+ -L*)
+ case " $new_libs " in
+ *" $deplib "*) ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ ;;
+ *) new_libs="$new_libs $deplib" ;;
+ esac
+ done
+ compile_deplibs="$new_libs"
+
+
+ compile_command="$compile_command $compile_deplibs"
+ finalize_command="$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 "*) ;;
+ *) finalize_rpath="$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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$perm_rpath " in
+ *" $libdir "*) ;;
+ *) perm_rpath="$perm_rpath $libdir" ;;
+ esac
+ fi
+ case $host in
+ *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*)
+ testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'`
+ case :$dllsearchpath: in
+ *":$libdir:"*) ;;
+ *) dllsearchpath="$dllsearchpath:$libdir";;
+ esac
+ case :$dllsearchpath: in
+ *":$testbindir:"*) ;;
+ *) dllsearchpath="$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"*)
+ ;;
+ *)
+ hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir"
+ ;;
+ esac
+ fi
+ else
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ rpath="$rpath $flag"
+ fi
+ elif test -n "$runpath_var"; then
+ case "$finalize_perm_rpath " in
+ *" $libdir "*) ;;
+ *) finalize_perm_rpath="$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 "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ fi
+
+ dlsyms=
+ if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+ if test -n "$NM" && test -n "$global_symbol_pipe"; then
+ dlsyms="${outputname}S.c"
+ else
+ $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2
+ fi
+ fi
+
+ if test -n "$dlsyms"; then
+ case $dlsyms in
+ "") ;;
+ *.c)
+ # Discover the nlist of each of the dlfiles.
+ nlist="$output_objdir/${outputname}.nm"
+
+ $show "$rm $nlist ${nlist}S ${nlist}T"
+ $run $rm "$nlist" "${nlist}S" "${nlist}T"
+
+ # Parse the name list into a source file.
+ $show "creating $output_objdir/$dlsyms"
+
+ test -z "$run" && $echo > "$output_objdir/$dlsyms" "\
+/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */
+/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+/* Prevent the only kind of declaration conflicts we can make. */
+#define lt_preloaded_symbols some_other_symbol
+
+/* External symbol declarations for the compiler. */\
+"
+
+ if test "$dlself" = yes; then
+ $show "generating symbol list for \`$output'"
+
+ test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist"
+
+ # Add our own program objects to the symbol list.
+ progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP`
+ for arg in $progfiles; do
+ $show "extracting global C symbols from \`$arg'"
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -n "$exclude_expsyms"; then
+ $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ if test -n "$export_symbols_regex"; then
+ $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+ $run eval '$mv "$nlist"T "$nlist"'
+ fi
+
+ # Prepare the list of exported symbols
+ if test -z "$export_symbols"; then
+ export_symbols="$output_objdir/$outputname.exp"
+ $run $rm $export_symbols
+ $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ else
+ $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+ $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+ $run eval 'mv "$nlist"T "$nlist"'
+ case $host in
+ *cygwin* | *mingw* )
+ $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+ $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+ ;;
+ esac
+ fi
+ fi
+
+ for arg in $dlprefiles; do
+ $show "extracting global C symbols from \`$arg'"
+ name=`$echo "$arg" | ${SED} -e 's%^.*/%%'`
+ $run eval '$echo ": $name " >> "$nlist"'
+ $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'"
+ done
+
+ if test -z "$run"; then
+ # 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/$dlsyms"'
+ else
+ $echo '/* NONE */' >> "$output_objdir/$dlsyms"
+ fi
+
+ $echo >> "$output_objdir/$dlsyms" "\
+
+#undef lt_preloaded_symbols
+
+#if defined (__STDC__) && __STDC__
+# define lt_ptr void *
+#else
+# define lt_ptr char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+"
+
+ case $host in
+ *cygwin* | *mingw* )
+ $echo >> "$output_objdir/$dlsyms" "\
+/* DATA imports from DLLs on WIN32 can't be const, because
+ runtime relocations are performed -- see ld's documentation
+ on pseudo-relocs */
+struct {
+"
+ ;;
+ * )
+ $echo >> "$output_objdir/$dlsyms" "\
+const struct {
+"
+ ;;
+ esac
+
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ const char *name;
+ lt_ptr address;
+}
+lt_preloaded_symbols[] =
+{\
+"
+
+ eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
+
+ $echo >> "$output_objdir/$dlsyms" "\
+ {0, (lt_ptr) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+ return lt_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+ fi
+
+ pic_flag_for_symtable=
+ 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*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";;
+ esac;;
+ *-*-hpux*)
+ case "$compile_command " in
+ *" -static "*) ;;
+ *) pic_flag_for_symtable=" $pic_flag";;
+ esac
+ esac
+
+ # Now compile the dynamic symbol file.
+ $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")"
+ $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $?
+
+ # Clean up the generated files.
+ $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T"
+ $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T"
+
+ # Transform the symbol file into the correct name.
+ case $host in
+ *cygwin* | *mingw* )
+ if test -f "$output_objdir/${outputname}.def" ; then
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%"`
+ else
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ fi
+ ;;
+ * )
+ compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"`
+ ;;
+ esac
+ ;;
+ *)
+ $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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 "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
+ finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
+ fi
+
+ if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+ # Replace the output file specification.
+ compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ link_command="$compile_command$compile_rpath"
+
+ # We have no uninstalled library dependencies, so finalize right now.
+ $show "$link_command"
+ $run eval "$link_command"
+ exit_status=$?
+
+ # Delete the generated files.
+ if test -n "$dlsyms"; then
+ $show "$rm $output_objdir/${outputname}S.${objext}"
+ $run $rm "$output_objdir/${outputname}S.${objext}"
+ fi
+
+ exit $exit_status
+ fi
+
+ if test -n "$shlibpath_var"; then
+ # We should set the shlibpath_var
+ rpath=
+ for dir in $temp_rpath; do
+ case $dir in
+ [\\/]* | [A-Za-z]:[\\/]*)
+ # Absolute path.
+ rpath="$rpath$dir:"
+ ;;
+ *)
+ # Relative path: add a thisdir entry.
+ rpath="$rpath\$thisdir/$dir:"
+ ;;
+ esac
+ done
+ temp_rpath="$rpath"
+ 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
+ rpath="$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
+ rpath="$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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'`
+ # Delete the old output file.
+ $run $rm $output
+ # Link the executable and exit
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+ 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"
+
+ $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2
+ $echo "$modename: \`$output' will be relinked during installation" 1>&2
+ else
+ if test "$fast_install" != no; then
+ link_command="$finalize_var$compile_command$finalize_rpath"
+ if test "$fast_install" = yes; then
+ relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e '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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+ # Delete the old output files.
+ $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+ $show "$link_command"
+ $run eval "$link_command" || exit $?
+
+ # Now create the wrapper script.
+ $show "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}\" || 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
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; export $var; $relink_command"
+ fi
+ done
+ relink_command="(cd `pwd`; $relink_command)"
+ relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Quote $echo for shipping.
+ if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then
+ case $progpath in
+ [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";;
+ *) qecho="$SHELL `pwd`/$progpath --fallback-echo";;
+ esac
+ qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"`
+ else
+ qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"`
+ fi
+
+ # Only actually do things if our run command is non-null.
+ if test -z "$run"; then
+ # win32 will think the script is a binary if it has
+ # a .exe suffix, so we strip it off here.
+ case $output in
+ *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;;
+ esac
+ # test for cygwin because mv fails w/o .exe extensions
+ case $host in
+ *cygwin*)
+ exeext=.exe
+ outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;;
+ *) exeext= ;;
+ esac
+ case $host in
+ *cygwin* | *mingw* )
+ output_name=`basename $output`
+ output_path=`dirname $output`
+ 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
+
+ cat > $cwrappersource <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+ Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+
+ 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.
+
+ Currently, it simply execs the wrapper *script* "/bin/sh $output",
+ but could eventually absorb all of the scripts functionality and
+ exec $objdir/$outputname directly.
+*/
+EOF
+ cat >> $cwrappersource<<"EOF"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#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
+# 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 */
+
+#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+ if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+/* -DDEBUG is fairly common in CFLAGS. */
+#undef DEBUG
+#if defined DEBUGWRAPPER
+# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__)
+#else
+# define DEBUG(format, ...)
+#endif
+
+const char *program_name = NULL;
+
+void * xmalloc (size_t num);
+char * xstrdup (const char *string);
+const char * base_name (const char *name);
+char * find_executable(const char *wrapper);
+int check_executable(const char *path);
+char * strendzap(char *str, const char *pat);
+void lt_fatal (const char *message, ...);
+
+int
+main (int argc, char *argv[])
+{
+ char **newargz;
+ int i;
+
+ program_name = (char *) xstrdup (base_name (argv[0]));
+ DEBUG("(main) argv[0] : %s\n",argv[0]);
+ DEBUG("(main) program_name : %s\n",program_name);
+ newargz = XMALLOC(char *, argc+2);
+EOF
+
+ cat >> $cwrappersource <<EOF
+ newargz[0] = (char *) xstrdup("$SHELL");
+EOF
+
+ cat >> $cwrappersource <<"EOF"
+ newargz[1] = find_executable(argv[0]);
+ if (newargz[1] == NULL)
+ lt_fatal("Couldn't find %s", argv[0]);
+ DEBUG("(main) found exe at : %s\n",newargz[1]);
+ /* we know the script has the same name, without the .exe */
+ /* so make sure newargz[1] doesn't end in .exe */
+ strendzap(newargz[1],".exe");
+ for (i = 1; i < argc; i++)
+ newargz[i+1] = xstrdup(argv[i]);
+ newargz[argc+1] = NULL;
+
+ for (i=0; i<argc+1; i++)
+ {
+ DEBUG("(main) newargz[%d] : %s\n",i,newargz[i]);
+ ;
+ }
+
+EOF
+
+ case $host_os in
+ mingw*)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",(char const **)newargz);
+EOF
+ ;;
+ *)
+ cat >> $cwrappersource <<EOF
+ execv("$SHELL",newargz);
+EOF
+ ;;
+ esac
+
+ cat >> $cwrappersource <<"EOF"
+ return 127;
+}
+
+void *
+xmalloc (size_t num)
+{
+ void * p = (void *) malloc (num);
+ if (!p)
+ lt_fatal ("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;
+
+ DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!");
+ if ((!path) || (!*path))
+ return 0;
+
+ if ((stat (path, &st) >= 0) &&
+ (
+ /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */
+#if defined (S_IXOTH)
+ ((st.st_mode & S_IXOTH) == S_IXOTH) ||
+#endif
+#if defined (S_IXGRP)
+ ((st.st_mode & S_IXGRP) == S_IXGRP) ||
+#endif
+ ((st.st_mode & S_IXUSR) == S_IXUSR))
+ )
+ return 1;
+ else
+ return 0;
+}
+
+/* Searches for the full path of the wrapper. Returns
+ newly allocated full path name if found, NULL otherwise */
+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;
+
+ DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!");
+
+ 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 ("getcwd failed");
+ 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 ("getcwd failed");
+ 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 *
+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;
+}
+
+static void
+lt_error_core (int exit_status, const char * mode,
+ const char * message, va_list ap)
+{
+ fprintf (stderr, "%s: %s: ", program_name, mode);
+ vfprintf (stderr, message, ap);
+ fprintf (stderr, ".\n");
+
+ if (exit_status >= 0)
+ exit (exit_status);
+}
+
+void
+lt_fatal (const char *message, ...)
+{
+ va_list ap;
+ va_start (ap, message);
+ lt_error_core (EXIT_FAILURE, "FATAL", message, ap);
+ va_end (ap);
+}
+EOF
+ # we should really use a build-platform specific compiler
+ # here, but OTOH, the wrappers (shell script and this C one)
+ # are only useful if you want to execute the "real" binary.
+ # Since the "real" binary is built for $host, then this
+ # wrapper might as well be built for $host, too.
+ $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource
+ ;;
+ esac
+ $rm $output
+ trap "$rm $output; exit $EXIT_FAILURE" 1 2 15
+
+ $echo > $output "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# 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.
+Xsed='${SED} -e 1s/^X//'
+sed_quote_subst='$sed_quote_subst'
+
+# 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 variable:
+ 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
+ echo=\"$qecho\"
+ file=\"\$0\"
+ # Make sure echo works.
+ if test \"X\$1\" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+ elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
+ # Yippee, \$echo works!
+ :
+ else
+ # Restart under the correct shell, and then maybe \$echo will work.
+ exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
+ fi
+ fi\
+"
+ $echo >> $output "\
+
+ # Find the directory that this script lives in.
+ thisdir=\`\$echo \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e '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 \"X\$file\" | \$Xsed -e 's%^.*/%%'\`
+ file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\`
+ done
+
+ # Try to get the absolute directory name.
+ absdir=\`cd \"\$thisdir\" && pwd\`
+ test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+ if test "$fast_install" = yes; then
+ $echo >> $output "\
+ 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 >> $output "\
+
+ # 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 $EXIT_FAILURE
+ fi
+ fi
+
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+ { $rm \"\$progdir/\$program\";
+ $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+ $rm \"\$progdir/\$file\"
+ fi"
+ else
+ $echo >> $output "\
+ program='$outputname'
+ progdir=\"\$thisdir/$objdir\"
+"
+ fi
+
+ $echo >> $output "\
+
+ if test -f \"\$progdir/\$program\"; then"
+
+ # Export our shlibpath_var if we have one.
+ if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+ $echo >> $output "\
+ # 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 \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\`
+
+ export $shlibpath_var
+"
+ fi
+
+ # fixup the dll searchpath if we need to.
+ if test -n "$dllsearchpath"; then
+ $echo >> $output "\
+ # Add the dll search path components to the executable PATH
+ PATH=$dllsearchpath:\$PATH
+"
+ fi
+
+ $echo >> $output "\
+ if test \"\$libtool_execute_magic\" != \"$magic\"; then
+ # Run the actual program with our arguments.
+"
+ case $host in
+ # Backslashes separate directories on plain windows
+ *-*-mingw | *-*-os2*)
+ $echo >> $output "\
+ exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+ ;;
+
+ *)
+ $echo >> $output "\
+ exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+ ;;
+ esac
+ $echo >> $output "\
+ \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\"
+ exit $EXIT_FAILURE
+ 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 $EXIT_FAILURE
+ fi
+fi\
+"
+ chmod +x $output
+ fi
+ 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"
+ 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"
+ fi
+ addlibs="$old_convenience"
+ fi
+
+ if test -n "$addlibs"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ func_extract_archives $gentop $addlibs
+ oldobjs="$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
+ # 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
+ $echo "X$obj" | $Xsed -e 's%^.*/%%'
+ done | sort | sort -uc >/dev/null 2>&1); then
+ :
+ else
+ $echo "copying selected object files to avoid basename conflicts..."
+
+ if test -z "$gentop"; then
+ gentop="$output_objdir/${outputname}x"
+ generated="$generated $gentop"
+
+ $show "${rm}r $gentop"
+ $run ${rm}r "$gentop"
+ $show "$mkdir $gentop"
+ $run $mkdir "$gentop"
+ exit_status=$?
+ if test "$exit_status" -ne 0 && test ! -d "$gentop"; then
+ exit $exit_status
+ fi
+ fi
+
+ save_oldobjs=$oldobjs
+ oldobjs=
+ counter=1
+ for obj in $save_oldobjs
+ do
+ objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'`
+ case " $oldobjs " in
+ " ") oldobjs=$obj ;;
+ *[\ /]"$objbase "*)
+ while :; do
+ # Make sure we don't pick an alternate name that also
+ # overlaps.
+ newobj=lt$counter-$objbase
+ counter=`expr $counter + 1`
+ case " $oldobjs " in
+ *[\ /]"$newobj "*) ;;
+ *) if test ! -f "$gentop/$newobj"; then break; fi ;;
+ esac
+ done
+ $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+ $run ln "$obj" "$gentop/$newobj" ||
+ $run cp "$obj" "$gentop/$newobj"
+ oldobjs="$oldobjs $gentop/$newobj"
+ ;;
+ *) oldobjs="$oldobjs $obj" ;;
+ esac
+ done
+ fi
+
+ eval cmds=\"$old_archive_cmds\"
+
+ if len=`expr "X$cmds" : ".*"` &&
+ test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+ cmds=$old_archive_cmds
+ else
+ # the command line is too long to link in one step, link in parts
+ $echo "using piecewise archive linking..."
+ save_RANLIB=$RANLIB
+ RANLIB=:
+ objlist=
+ concat_cmds=
+ save_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
+ for obj in $save_oldobjs
+ do
+ oldobjs="$objlist $obj"
+ objlist="$objlist $obj"
+ eval test_cmds=\"$old_archive_cmds\"
+ if len=`expr "X$test_cmds" : ".*" 2>/dev/null` &&
+ test "$len" -le "$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=
+ 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
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ eval cmd=\"$cmd\"
+ IFS="$save_ifs"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$generated"; then
+ $show "${rm}r$generated"
+ $run ${rm}r$generated
+ fi
+
+ # Now create the libtool archive.
+ case $output in
+ *.la)
+ old_library=
+ test "$build_old_libs" = yes && old_library="$libname.$libext"
+ $show "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}\" || 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
+ var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"`
+ relink_command="$var=\"$var_value\"; 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 "X$relink_command" | $Xsed -e "$sed_quote_subst"`
+ if test "$hardcode_automatic" = yes ; then
+ relink_command=
+ fi
+
+
+ # Only create the output if not a dry run.
+ if test -z "$run"; then
+ 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)
+ name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdependency_libs="$newdependency_libs $libdir/$name"
+ ;;
+ *) newdependency_libs="$newdependency_libs $deplib" ;;
+ esac
+ done
+ dependency_libs="$newdependency_libs"
+ newdlfiles=
+ for lib in $dlfiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlfiles="$newdlfiles $libdir/$name"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'`
+ eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+ if test -z "$libdir"; then
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ newdlprefiles="$newdlprefiles $libdir/$name"
+ done
+ dlprefiles="$newdlprefiles"
+ else
+ newdlfiles=
+ for lib in $dlfiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlfiles="$newdlfiles $abs"
+ done
+ dlfiles="$newdlfiles"
+ newdlprefiles=
+ for lib in $dlprefiles; do
+ case $lib in
+ [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+ *) abs=`pwd`"/$lib" ;;
+ esac
+ newdlprefiles="$newdlprefiles $abs"
+ done
+ dlprefiles="$newdlprefiles"
+ fi
+ $rm $output
+ # place dlname in correct position for cygwin
+ tdlname=$dlname
+ case $host,$output,$installed,$module,$dlname in
+ *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;
+ esac
+ $echo > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP
+#
+# 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'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_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
+ fi
+
+ # Do a symbolic link so that the libtool archive can be found in
+ # LD_LIBRARY_PATH before the program is installed.
+ $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)"
+ $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $?
+ ;;
+ esac
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool install mode
+ install)
+ modename="$modename: install"
+
+ # 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.
+ $echo "X$nonopt" | grep shtool > /dev/null; then
+ # Aesthetically quote it.
+ arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$arg "
+ arg="$1"
+ shift
+ else
+ install_prog=
+ arg=$nonopt
+ fi
+
+ # The real first argument should be the name of the installation program.
+ # Aesthetically quote it.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog$arg"
+
+ # We need to accept at least all the BSD install flags.
+ dest=
+ files=
+ opts=
+ prev=
+ install_type=
+ isdir=no
+ stripme=
+ for arg
+ do
+ if test -n "$dest"; then
+ files="$files $dest"
+ dest=$arg
+ continue
+ fi
+
+ case $arg in
+ -d) isdir=yes ;;
+ -f)
+ case " $install_prog " in
+ *[\\\ /]cp\ *) ;;
+ *) prev=$arg ;;
+ esac
+ ;;
+ -g | -m | -o) prev=$arg ;;
+ -s)
+ stripme=" -s"
+ continue
+ ;;
+ -*)
+ ;;
+ *)
+ # If the previous option needed an argument, then skip it.
+ if test -n "$prev"; then
+ prev=
+ else
+ dest=$arg
+ continue
+ fi
+ ;;
+ esac
+
+ # Aesthetically quote the argument.
+ arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`
+ case $arg in
+ *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"")
+ arg="\"$arg\""
+ ;;
+ esac
+ install_prog="$install_prog $arg"
+ done
+
+ if test -z "$install_prog"; then
+ $echo "$modename: you must specify an install program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -n "$prev"; then
+ $echo "$modename: the \`$prev' option requires an argument" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ if test -z "$files"; then
+ if test -z "$dest"; then
+ $echo "$modename: no file or destination specified" 1>&2
+ else
+ $echo "$modename: you must specify a destination" 1>&2
+ fi
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Strip any trailing slash from the destination.
+ dest=`$echo "X$dest" | $Xsed -e 's%/$%%'`
+
+ # Check to see that the destination is a directory.
+ test -d "$dest" && isdir=yes
+ if test "$isdir" = yes; then
+ destdir="$dest"
+ destname=
+ else
+ destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$destdir" = "X$dest" && destdir=.
+ destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'`
+
+ # Not a directory, so check to see that there is only one file specified.
+ set dummy $files
+ if test "$#" -gt 2; then
+ $echo "$modename: \`$dest' is not a directory" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+ case $destdir in
+ [\\/]* | [A-Za-z]:[\\/]*) ;;
+ *)
+ for file in $files; do
+ case $file in
+ *.lo) ;;
+ *)
+ $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ 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.
+ staticlibs="$staticlibs $file"
+ ;;
+
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ library_names=
+ old_library=
+ relink_command=
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Add the libdir to current_libdirs if it is the destination.
+ if test "X$destdir" = "X$libdir"; then
+ case "$current_libdirs " in
+ *" $libdir "*) ;;
+ *) current_libdirs="$current_libdirs $libdir" ;;
+ esac
+ else
+ # Note the libdir as a future libdir.
+ case "$future_libdirs " in
+ *" $libdir "*) ;;
+ *) future_libdirs="$future_libdirs $libdir" ;;
+ esac
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/
+ test "X$dir" = "X$file/" && dir=
+ dir="$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 "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.
+ if test "$inst_prefix_dir" = "$destdir"; then
+ $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ 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
+
+ $echo "$modename: warning: relinking \`$file'" 1>&2
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ fi
+
+ # See the names of the shared library.
+ set dummy $library_names
+ if test -n "$2"; then
+ realname="$2"
+ shift
+ shift
+
+ srcname="$realname"
+ test -n "$relink_command" && srcname="$realname"T
+
+ # Install the shared library and build the symlinks.
+ $show "$install_prog $dir/$srcname $destdir/$realname"
+ $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $?
+ if test -n "$stripme" && test -n "$striplib"; then
+ $show "$striplib $destdir/$realname"
+ $run 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
+ if test "$linkname" != "$realname"; then
+ $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })"
+ fi
+ done
+ fi
+
+ # Do each command in the postinstall commands.
+ lib="$destdir/$realname"
+ cmds=$postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || {
+ lt_exit=$?
+
+ # Restore the uninstalled library and exit
+ if test "$mode" = relink; then
+ $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)'
+ fi
+
+ exit $lt_exit
+ }
+ done
+ IFS="$save_ifs"
+ fi
+
+ # Install the pseudo-library for information purposes.
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ instname="$dir/$name"i
+ $show "$install_prog $instname $destdir/$name"
+ $run eval "$install_prog $instname $destdir/$name" || exit $?
+
+ # Maybe install the static library, too.
+ test -n "$old_library" && staticlibs="$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
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ destfile="$destdir/$destfile"
+ fi
+
+ # Deduce the name of the destination old-style object file.
+ case $destfile in
+ *.lo)
+ staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"`
+ ;;
+ *.$objext)
+ staticdest="$destfile"
+ destfile=
+ ;;
+ *)
+ $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ # Install the libtool object if requested.
+ if test -n "$destfile"; then
+ $show "$install_prog $file $destfile"
+ $run eval "$install_prog $file $destfile" || exit $?
+ fi
+
+ # Install the old object if enabled.
+ if test "$build_old_libs" = yes; then
+ # Deduce the name of the old-style object file.
+ staticobj=`$echo "X$file" | $Xsed -e "$lo2o"`
+
+ $show "$install_prog $staticobj $staticdest"
+ $run 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
+ destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ 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
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ stripped_ext=".exe"
+ fi
+ ;;
+ esac
+
+ # Do a test to see if this is really a libtool program.
+ case $host in
+ *cygwin*|*mingw*)
+ wrapper=`$echo $file | ${SED} -e 's,.exe$,,'`
+ ;;
+ *)
+ wrapper=$file
+ ;;
+ esac
+ if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then
+ notinst_deplibs=
+ relink_command=
+
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo 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.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ # Check the variables that should have been set.
+ if test -z "$notinst_deplibs"; then
+ $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ finalize=yes
+ for lib in $notinst_deplibs; do
+ # Check to see that each library is installed.
+ libdir=
+ if test -f "$lib"; then
+ # If there is no directory component, then add one.
+ case $lib in
+ */* | *\\*) . $lib ;;
+ *) . ./$lib ;;
+ esac
+ fi
+ libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test
+ if test -n "$libdir" && test ! -f "$libfile"; then
+ $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
+ finalize=no
+ fi
+ done
+
+ relink_command=
+ # Note that it is not necessary on cygwin/mingw to append a dot to
+ # foo even if both foo 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.
+ #
+ # If there is no directory component, then add one.
+ case $wrapper in
+ */* | *\\*) . ${wrapper} ;;
+ *) . ./${wrapper} ;;
+ esac
+
+ outputname=
+ if test "$fast_install" = no && test -n "$relink_command"; then
+ if test "$finalize" = yes && test -z "$run"; then
+ tmpdir=`func_mktempdir`
+ file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'`
+ outputname="$tmpdir/$file"
+ # Replace the output file specification.
+ relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'`
+
+ $show "$relink_command"
+ if $run eval "$relink_command"; then :
+ else
+ $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2
+ ${rm}r "$tmpdir"
+ continue
+ fi
+ file="$outputname"
+ else
+ $echo "$modename: warning: cannot relink \`$file'" 1>&2
+ fi
+ else
+ # Install the binary that we compiled earlier.
+ file=`$echo "X$file$stripped_ext" | $Xsed -e "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)
+ destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'`
+ ;;
+ esac
+ ;;
+ esac
+ $show "$install_prog$stripme $file $destfile"
+ $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
+ test -n "$outputname" && ${rm}r "$tmpdir"
+ ;;
+ esac
+ done
+
+ for file in $staticlibs; do
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+
+ # Set up the ranlib parameters.
+ oldlib="$destdir/$name"
+
+ $show "$install_prog $file $oldlib"
+ $run eval "$install_prog \$file \$oldlib" || exit $?
+
+ if test -n "$stripme" && test -n "$old_striplib"; then
+ $show "$old_striplib $oldlib"
+ $run eval "$old_striplib $oldlib" || exit $?
+ fi
+
+ # Do each command in the postinstall commands.
+ cmds=$old_postinstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || exit $?
+ done
+ IFS="$save_ifs"
+ done
+
+ if test -n "$future_libdirs"; then
+ $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2
+ fi
+
+ if test -n "$current_libdirs"; then
+ # Maybe just do a dry run.
+ test -n "$run" && current_libdirs=" -n$current_libdirs"
+ exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+ else
+ exit $EXIT_SUCCESS
+ fi
+ ;;
+
+ # libtool finish mode
+ finish)
+ modename="$modename: finish"
+ libdirs="$nonopt"
+ admincmds=
+
+ if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+ for dir
+ do
+ libdirs="$libdirs $dir"
+ done
+
+ for libdir in $libdirs; do
+ if test -n "$finish_cmds"; then
+ # Do each command in the finish commands.
+ cmds=$finish_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd" || admincmds="$admincmds
+ $cmd"
+ done
+ IFS="$save_ifs"
+ fi
+ if test -n "$finish_eval"; then
+ # Do the single finish_eval.
+ eval cmds=\"$finish_eval\"
+ $run eval "$cmds" || admincmds="$admincmds
+ $cmds"
+ fi
+ done
+ fi
+
+ # Exit here if they wanted silent mode.
+ test "$show" = : && exit $EXIT_SUCCESS
+
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ $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"
+ $echo "more information, such as the ld(1) and ld.so(8) manual pages."
+ $echo "X----------------------------------------------------------------------" | $Xsed
+ exit $EXIT_SUCCESS
+ ;;
+
+ # libtool execute mode
+ execute)
+ modename="$modename: execute"
+
+ # The first argument is the command name.
+ cmd="$nonopt"
+ if test -z "$cmd"; then
+ $echo "$modename: you must specify a COMMAND" 1>&2
+ $echo "$help"
+ exit $EXIT_FAILURE
+ fi
+
+ # Handle -dlopen flags immediately.
+ for file in $execute_dlfiles; do
+ if test ! -f "$file"; then
+ $echo "$modename: \`$file' is not a file" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ dir=
+ case $file in
+ *.la)
+ # Check to see that this really is a libtool archive.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
+ else
+ $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ # Read the libtool library.
+ dlname=
+ library_names=
+
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Skip this library if it cannot be dlopened.
+ if test -z "$dlname"; then
+ # Warn if it was a shared library.
+ test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'"
+ continue
+ fi
+
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+
+ if test -f "$dir/$objdir/$dlname"; then
+ dir="$dir/$objdir"
+ else
+ $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2
+ exit $EXIT_FAILURE
+ fi
+ ;;
+
+ *.lo)
+ # Just add the directory containing the .lo file.
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ test "X$dir" = "X$file" && dir=.
+ ;;
+
+ *)
+ $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2
+ 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
+ -*) ;;
+ *)
+ # Do a test to see if this is really a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ # If there is no directory component, then add one.
+ case $file in
+ */* | *\\*) . $file ;;
+ *) . ./$file ;;
+ esac
+
+ # Transform arg to wrapped name.
+ file="$progdir/$program"
+ fi
+ ;;
+ esac
+ # Quote arguments (to preserve shell metacharacters).
+ file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"`
+ args="$args \"$file\""
+ done
+
+ if test -z "$run"; then
+ if test -n "$shlibpath_var"; then
+ # Export the shlibpath_var.
+ eval "export $shlibpath_var"
+ fi
+
+ # Restore saved environment variables
+ if test "${save_LC_ALL+set}" = set; then
+ LC_ALL="$save_LC_ALL"; export LC_ALL
+ fi
+ if test "${save_LANG+set}" = set; then
+ LANG="$save_LANG"; export LANG
+ fi
+
+ # 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
+ ;;
+
+ # libtool clean and uninstall mode
+ clean | uninstall)
+ modename="$modename: $mode"
+ 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) rm="$rm $arg"; rmforce=yes ;;
+ -*) rm="$rm $arg" ;;
+ *) files="$files $arg" ;;
+ esac
+ done
+
+ if test -z "$rm"; then
+ $echo "$modename: you must specify an RM program" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+
+ rmdirs=
+
+ origobjdir="$objdir"
+ for file in $files; do
+ dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`
+ if test "X$dir" = "X$file"; then
+ dir=.
+ objdir="$origobjdir"
+ else
+ objdir="$dir/$origobjdir"
+ fi
+ name=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
+ test "$mode" = uninstall && objdir="$dir"
+
+ # Remember objdir for removal later, being careful to avoid duplicates
+ if test "$mode" = clean; then
+ case " $rmdirs " in
+ *" $objdir "*) ;;
+ *) rmdirs="$rmdirs $objdir" ;;
+ 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 (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ . $dir/$name
+
+ # Delete the libtool libraries and symlinks.
+ for n in $library_names; do
+ rmfiles="$rmfiles $objdir/$n"
+ done
+ test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library"
+
+ case "$mode" in
+ clean)
+ case " $library_names " in
+ # " " in the beginning catches empty $dlname
+ *" $dlname "*) ;;
+ *) rmfiles="$rmfiles $objdir/$dlname" ;;
+ esac
+ test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i"
+ ;;
+ uninstall)
+ if test -n "$library_names"; then
+ # Do each command in the postuninstall commands.
+ cmds=$postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+
+ if test -n "$old_library"; then
+ # Do each command in the old_postuninstall commands.
+ cmds=$old_postuninstall_cmds
+ save_ifs="$IFS"; IFS='~'
+ for cmd in $cmds; do
+ IFS="$save_ifs"
+ eval cmd=\"$cmd\"
+ $show "$cmd"
+ $run eval "$cmd"
+ if test "$?" -ne 0 && test "$rmforce" != yes; then
+ exit_status=1
+ fi
+ done
+ IFS="$save_ifs"
+ fi
+ # FIXME: should reinstall the best remaining shared library.
+ ;;
+ esac
+ fi
+ ;;
+
+ *.lo)
+ # Possibly a libtool object, so verify it.
+ if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+
+ # Read the .lo file
+ . $dir/$name
+
+ # Add PIC object to the list of files to remove.
+ if test -n "$pic_object" \
+ && test "$pic_object" != none; then
+ rmfiles="$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
+ rmfiles="$rmfiles $dir/$non_pic_object"
+ fi
+ fi
+ ;;
+
+ *)
+ if test "$mode" = clean ; then
+ noexename=$name
+ case $file in
+ *.exe)
+ file=`$echo $file|${SED} 's,.exe$,,'`
+ noexename=`$echo $name|${SED} 's,.exe$,,'`
+ # $file with .exe has already been added to rmfiles,
+ # add $file without .exe
+ rmfiles="$rmfiles $file"
+ ;;
+ esac
+ # Do a test to see if this is a libtool program.
+ if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
+ relink_command=
+ . $dir/$noexename
+
+ # note $name still contains .exe if it was in $file originally
+ # as does the version of $file that was added into $rmfiles
+ rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}"
+ if test "$fast_install" = yes && test -n "$relink_command"; then
+ rmfiles="$rmfiles $objdir/lt-$name"
+ fi
+ if test "X$noexename" != "X$name" ; then
+ rmfiles="$rmfiles $objdir/lt-${noexename}.c"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ $show "$rm $rmfiles"
+ $run $rm $rmfiles || exit_status=1
+ done
+ objdir="$origobjdir"
+
+ # Try to remove the ${objdir}s in the directories where we deleted files
+ for dir in $rmdirs; do
+ if test -d "$dir"; then
+ $show "rmdir $dir"
+ $run rmdir $dir >/dev/null 2>&1
+ fi
+ done
+
+ exit $exit_status
+ ;;
+
+ "")
+ $echo "$modename: you must specify a MODE" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+ esac
+
+ if test -z "$exec_cmd"; then
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$generic_help" 1>&2
+ exit $EXIT_FAILURE
+ fi
+fi # test -z "$show_help"
+
+if test -n "$exec_cmd"; then
+ eval exec $exec_cmd
+ exit $EXIT_FAILURE
+fi
+
+# We need to display help for each of the modes.
+case $mode in
+"") $echo \
+"Usage: $modename [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
+ --finish same as \`--mode=finish'
+ --help display this help message and exit
+ --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS]
+ --quiet same as \`--silent'
+ --silent don't print informational messages
+ --tag=TAG use configuration variables from tag TAG
+ --version print version information
+
+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. Try \`$modename --help --mode=MODE' for
+a more detailed description of MODE.
+
+Report bugs to <bug-libtool at gnu.org>."
+ exit $EXIT_SUCCESS
+ ;;
+
+clean)
+ $echo \
+"Usage: $modename [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: $modename [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
+ -prefer-pic try to building PIC objects only
+ -prefer-non-pic try to building non-PIC objects only
+ -static always build a \`.o' file suitable for static linking
+
+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: $modename [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: $modename [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: $modename [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 rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+ ;;
+
+link)
+ $echo \
+"Usage: $modename [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
+ -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
+ -static do not do any dynamic linking of libtool libraries
+ -version-info CURRENT[:REVISION[:AGE]]
+ specify library version info [each variable defaults to 0]
+
+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: $modename [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."
+ ;;
+
+*)
+ $echo "$modename: invalid operation mode \`$mode'" 1>&2
+ $echo "$help" 1>&2
+ exit $EXIT_FAILURE
+ ;;
+esac
+
+$echo
+$echo "Try \`$modename --help' for more information about other modes."
+
+exit $?
+
+# 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
+disable_libs=shared
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+disable_libs=static
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
diff --git a/m4/Makefile.am b/m4/Makefile.am
new file mode 100644
index 0000000..e2d31c7
--- /dev/null
+++ b/m4/Makefile.am
@@ -0,0 +1,44 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = ppl.m4
+
+# M4 macro files for internal use.
+m4macros = \
+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_flexible_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_long_double_binary_format.m4 \
+lib-ld.m4 \
+lib-link.m4 \
+lib-prefix.m4
+
+EXTRA_DIST = $(m4macros) $(m4data_DATA)
+
diff --git a/m4/Makefile.in b/m4/Makefile.in
new file mode 100644
index 0000000..d43e7d6
--- /dev/null
+++ b/m4/Makefile.in
@@ -0,0 +1,488 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+SOURCES =
+DIST_SOURCES =
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(m4datadir)"
+m4dataDATA_INSTALL = $(INSTALL_DATA)
+DATA = $(m4data_DATA)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+
+# M4 macro files to be used by the client applications with Autoconf.
+m4datadir = $(datadir)/aclocal
+m4data_DATA = ppl.m4
+
+# M4 macro files for internal use.
+m4macros = \
+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_flexible_arrays.m4 \
+ac_cxx_float_binary_format.m4 \
+ac_cxx_long_double_binary_format.m4 \
+lib-ld.m4 \
+lib-link.m4 \
+lib-prefix.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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign m4/Makefile'; \
+ 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
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-m4dataDATA: $(m4data_DATA)
+ @$(NORMAL_INSTALL)
+ test -z "$(m4datadir)" || $(mkdir_p) "$(DESTDIR)$(m4datadir)"
+ @list='$(m4data_DATA)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(m4dataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4datadir)/$$f'"; \
+ $(m4dataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4datadir)/$$f"; \
+ done
+
+uninstall-m4dataDATA:
+ @$(NORMAL_UNINSTALL)
+ @list='$(m4data_DATA)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(m4datadir)/$$f'"; \
+ rm -f "$(DESTDIR)$(m4datadir)/$$f"; \
+ done
+tags: TAGS
+TAGS:
+
+ctags: CTAGS
+CTAGS:
+
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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 distclean-libtool
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-m4dataDATA
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am uninstall-m4dataDATA
+
+.PHONY: all all-am check check-am clean clean-generic clean-libtool \
+ distclean distclean-generic distclean-libtool distdir dvi \
+ dvi-am html html-am info info-am install install-am \
+ install-data install-data-am install-exec install-exec-am \
+ install-info install-info-am install-m4dataDATA install-man \
+ install-strip installcheck installcheck-am installdirs \
+ maintainer-clean maintainer-clean-generic mostlyclean \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ uninstall uninstall-am uninstall-info-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_fpu_control.m4 b/m4/ac_check_fpu_control.m4
new file mode 100644
index 0000000..a658429
--- /dev/null
+++ b/m4/ac_check_fpu_control.m4
@@ -0,0 +1,51 @@
+dnl A function to check for the possibility to control the FPU.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_FPU_CONTROL],
+[
+AC_LANG_PUSH(C++)
+AC_CHECK_HEADERS([fenv.h ieeefp.h])
+AC_MSG_CHECKING([for the possibility to control the FPU])
+AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+int
+main() {
+#if i386
+#elif defined(HAVE_FENV_H)
+#elif sparc && defined( HAVE_IEEEFP_H)
+#else
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cv_can_control_fpu=1,
+ AC_MSG_RESULT(no)
+ ac_cv_can_control_fpu=0
+),
+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.])
+AC_LANG_POP(C++)
+])
diff --git a/m4/ac_check_gmp.m4 b/m4/ac_check_gmp.m4
new file mode 100644
index 0000000..3b4c9b6
--- /dev/null
+++ b/m4/ac_check_gmp.m4
@@ -0,0 +1,127 @@
+dnl A function to check for the existence and usability of GMP.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_GMP],
+[
+dnl Since libgmp and libgmpxx are usually installed in the same location,
+dnl let the prefixes default from each other.
+if test -n "$with_libgmpxx_prefix" && test -z "$with_libgmp_prefix"; then
+ with_libgmp_prefix="$with_libgmpxx_prefix"
+else
+ if test -n "$with_libgmp_prefix" && test -z "$with_libgmpxx_prefix"; then
+ with_libgmpxx_prefix="$with_libgmp_prefix"
+ fi
+fi
+
+dnl Check how to link with libgmp.
+AC_LIB_LINKFLAGS([gmp])
+
+dnl Check how to link with libgmpxx.
+AC_LIB_LINKFLAGS([gmpxx], [gmp])
+
+ac_save_LIBS="$LIBS"
+LIBS="$LIBS $LIBGMPXX"
+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>
+
+#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)
+#error "GMP version 4.1.3 or higher is required"
+#endif
+
+int main() {
+ 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_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 <gmp.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(no)
+ ac_cv_gmp_supports_exceptions=no)
+
+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(GMP_SUPPORTS_EXCEPTIONS, $value,
+ [Not zero if GMP has been compiled with support for exceptions.])
+
+fi
+
+AC_LANG_POP(C++)
+LIBS="$ac_save_LIBS"
+
+dnl We use libtool, therefore we take $LTLIBGMPXX, not $LIBGMPXX.
+gmp_library_option="$LTLIBGMPXX"
+])
diff --git a/m4/ac_check_sicstus_prolog.m4 b/m4/ac_check_sicstus_prolog.m4
new file mode 100644
index 0000000..52b8e9d
--- /dev/null
+++ b/m4/ac_check_sicstus_prolog.m4
@@ -0,0 +1,62 @@
+dnl A function to check for the existence and usability of SICStus Prolog.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_SICSTUS_PROLOG],
+[
+AC_PATH_PROG(sicstus_prolog, sicstus)
+if test x$sicstus_prolog != x
+then
+ dnl The following would fail to find the real base `sicstus'
+ dnl is a symbolic link.
+ dnl sicstus_prolog_base=$(dirname $(dirname $sicstus_prolog))
+ sicstus_prolog_base=$(dirname $($sicstus_prolog -f --goal "use_module(library(system)), environ('SP_APP_DIR', X), write(X), nl, halt."))
+ 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..3d03256
--- /dev/null
+++ b/m4/ac_check_swi_prolog.m4
@@ -0,0 +1,79 @@
+dnl A function to check for the existence and usability of SWI-Prolog.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CHECK_SWI_PROLOG],
+[
+dnl By default, SWI-Prolog is installed as `pl', though some administrators
+dnl call it `swipl' or `swi-prolog'. In particular, on Mac OS X `pl' is
+dnl the name of another program.
+AC_PATH_PROG(swi_prolog, swi-prolog)
+if test -z $swi_prolog
+then
+ AC_PATH_PROG(swi_prolog, swipl)
+ if test -z $swi_prolog
+ then
+ AC_PATH_PROG(swi_prolog, pl)
+ fi
+fi
+if test x$swi_prolog != x
+then
+ swi_prolog_base=`$swi_prolog -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`
+ swi_prolog_version=`$swi_prolog -dump-runtime-variables | grep PLVERSION= | sed 's/PLVERSION="\(.*\)";/\1/'`
+
+ dnl Additional version checks could be inserted here, if necessary.
+
+ SWI_PROLOG_INCLUDE_OPTIONS="-I${swi_prolog_base}/include"
+ 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(
+[#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"
+ AC_SUBST(SWI_PROLOG_INCLUDE_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..2e552b1
--- /dev/null
+++ b/m4/ac_check_xsb_prolog.m4
@@ -0,0 +1,49 @@
+dnl A function to check for the existence and usability of XSB Prolog.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+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_cxx_attribute_weak.m4 b/m4/ac_cxx_attribute_weak.m4
new file mode 100644
index 0000000..7f950c5
--- /dev/null
+++ b/m4/ac_cxx_attribute_weak.m4
@@ -0,0 +1,58 @@
+dnl A function to check whether the C++ compiler supports the function
+dnl __attribute__ ((weak)).
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+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(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..5e3c271
--- /dev/null
+++ b/m4/ac_cxx_double_binary_format.m4
@@ -0,0 +1,100 @@
+dnl A function to detect the binary format used by C++ doubles.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_DOUBLE_BINARY_FORMAT],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ doubles])
+ac_cxx_double_binary_format=unknown
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647e-103
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_DOUBLE != 8
+]])],
+ AC_DEFINE(CXX_DOUBLE_BINARY_FORMAT, float_ieee754_double,
+ [The binary format of C++ doubles, if supported; undefined otherwise.])
+ ac_cxx_double_binary_format="IEEE754 Double Precision")
+
+AC_MSG_RESULT($ac_cxx_double_binary_format)
+
+if test x"$ac_cxx_double_binary_format" = x"unknown"
+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_flexible_arrays.m4 b/m4/ac_cxx_flexible_arrays.m4
new file mode 100644
index 0000000..283303f
--- /dev/null
+++ b/m4/ac_cxx_flexible_arrays.m4
@@ -0,0 +1,95 @@
+dnl A function to check whether the C++ compiler supports flexible arrays.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_SUPPORTS_FLEXIBLE_ARRAYS],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([whether the C++ compiler supports flexible arrays])
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <new>
+#include <cstddef>
+#include <cstdlib>
+
+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;
+ exit(0);
+}
+]])],
+ AC_MSG_RESULT(yes)
+ ac_cxx_supports_flexible_arrays=yes,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_flexible_arrays=no,
+ AC_MSG_RESULT(no)
+ ac_cxx_supports_flexible_arrays=no)
+
+if test x"$ac_cxx_supports_flexible_arrays" = xyes
+then
+ value=1
+else
+ value=0
+fi
+AC_DEFINE_UNQUOTED(CXX_SUPPORTS_FLEXIBLE_ARRAYS, $value,
+ [Not zero if the C++ compiler supports flexible arrays.])
+
+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..45edd33
--- /dev/null
+++ b/m4/ac_cxx_float_binary_format.m4
@@ -0,0 +1,91 @@
+dnl A function to detect the binary format used by C++ floats.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+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_cxx_float_binary_format=unknown
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<float>::is_iec559
+ && (convert(0xaaacccaaUL)
+ == -3.069535185924732179074680971098132431507110595703125e-13
+ && convert(0xcccaaaccUL)
+ == -106255968)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_FLOAT != 4
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_FLOAT != 4
+]])],
+ AC_DEFINE(CXX_FLOAT_BINARY_FORMAT, float_ieee754_single,
+ [The binary format of C++ floats, if supported; undefined otherwise.])
+ ac_cxx_float_binary_format="IEEE754 Single Precision")
+
+AC_MSG_RESULT($ac_cxx_float_binary_format)
+
+if test x"$ac_cxx_float_binary_format" = x"unknown"
+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_long_double_binary_format.m4 b/m4/ac_cxx_long_double_binary_format.m4
new file mode 100644
index 0000000..d0a846b
--- /dev/null
+++ b/m4/ac_cxx_long_double_binary_format.m4
@@ -0,0 +1,272 @@
+dnl A function to detect the binary format used by C++ long doubles.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+AC_DEFUN([AC_CXX_LONG_DOUBLE_BINARY_FORMAT],
+[
+ac_save_CPPFLAGS="$CPPFLAGS"
+ac_save_LIBS="$LIBS"
+AC_LANG_PUSH(C++)
+
+AC_MSG_CHECKING([the binary format of C++ long doubles])
+ac_cxx_long_double_binary_format=unknown
+
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacccaaacccULL)
+ == -2347515119623533044836098728848844802360499059743792266553789449931714103027083147350004052130909778252174381128110073162061230391014115892328306480775581568464385654456454167018199800371311459509865035007576337091690846028483890278748770302000164922066968427857731908531920447109369397262198780877931467490364866823668872333299978555289484532591724489792080483029098529153534398647750864910040989348665150713407129673962368698401443396580325986886785546510945722073165626067034971013793 [...]
+ && convert(0xcccaaaccUL, 0xcaaacccaaacccaaaULL)
+ == -3.2343499084336735697883624337582367014013792003863104780702304912017160945762080887330922093527110817635309731394394027547210062178890319023095669053441067666970505933558514051896941259661008015375938113204938505791529386797054658707886845235185418061587914083787185969361328546834255817542052425946141924658766401026284322468976745836497454676411392342071395848101018687729153124540755822652406871842792438612173516670599208782361645064732617977033939815107992280307781523996574 [...]
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 12
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 12
+]])],
+ AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_intel_double_extended,
+ [The binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="Intel Double-Extended")
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+then
+AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <limits>
+#ifdef HAVE_STDINT_H
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -8.5585565388510043474134185399390263e-1644L
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -1.245145811075115522107964569349668e+986L)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+ AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_ieee754_quad,
+ [The binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="IEEE754 Quad Precision")
+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
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaacccaaacULL, 0xccaaacccaaacccaaULL)
+ == -7.604854094366020338337599887587800202175513745285694296699118737579061822543271195468213752945697068626341230960061791319756014599393179237494607606117559455091592495531339152856677735299681614113855047309039978381765251689655330467878879653297684753038610775075912700489795099693753075187209767515639593721823446001374821995460346508811516182804821576375433157503444723668976504567458418892711612877008293336291456723718701753008252854005800263180027419214648596175836662547627167 [...]
+ && convert(0xcccaaacccaaacccaULL, 0xaacccaaacccaaaccULL)
+ == -99658331877181425640389193712445288804009112642407197633229907048864350192381814628233384153539524368748305269642704450459572458913058829202094408933558533552137589226430537671503754737153845553845646099179512540696038707395491223325946106007770844660381340028079827237033670900446083793353682761885084154898636897779677124010119288945740273072415898996441722571487815052387317025675191665761918119006431828756780493604546658949166486641354783002536071366287780290680620995991797 [...]
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 16
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 16
+]])],
+ AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_intel_double_extended,
+ [The binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="Intel Double-Extended")
+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
+#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() {
+ return std::numeric_limits<long double>::is_iec559
+ && (convert(0xaaacccaaUL, 0xacccaaacUL)
+ == -4.018242396032647e-103
+ && convert(0xcccaaaccUL, 0xcaaacccaUL)
+ == -85705035845709846787631445265530356117787053916987832397725696.0)
+ ? 0 : 1;
+}
+
+#else // SIZEOF_LONG_DOUBLE != 8
+
+int
+main() {
+ return 1;
+}
+
+#endif // SIZEOF_LONG_DOUBLE != 8
+]])],
+ AC_DEFINE(CXX_LONG_DOUBLE_BINARY_FORMAT, float_ieee754_double,
+ [The binary format of C++ long doubles, if supported; undefined otherwise.])
+ ac_cxx_long_double_binary_format="IEEE754 Double Precision")
+fi
+
+AC_MSG_RESULT($ac_cxx_long_double_binary_format)
+
+if test x"$ac_cxx_long_double_binary_format" = x"unknown"
+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_text_md5sum.m4 b/m4/ac_text_md5sum.m4
new file mode 100644
index 0000000..15b8cdf
--- /dev/null
+++ b/m4/ac_text_md5sum.m4
@@ -0,0 +1,37 @@
+dnl A function to set the command for computing the MD5 checksum of text files.
+dnl Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+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/lib-ld.m4 b/m4/lib-ld.m4
new file mode 100644
index 0000000..96c4e2c
--- /dev/null
+++ b/m4/lib-ld.m4
@@ -0,0 +1,110 @@
+# lib-ld.m4 serial 3 (gettext-0.13)
+dnl Copyright (C) 1996-2003 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.
+
+dnl Subroutines of libtool.m4,
+dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision
+dnl with libtool.m4.
+
+dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no.
+AC_DEFUN([AC_LIB_PROG_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU ld's only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ acl_cv_prog_gnu_ld=yes ;;
+*)
+ acl_cv_prog_gnu_ld=no ;;
+esac])
+with_gnu_ld=$acl_cv_prog_gnu_ld
+])
+
+dnl From libtool-1.4. Sets the variable LD.
+AC_DEFUN([AC_LIB_PROG_LD],
+[AC_ARG_WITH(gnu-ld,
+[ --with-gnu-ld assume the C compiler uses GNU ld [default=no]],
+test "$withval" = no || with_gnu_ld=yes, with_gnu_ld=no)
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# Prepare PATH_SEPARATOR.
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+ echo "#! /bin/sh" >conf$$.sh
+ echo "exit 0" >>conf$$.sh
+ chmod +x conf$$.sh
+ if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
+ PATH_SEPARATOR=';'
+ else
+ PATH_SEPARATOR=:
+ fi
+ rm -f conf$$.sh
+fi
+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 GCC])
+ 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.
+ [[\\/]* | [A-Za-z]:[\\/]*)]
+ [re_direlt='/[^/][^/]*/\.\./']
+ # Canonicalize the path 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(acl_cv_path_LD,
+[if test -z "$LD"; then
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
+ for ac_dir in $PATH; do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ acl_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some GNU ld's only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$acl_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="$ac_save_ifs"
+else
+ acl_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$acl_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])
+AC_LIB_PROG_LD_GNU
+])
diff --git a/m4/lib-link.m4 b/m4/lib-link.m4
new file mode 100644
index 0000000..ea0b0c4
--- /dev/null
+++ b/m4/lib-link.m4
@@ -0,0 +1,553 @@
+# lib-link.m4 serial 6 (gettext-0.14.3)
+dnl Copyright (C) 2001-2005 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.
+
+dnl From Bruno Haible.
+
+AC_PREREQ(2.50)
+
+dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and
+dnl augments the CPPFLAGS variable.
+AC_DEFUN([AC_LIB_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+ ac_cv_lib[]Name[]_libs="$LIB[]NAME"
+ ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME"
+ ac_cv_lib[]Name[]_cppflags="$INC[]NAME"
+ ])
+ LIB[]NAME="$ac_cv_lib[]Name[]_libs"
+ LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs"
+ INC[]NAME="$ac_cv_lib[]Name[]_cppflags"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the
+ dnl results of this search when this library appears as a dependency.
+ HAVE_LIB[]NAME=yes
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode)
+dnl searches for libname and the libraries corresponding to explicit and
+dnl implicit dependencies, together with the specified include files and
+dnl the ability to compile and link the specified testcode. If found, it
+dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and
+dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and
+dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs
+dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty.
+AC_DEFUN([AC_LIB_HAVE_LINKFLAGS],
+[
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ AC_REQUIRE([AC_LIB_RPATH])
+ define([Name],[translit([$1],[./-], [___])])
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+
+ dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME
+ dnl accordingly.
+ AC_LIB_LINKFLAGS_BODY([$1], [$2])
+
+ dnl Add $INC[]NAME to CPPFLAGS before performing the following checks,
+ dnl because if the user has installed lib[]Name and not disabled its use
+ dnl via --without-lib[]Name-prefix, he wants to use it.
+ ac_save_CPPFLAGS="$CPPFLAGS"
+ AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME)
+
+ AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [
+ ac_save_LIBS="$LIBS"
+ LIBS="$LIBS $LIB[]NAME"
+ AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no])
+ LIBS="$ac_save_LIBS"
+ ])
+ if test "$ac_cv_lib[]Name" = yes; then
+ HAVE_LIB[]NAME=yes
+ AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.])
+ AC_MSG_CHECKING([how to link with lib[]$1])
+ AC_MSG_RESULT([$LIB[]NAME])
+ else
+ HAVE_LIB[]NAME=no
+ dnl If $LIB[]NAME didn't lead to a usable library, we don't need
+ dnl $INC[]NAME either.
+ CPPFLAGS="$ac_save_CPPFLAGS"
+ LIB[]NAME=
+ LTLIB[]NAME=
+ fi
+ AC_SUBST([HAVE_LIB]NAME)
+ AC_SUBST([LIB]NAME)
+ AC_SUBST([LTLIB]NAME)
+ undefine([Name])
+ undefine([NAME])
+])
+
+dnl Determine the platform dependent parameters needed to use rpath:
+dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator,
+dnl hardcode_direct, hardcode_minus_L.
+AC_DEFUN([AC_LIB_RPATH],
+[
+ dnl Tell automake >= 1.10 to complain if config.rpath is missing.
+ m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([config.rpath])])
+ AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS
+ AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld
+ AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host
+ AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir
+ AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [
+ CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
+ ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
+ . ./conftest.sh
+ rm -f ./conftest.sh
+ acl_cv_rpath=done
+ ])
+ wl="$acl_cv_wl"
+ libext="$acl_cv_libext"
+ shlibext="$acl_cv_shlibext"
+ hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
+ hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
+ hardcode_direct="$acl_cv_hardcode_direct"
+ hardcode_minus_L="$acl_cv_hardcode_minus_L"
+ dnl Determine whether the user wants rpath handling at all.
+ AC_ARG_ENABLE(rpath,
+ [ --disable-rpath do not hardcode runtime library paths],
+ :, enable_rpath=yes)
+])
+
+dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and
+dnl the libraries corresponding to explicit and implicit dependencies.
+dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables.
+AC_DEFUN([AC_LIB_LINKFLAGS_BODY],
+[
+ define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-],
+ [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib$1-prefix],
+[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib
+ --without-lib$1-prefix don't search for lib$1 in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ dnl Search the library and its dependencies in $additional_libdir and
+ dnl $LDFLAGS. Using breadth-first-seach.
+ LIB[]NAME=
+ LTLIB[]NAME=
+ INC[]NAME=
+ rpathdirs=
+ ltrpathdirs=
+ names_already_handled=
+ names_next_round='$1 $2'
+ while test -n "$names_next_round"; do
+ names_this_round="$names_next_round"
+ names_next_round=
+ for name in $names_this_round; do
+ already_handled=
+ for n in $names_already_handled; do
+ if test "$n" = "$name"; then
+ already_handled=yes
+ break
+ fi
+ done
+ if test -z "$already_handled"; then
+ names_already_handled="$names_already_handled $name"
+ dnl See if it was already located by an earlier AC_LIB_LINKFLAGS
+ dnl or AC_LIB_HAVE_LINKFLAGS call.
+ uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
+ eval value=\"\$HAVE_LIB$uppername\"
+ if test -n "$value"; then
+ if test "$value" = yes; then
+ eval value=\"\$LIB$uppername\"
+ test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value"
+ eval value=\"\$LTLIB$uppername\"
+ test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value"
+ else
+ dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined
+ dnl that this library doesn't exist. So just drop it.
+ :
+ fi
+ else
+ dnl Search the library lib$name in $additional_libdir and $LDFLAGS
+ dnl and the already constructed $LIBNAME/$LTLIBNAME.
+ found_dir=
+ found_la=
+ found_so=
+ found_a=
+ if test $use_additional = yes; then
+ if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then
+ found_dir="$additional_libdir"
+ found_so="$additional_libdir/lib$name.$shlibext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ else
+ if test -f "$additional_libdir/lib$name.$libext"; then
+ found_dir="$additional_libdir"
+ found_a="$additional_libdir/lib$name.$libext"
+ if test -f "$additional_libdir/lib$name.la"; then
+ found_la="$additional_libdir/lib$name.la"
+ fi
+ fi
+ fi
+ fi
+ if test "X$found_dir" = "X"; then
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ case "$x" in
+ -L*)
+ dir=`echo "X$x" | sed -e 's/^X-L//'`
+ if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then
+ found_dir="$dir"
+ found_so="$dir/lib$name.$shlibext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ else
+ if test -f "$dir/lib$name.$libext"; then
+ found_dir="$dir"
+ found_a="$dir/lib$name.$libext"
+ if test -f "$dir/lib$name.la"; then
+ found_la="$dir/lib$name.la"
+ fi
+ fi
+ fi
+ ;;
+ esac
+ if test "X$found_dir" != "X"; then
+ break
+ fi
+ done
+ fi
+ if test "X$found_dir" != "X"; then
+ dnl Found the library.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name"
+ if test "X$found_so" != "X"; then
+ dnl Linking with a shared library. We attempt to hardcode its
+ dnl directory into the executable's runpath, unless it's the
+ dnl standard /usr/lib.
+ if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then
+ dnl No hardcoding is needed.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $found_dir"
+ fi
+ dnl The hardcoding into $LIBNAME is system dependent.
+ if test "$hardcode_direct" = yes; then
+ dnl Using DIR/libNAME.so during linking hardcodes DIR into the
+ dnl resulting binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then
+ dnl Use an explicit option to hardcode DIR into the resulting
+ dnl binary.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $found_dir"
+ fi
+ else
+ dnl Rely on "-L$found_dir".
+ dnl But don't add it if it's already contained in the LDFLAGS
+ dnl or the already constructed $LIBNAME
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$found_dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir"
+ fi
+ if test "$hardcode_minus_L" != no; then
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so"
+ else
+ dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH
+ dnl here, because this doesn't fit in flags passed to the
+ dnl compiler. So give up. No hardcoding. This affects only
+ dnl very old systems.
+ dnl FIXME: Not sure whether we should use
+ dnl "-L$found_dir -l$name" or "-L$found_dir $found_so"
+ dnl here.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ fi
+ else
+ if test "X$found_a" != "X"; then
+ dnl Linking with a static library.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a"
+ else
+ dnl We shouldn't come here, but anyway it's good to have a
+ dnl fallback.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name"
+ fi
+ fi
+ dnl Assume the include files are nearby.
+ additional_includedir=
+ case "$found_dir" in
+ */lib | */lib/)
+ basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'`
+ additional_includedir="$basedir/include"
+ ;;
+ esac
+ if test "X$additional_includedir" != "X"; then
+ dnl Potentially add $additional_includedir to $INCNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 3. if it's already present in $CPPFLAGS or the already
+ dnl constructed $INCNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ for x in $CPPFLAGS $INC[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $INCNAME.
+ INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ fi
+ dnl Look for dependencies.
+ if test -n "$found_la"; then
+ dnl Read the .la file. It defines the variables
+ dnl dlname, library_names, old_library, dependency_libs, current,
+ dnl age, revision, installed, dlopen, dlpreopen, libdir.
+ save_libdir="$libdir"
+ case "$found_la" in
+ */* | *\\*) . "$found_la" ;;
+ *) . "./$found_la" ;;
+ esac
+ libdir="$save_libdir"
+ dnl We use only dependency_libs.
+ for dep in $dependency_libs; do
+ case "$dep" in
+ -L*)
+ additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
+ dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 3. if it's already present in $LDFLAGS or the already
+ dnl constructed $LIBNAME,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ haveit=
+ for x in $LDFLAGS $LIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LIBNAME.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ haveit=
+ for x in $LDFLAGS $LTLIB[]NAME; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LTLIBNAME.
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ ;;
+ -R*)
+ dir=`echo "X$dep" | sed -e 's/^X-R//'`
+ if test "$enable_rpath" != no; then
+ dnl Potentially add DIR to rpathdirs.
+ dnl The rpathdirs will be appended to $LIBNAME at the end.
+ haveit=
+ for x in $rpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ rpathdirs="$rpathdirs $dir"
+ fi
+ dnl Potentially add DIR to ltrpathdirs.
+ dnl The ltrpathdirs will be appended to $LTLIBNAME at the end.
+ haveit=
+ for x in $ltrpathdirs; do
+ if test "X$x" = "X$dir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ ltrpathdirs="$ltrpathdirs $dir"
+ fi
+ fi
+ ;;
+ -l*)
+ dnl Handle this in the next round.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
+ ;;
+ *.la)
+ dnl Handle this in the next round. Throw away the .la's
+ dnl directory; it is already contained in a preceding -L
+ dnl option.
+ names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
+ ;;
+ *)
+ dnl Most likely an immediate library name.
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep"
+ ;;
+ esac
+ done
+ fi
+ else
+ dnl Didn't find the library; assume it is in the system directories
+ dnl known to the linker and runtime loader. (All the system
+ dnl directories known to the linker should also be known to the
+ dnl runtime loader, otherwise the system is severely misconfigured.)
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name"
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name"
+ fi
+ fi
+ fi
+ done
+ done
+ if test "X$rpathdirs" != "X"; then
+ if test -n "$hardcode_libdir_separator"; then
+ dnl Weird platform: only the last -rpath option counts, the user must
+ dnl pass all path elements in one option. We can arrange that for a
+ dnl single library, but not when more than one $LIBNAMEs are used.
+ alldirs=
+ for found_dir in $rpathdirs; do
+ alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir"
+ done
+ dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl.
+ acl_save_libdir="$libdir"
+ libdir="$alldirs"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ else
+ dnl The -rpath options are cumulative.
+ for found_dir in $rpathdirs; do
+ acl_save_libdir="$libdir"
+ libdir="$found_dir"
+ eval flag=\"$hardcode_libdir_flag_spec\"
+ libdir="$acl_save_libdir"
+ LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag"
+ done
+ fi
+ fi
+ if test "X$ltrpathdirs" != "X"; then
+ dnl When using libtool, the option that works for both libraries and
+ dnl executables is -R. The -R options are cumulative.
+ for found_dir in $ltrpathdirs; do
+ LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir"
+ done
+ fi
+])
+
+dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR,
+dnl unless already present in VAR.
+dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes
+dnl contains two or three consecutive elements that belong together.
+AC_DEFUN([AC_LIB_APPENDTOVAR],
+[
+ for element in [$2]; do
+ haveit=
+ for x in $[$1]; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X$element"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ [$1]="${[$1]}${[$1]:+ }$element"
+ fi
+ done
+])
diff --git a/m4/lib-prefix.m4 b/m4/lib-prefix.m4
new file mode 100644
index 0000000..0d895ca
--- /dev/null
+++ b/m4/lib-prefix.m4
@@ -0,0 +1,153 @@
+# lib-prefix.m4 serial 4 (gettext-0.14.2)
+dnl Copyright (C) 2001-2005 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.
+
+dnl From Bruno Haible.
+
+dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and
+dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't
+dnl require excessive bracketing.
+ifdef([AC_HELP_STRING],
+[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])],
+[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])])
+
+dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed
+dnl to access previously installed libraries. The basic assumption is that
+dnl a user will want packages to use other packages he previously installed
+dnl with the same --prefix option.
+dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate
+dnl libraries, but is otherwise very convenient.
+AC_DEFUN([AC_LIB_PREFIX],
+[
+ AC_BEFORE([$0], [AC_LIB_LINKFLAGS])
+ AC_REQUIRE([AC_PROG_CC])
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
+ dnl By default, look in $includedir and $libdir.
+ use_additional=yes
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ AC_LIB_ARG_WITH([lib-prefix],
+[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib
+ --without-lib-prefix don't search for libraries in includedir and libdir],
+[
+ if test "X$withval" = "Xno"; then
+ use_additional=no
+ else
+ if test "X$withval" = "X"; then
+ AC_LIB_WITH_FINAL_PREFIX([
+ eval additional_includedir=\"$includedir\"
+ eval additional_libdir=\"$libdir\"
+ ])
+ else
+ additional_includedir="$withval/include"
+ additional_libdir="$withval/lib"
+ fi
+ fi
+])
+ if test $use_additional = yes; then
+ dnl Potentially add $additional_includedir to $CPPFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/include,
+ dnl 2. if it's already present in $CPPFLAGS,
+ dnl 3. if it's /usr/local/include and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_includedir" != "X/usr/include"; then
+ haveit=
+ for x in $CPPFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-I$additional_includedir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_includedir" = "X/usr/local/include"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux* | gnu* | k*bsd*-gnu) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_includedir"; then
+ dnl Really add $additional_includedir to $CPPFLAGS.
+ CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir"
+ fi
+ fi
+ fi
+ fi
+ dnl Potentially add $additional_libdir to $LDFLAGS.
+ dnl But don't add it
+ dnl 1. if it's the standard /usr/lib,
+ dnl 2. if it's already present in $LDFLAGS,
+ dnl 3. if it's /usr/local/lib and we are using GCC on Linux,
+ dnl 4. if it doesn't exist as a directory.
+ if test "X$additional_libdir" != "X/usr/lib"; then
+ haveit=
+ for x in $LDFLAGS; do
+ AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"])
+ if test "X$x" = "X-L$additional_libdir"; then
+ haveit=yes
+ break
+ fi
+ done
+ if test -z "$haveit"; then
+ if test "X$additional_libdir" = "X/usr/local/lib"; then
+ if test -n "$GCC"; then
+ case $host_os in
+ linux*) haveit=yes;;
+ esac
+ fi
+ fi
+ if test -z "$haveit"; then
+ if test -d "$additional_libdir"; then
+ dnl Really add $additional_libdir to $LDFLAGS.
+ LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir"
+ fi
+ fi
+ fi
+ fi
+ fi
+])
+
+dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix,
+dnl acl_final_exec_prefix, containing the values to which $prefix and
+dnl $exec_prefix will expand at the end of the configure script.
+AC_DEFUN([AC_LIB_PREPARE_PREFIX],
+[
+ dnl Unfortunately, prefix and exec_prefix get only finally determined
+ dnl at the end of configure.
+ if test "X$prefix" = "XNONE"; then
+ acl_final_prefix="$ac_default_prefix"
+ else
+ acl_final_prefix="$prefix"
+ fi
+ if test "X$exec_prefix" = "XNONE"; then
+ acl_final_exec_prefix='${prefix}'
+ else
+ acl_final_exec_prefix="$exec_prefix"
+ fi
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
+ prefix="$acl_save_prefix"
+])
+
+dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the
+dnl variables prefix and exec_prefix bound to the values they will have
+dnl at the end of the configure script.
+AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX],
+[
+ acl_save_prefix="$prefix"
+ prefix="$acl_final_prefix"
+ acl_save_exec_prefix="$exec_prefix"
+ exec_prefix="$acl_final_exec_prefix"
+ $1
+ exec_prefix="$acl_save_exec_prefix"
+ prefix="$acl_save_prefix"
+])
diff --git a/m4/ppl.m4 b/m4/ppl.m4
new file mode 100644
index 0000000..4df7534
--- /dev/null
+++ b/m4/ppl.m4
@@ -0,0 +1,280 @@
+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) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+dnl Copyright (C) 1997 Owen Taylor
+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 2 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://www.cs.unipr.it/ppl/ .
+dnl
+
+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.)
+
+ 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;
+ exit(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;
+ 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;
+ 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;
+ exit(1);
+ }
+ }
+ return 0;
+}
+],, no_ppl=yes,[echo $ac_n "cross compiling; assumed OK... $ac_c"])
+ 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"
+ 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..d84fac8
--- /dev/null
+++ b/missing
@@ -0,0 +1,359 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2005-06-08.21
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+# Originally 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, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# 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
+
+run=:
+
+# In the cases where this matters, `missing' is being run in the
+# srcdir already.
+if test -f configure.ac; then
+ configure_ac=configure.ac
+else
+ configure_ac=configure.in
+fi
+
+msg="missing on your system"
+
+case "$1" in
+--run)
+ # Try to run requested program, and just exit if it succeeds.
+ run=
+ shift
+ "$@" && exit 0
+ # Exit code 63 means version mismatch. This often happens
+ # when the user try to use an ancient version of a tool on
+ # a file that requires a minimum version. In this case we
+ # we should proceed has if the program had been absent, or
+ # if --run hadn't been passed.
+ if test $? = 63; then
+ run=:
+ msg="probably too old"
+ fi
+ ;;
+
+ -h|--h|--he|--hel|--help)
+ echo "\
+$0 [OPTION]... PROGRAM [ARGUMENT]...
+
+Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
+error status if there is no known handling for PROGRAM.
+
+Options:
+ -h, --help display this help and exit
+ -v, --version output version information and exit
+ --run try to run the given command, and emulate it if it fails
+
+Supported PROGRAM values:
+ aclocal touch file \`aclocal.m4'
+ autoconf touch file \`configure'
+ autoheader touch file \`config.h.in'
+ automake touch all \`Makefile.in' files
+ bison create \`y.tab.[ch]', if possible, from existing .[ch]
+ flex create \`lex.yy.c', if possible, from existing .c
+ help2man touch the output file
+ lex create \`lex.yy.c', if possible, from existing .c
+ makeinfo touch the output file
+ tar try tar, gnutar, gtar, then tar without non-portable flags
+ yacc create \`y.tab.[ch]', if possible, from existing .[ch]
+
+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
+
+# Now exit if we have it, but it failed. Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).
+case "$1" in
+ lex|yacc)
+ # Not GNU programs, they don't have --version.
+ ;;
+
+ tar)
+ if test -n "$run"; then
+ echo 1>&2 "ERROR: \`tar' requires --run"
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ exit 1
+ fi
+ ;;
+
+ *)
+ if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+ # We have it, but it failed.
+ exit 1
+ elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+ # Could not run --version or --help. This is probably someone
+ # running `$TOOL --version' or `$TOOL --help' to check whether
+ # $TOOL exists and not knowing $TOOL uses missing.
+ exit 1
+ fi
+ ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case "$1" in
+ aclocal*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acinclude.m4' or \`${configure_ac}'. You might want
+ to install the \`Automake' and \`Perl' packages. Grab them from
+ any GNU archive site."
+ touch aclocal.m4
+ ;;
+
+ autoconf)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`${configure_ac}'. You might want to install the
+ \`Autoconf' and \`GNU m4' packages. Grab them from any GNU
+ archive site."
+ touch configure
+ ;;
+
+ autoheader)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`acconfig.h' or \`${configure_ac}'. You might want
+ to install the \`Autoconf' and \`GNU m4' packages. Grab them
+ from any GNU archive site."
+ files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
+ test -z "$files" && files="config.h"
+ touch_files=
+ for f in $files; do
+ case "$f" in
+ *:*) touch_files="$touch_files "`echo "$f" |
+ sed -e 's/^[^:]*://' -e 's/:.*//'`;;
+ *) touch_files="$touch_files $f.in";;
+ esac
+ done
+ touch $touch_files
+ ;;
+
+ automake*)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
+ You might want to install the \`Automake' and \`Perl' packages.
+ Grab them from any GNU archive site."
+ find . -type f -name Makefile.am -print |
+ sed 's/\.am$/.in/' |
+ while read f; do touch "$f"; done
+ ;;
+
+ autom4te)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them.
+ You can get \`$1' as part of \`Autoconf' from any GNU
+ archive site."
+
+ file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
+ test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
+ if test -f "$file"; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo "#! /bin/sh"
+ echo "# Created by GNU Automake missing as a replacement of"
+ echo "# $ $@"
+ echo "exit 0"
+ chmod +x $file
+ exit 1
+ fi
+ ;;
+
+ bison|yacc)
+ echo 1>&2 "\
+WARNING: \`$1' $msg. You should only need it if
+ you modified a \`.y' file. You may need the \`Bison' package
+ in order for those modifications to take effect. You can get
+ \`Bison' from any GNU archive site."
+ rm -f y.tab.c y.tab.h
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.y)
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.c
+ fi
+ SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" y.tab.h
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f y.tab.h ]; then
+ echo >y.tab.h
+ fi
+ if [ ! -f y.tab.c ]; then
+ echo 'main() { return 0; }' >y.tab.c
+ fi
+ ;;
+
+ lex|flex)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.l' file. You may need the \`Flex' package
+ in order for those modifications to take effect. You can get
+ \`Flex' from any GNU archive site."
+ rm -f lex.yy.c
+ if [ $# -ne 1 ]; then
+ eval LASTARG="\${$#}"
+ case "$LASTARG" in
+ *.l)
+ SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+ if [ -f "$SRCFILE" ]; then
+ cp "$SRCFILE" lex.yy.c
+ fi
+ ;;
+ esac
+ fi
+ if [ ! -f lex.yy.c ]; then
+ echo 'main() { return 0; }' >lex.yy.c
+ fi
+ ;;
+
+ help2man)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a dependency of a manual page. You may need the
+ \`Help2man' package in order for those modifications to take
+ effect. You can get \`Help2man' from any GNU archive site."
+
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
+ fi
+ if [ -f "$file" ]; then
+ touch $file
+ else
+ test -z "$file" || exec >$file
+ echo ".ab help2man is required to generate this page"
+ exit 1
+ fi
+ ;;
+
+ makeinfo)
+ echo 1>&2 "\
+WARNING: \`$1' is $msg. You should only need it if
+ you modified a \`.texi' or \`.texinfo' file, or any other file
+ indirectly affecting the aspect of the manual. The spurious
+ call might also be the consequence of using a buggy \`make' (AIX,
+ DU, IRIX). You might want to install the \`Texinfo' package or
+ the \`GNU make' package. Grab either from any GNU archive site."
+ # The file to touch is that specified with -o ...
+ file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
+ if test -z "$file"; then
+ # ... or it is the one specified with @setfilename ...
+ infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+ file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
+ # ... or it is derived from the source name (dir/f.texi becomes f.info)
+ test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+ fi
+ # If the file does not exist, the user really needs makeinfo;
+ # let's fail without touching anything.
+ test -f $file || exit 1
+ touch $file
+ ;;
+
+ tar)
+ shift
+
+ # We have already tried tar in the generic part.
+ # Look for gnutar/gtar before invocation to avoid ugly error
+ # messages.
+ if (gnutar --version > /dev/null 2>&1); then
+ gnutar "$@" && exit 0
+ fi
+ if (gtar --version > /dev/null 2>&1); then
+ gtar "$@" && exit 0
+ fi
+ firstarg="$1"
+ if shift; then
+ case "$firstarg" in
+ *o*)
+ firstarg=`echo "$firstarg" | sed s/o//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ case "$firstarg" in
+ *h*)
+ firstarg=`echo "$firstarg" | sed s/h//`
+ tar "$firstarg" "$@" && exit 0
+ ;;
+ esac
+ fi
+
+ echo 1>&2 "\
+WARNING: I can't seem to be able to run \`tar' with the given arguments.
+ You may want to install GNU tar or Free paxutils, or check the
+ command line arguments."
+ exit 1
+ ;;
+
+ *)
+ echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+ You might have modified some files without having the
+ proper tools for further handling them. Check the \`README' file,
+ it often tells you about the needed prerequisites for installing
+ this package. You may also peek at any GNU archive site, in case
+ some other package would contain this missing \`$1' program."
+ exit 1
+ ;;
+esac
+
+exit 0
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-end: "$"
+# End:
diff --git a/mkinstalldirs b/mkinstalldirs
new file mode 100755
index 0000000..259dbfc
--- /dev/null
+++ b/mkinstalldirs
@@ -0,0 +1,158 @@
+#! /bin/sh
+# mkinstalldirs --- make directory hierarchy
+
+scriptversion=2005-06-29.22
+
+# 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>.
+
+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-end: "$"
+# End:
diff --git a/ppl.lsm.in b/ppl.lsm.in
new file mode 100644
index 0000000..0dd2e43
--- /dev/null
+++ b/ppl.lsm.in
@@ -0,0 +1,31 @@
+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
+Author: Roberto Bagnara (bagnara at cs.unipr.it)
+ Patricia M. Hill (hill at comp.leeds.ac.uk)
+ Enea Zaffanella (zaffanella at cs.unipr.it)
+ Abramo Bagnara (Opera Unica)
+ Andrea Cimino (University of Parma)
+ Giordano Fracasso (University of Parma)
+ Elena Mazzi (University of Parma)
+ Matthew Mundell (University of Leeds)
+ Barbara Quartieri (University of Parma)
+ Elisa Ricci (former student of the University of Parma)
+ Sara Bonini (former student of the University of Parma)
+ Andrea Pescetti (former student of the University of Parma)
+ Angela Stazzone (former student of the University of Parma)
+ 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
+ 5850k ppl- at VERSION@.tar.gz
+ 800 ppl.lsm
+Alternate-site:
+Original-site: http://www.cs.unipr.it/ppl/
+Platforms: Portable; tested on Linux, FreeBSD, OpenBSD, Solaris,
+ IRIX64, Mac OS X, Cygwin, DEC OSF/1.
+Copying-policy: GPL
+End
diff --git a/ppl.spec.in b/ppl.spec.in
new file mode 100644
index 0000000..f8b2db6
--- /dev/null
+++ b/ppl.spec.in
@@ -0,0 +1,185 @@
+%define name ppl
+%define version @VERSION@
+%define release 1
+%define builddir $RPM_BUILD_DIR/%{name}-%{version}
+
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Vendor: ppl-devel at cs.unipr.it
+Packager: %{packager}
+URL: http://www.cs.unipr.it/ppl/
+Source: ftp://ftp.cs.unipr.it/pub/ppl/releases/%{version}/%{name}-%{version}.tar.gz
+#Patch:
+Group: Development/Libraries
+License: GPL v2
+#Icon:
+Requires: gmp >= 4.1.3, gcc-c++ >= 4.0.2
+BuildRoot: %{_tmppath}/%{name}-%{version}
+Prefix: /usr
+Summary: The Parma Polyhedra Library: a C++ library for numerical abstractions.
+%description
+The Parma Polyhedra Library (PPL) is a C++ library for the
+manipulation of (not necessarily closed) convex polyhedra and other
+numerical abstractions. The applications of convex polyhedra include
+program analysis, optimized compilation, integer and combinatorial
+optimization and statistical data-editing. 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++, exception-safe,
+rather efficient, thoroughly documented, and free software.
+
+%package c
+Summary: The C interface of the Parma Polyhedra Library
+Group: Development/Libraries
+Requires: ppl = %{version}-%{release}
+%description c
+This package adds C support to the Parma Polyhedra Library (PPL).
+Install this package if you want to access the PPL via C.
+
+%package gprolog
+Summary: The GNU Prolog interface of the Parma Polyhedra Library.
+Group: Development/Libraries
+Requires: ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description gprolog
+This package adds GNU Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in GNU Prolog programs.
+
+%package sicstus
+Summary: The SICStus Prolog interface of the Parma Polyhedra Library.
+Group: Development/Libraries
+Requires: ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description sicstus
+This package adds SICStus Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in SICStus Prolog programs.
+
+%package swi
+Summary: The SWI Prolog interface of the Parma Polyhedra Library.
+Group: Development/Libraries
+Requires: ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description swi
+This package adds SWI Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in SWI Prolog programs.
+
+%package yap
+Summary: The YAP Prolog interface of the Parma Polyhedra Library.
+Group: Development/Libraries
+Requires: ppl = %{version}-%{release}, ppl-pwl = %{version}-%{release}
+%description yap
+This package adds YAP Prolog support to the Parma Polyhedra Library (PPL).
+Install this package if you want to use the library in YAP Prolog programs.
+
+%package pwl
+Summary: The Parma Watchdog Library: a C++ library for watchdog timers.
+Group: Development/Libraries
+Requires: gcc-c++ >= 4.0.2
+%description pwl
+This package contains the Parma Watchdog Library (PWL).
+The library provides support for multiple, concurrent watchdog timers
+on systems providing setitimer(2).
+The PWL is currently distributed with the Parma Polyhedra Library (PPL),
+but is totally independent from it.
+
+%prep
+%setup -n %{name}-%{version}
+#%patch -p1
+
+%build
+CXXFLAGS="$RPM_OPT_FLAGS" ./configure --enable-shared \
+ --prefix=%{_prefix} --bindir=%{_bindir} --mandir=%{_mandir} \
+ --localstatedir=%{_localstatedir} --libdir=%{_libdir} \
+ --datadir=%{_datadir} --includedir=%{_includedir} \
+ --sysconfdir=%{_sysconfdir}
+make
+
+%install
+if [ -d $RPM_BUILD_ROOT ]
+then
+ rm -rf $RPM_BUILD_ROOT
+fi
+mkdir -p $RPM_BUILD_ROOT
+make prefix=$RPM_BUILD_ROOT%{_prefix} bindir=$RPM_BUILD_ROOT%{_bindir} \
+ mandir=$RPM_BUILD_ROOT%{_mandir} libdir=$RPM_BUILD_ROOT%{_libdir} \
+ localstatedir=$RPM_BUILD_ROOT%{_localstatedir} \
+ datadir=$RPM_BUILD_ROOT%{_datadir} \
+ includedir=$RPM_BUILD_ROOT%{_includedir} \
+ sysconfdir=$RPM_BUILD_ROOT%{_sysconfdir} install
+
+
+%files
+%defattr(-,root,root)
+%doc BUGS COPYING CREDITS ChangeLog NEWS README README.configure doc/README.doc doc/*.pdf* doc/*.ps.gz doc/*.txt
+%{_includedir}/ppl.hh
+%{_bindir}/ppl-config
+%{_bindir}/ppl_lcdd
+%{_bindir}/ppl_lpsol
+%{_libdir}/libppl.so.*
+%{_libdir}/libppl.so
+%{_libdir}/libppl.a
+%{_libdir}/libppl.la
+%{_mandir}/man1/ppl-config.1.gz
+%{_mandir}/man1/ppl_lcdd.1.gz
+%{_mandir}/man1/ppl_lpsol.1.gz
+
+
+%files c
+%defattr(-,root,root)
+%{_includedir}/ppl_c.h
+%{_libdir}/libppl_c.a
+%{_libdir}/libppl_c.la
+%{_libdir}/libppl_c.so*
+
+%files gprolog
+%defattr(-,root,root)
+%{_bindir}/ppl_gprolog
+%{_libdir}/ppl/ppl_gprolog.pl
+%{_libdir}/ppl/libppl_gprolog.a
+%{_libdir}/ppl/libppl_gprolog.la
+%{_libdir}/ppl/libppl_gprolog.so
+
+%files sicstus
+%defattr(-,root,root)
+# Uncomment the following line if you want to create an RPM containing
+# a version of SICStus statically linked with the PPL.
+#%{_bindir}/ppl_sicstus
+%{_libdir}/ppl/ppl_sicstus.s.o
+%{_libdir}/ppl/ppl_sicstus.so
+%{_libdir}/ppl/ppl_sicstus.pl
+
+%files swi
+%defattr(-,root,root)
+%{_bindir}/ppl_pl
+%{_libdir}/ppl/libppl_swiprolog.a
+%{_libdir}/ppl/libppl_swiprolog.la
+%{_libdir}/ppl/libppl_swiprolog.so
+
+%files yap
+%defattr(-,root,root)
+%{_libdir}/ppl/ppl_yap.a
+%{_libdir}/ppl/ppl_yap.la
+%{_libdir}/ppl/ppl_yap.pl
+%{_libdir}/ppl/ppl_yap.so
+
+%files pwl
+%defattr(-,root,root)
+%doc Watchdog/README
+%{_includedir}/pwl.hh
+%{_libdir}/libpwl.so.*
+%{_libdir}/libpwl.so
+%{_libdir}/libpwl.a
+%{_libdir}/libpwl.la
+
+%post
+/sbin/ldconfig
+
+%postun
+/sbin/ldconfig
+
+%post c
+/sbin/ldconfig
+
+%postun c
+/sbin/ldconfig
+
+%clean
+rm -rf $RPM_BUILD_ROOT
diff --git a/src/BDS_Status.idefs.hh b/src/BDS_Status.idefs.hh
new file mode 100644
index 0000000..6a27232
--- /dev/null
+++ b/src/BDS_Status.idefs.hh
@@ -0,0 +1,116 @@
+/* BD_Shape<T>::Status class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Status_defs_hh
+#define PPL_BD_Status_defs_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-dimension
+ 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 \ref ascii_dump)
+ 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_BD_Status_defs_hh)
diff --git a/src/BDS_Status.inlines.hh b/src/BDS_Status.inlines.hh
new file mode 100644
index 0000000..930d783
--- /dev/null
+++ b/src/BDS_Status.inlines.hh
@@ -0,0 +1,266 @@
+/* BD_Shape<T>::Status class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Status_inlines_hh
+#define PPL_BD_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;
+}
+
+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() {
+ 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 sep = ' ';
+
+/*! \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 << sep
+ << (test_empty() ? yes : no) << empty << sep
+ << sep
+ << (test_shortest_path_closed() ? yes : no) << sp_closed << sep
+ << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep;
+}
+
+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;
+ 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 for well-formedness.
+ assert(OK());
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_BD_Status_inlines_hh)
diff --git a/src/BD_Shape.cc b/src/BD_Shape.cc
new file mode 100644
index 0000000..3f63f58
--- /dev/null
+++ b/src/BD_Shape.cc
@@ -0,0 +1,96 @@
+/* BD_Shape class implementation: non-inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool
+PPL::extract_bounded_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) {
+ // Check for preconditions.
+ assert(c.space_dimension() == c_space_dim);
+ assert(c_num_vars == 0 && c_first_var == 0 && c_second_var == 0);
+ // Store the indices of the non-zero components of `c',
+ dimension_type non_zero_index[2] = { 0, 0 };
+ // Collect the non-zero components of `c'.
+ for (dimension_type i = c_space_dim; i-- > 0; )
+ if (c.coefficient(Variable(i)) != 0)
+ if (c_num_vars <= 1)
+ non_zero_index[c_num_vars++] = i + 1;
+ else
+ // Constraint `c' is not a bounded difference.
+ return false;
+
+ // Make sure that `c' is indeed a bounded difference,
+ // i.e., it has one of the following forms:
+ // 0 <=/= b, if c_num_vars == 0;
+ // a*x <=/= b, if c_num_vars == 1;
+ // a*x - a*y <=/= b, if c_num_vars == 2.
+ switch (c_num_vars) {
+ case 2:
+ {
+ const Coefficient& c0 = c.coefficient(Variable(non_zero_index[0]-1));
+ const Coefficient& c1 = c.coefficient(Variable(non_zero_index[1]-1));
+ if (sgn(c0) == sgn(c1) || c0 != -c1)
+ // Constraint `c' is not a bounded difference.
+ return false;
+ c_coeff = c1;
+ }
+ c_first_var = non_zero_index[0];
+ c_second_var = non_zero_index[1];
+ break;
+ case 1:
+ c_coeff = -c.coefficient(Variable(non_zero_index[0]-1));
+ c_first_var = non_zero_index[0];
+ break;
+ default:
+ assert(c_num_vars == 0);
+ break;
+ }
+ return true;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // 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.
+ assert(indices.size() == 0);
+ assert(0 == predecessor[0]);
+ indices.push_back(0);
+ for (dimension_type i = 1, iend = predecessor.size(); i != iend; ++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..f93735d
--- /dev/null
+++ b/src/BD_Shape.defs.hh
@@ -0,0 +1,1342 @@
+/* BD_Shape class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 "Linear_Expression.types.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Poly_Con_Relation.types.hh"
+#include "Poly_Gen_Relation.types.hh"
+#include "Polyhedron.types.hh"
+#include "Variable.defs.hh"
+#include "DB_Matrix.defs.hh"
+#include "DB_Row.defs.hh"
+#include "Checked_Number.defs.hh"
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+#include <deque>
+
+
+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
+
+//! 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 aren't 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
+ Checked_Number<To, Extended_Number_Policy>.
+*/
+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,
+ const 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
+ Checked_Number<Temp, Extended_Number_Policy>.
+*/
+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);
+
+//! 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,
+ const 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
+ Checked_Number<To, Extended_Number_Policy>.
+*/
+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,
+ const 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
+ Checked_Number<Temp, Extended_Number_Policy>.
+*/
+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,
+ const 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,
+ const 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
+ Checked_Number<To, Extended_Number_Policy>.
+*/
+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,
+ const 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
+ Checked_Number<Temp, Extended_Number_Policy>.
+*/
+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,
+ const 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,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as a bounded difference.
+/*!
+ \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_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.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool extract_bounded_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);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+#endif // 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. At the
+ interface level, bounded differences are specified using objects of
+ type Constraint: such a constraint is a bounded difference if it is
+ of 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 Constraint object will be mapped
+ into a <EM>correct</EM> approximation that, depending on the expressive
+ power of the chosen template argument \p T, may loose some precision.
+ In particular, constraint objects that do not encode a bounded difference
+ will be simply (and safely) ignored.
+
+ 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, a Constraint object encoding \f$3x - y \leq 1\f$
+ will be safely ignored in all of the above cases.
+
+ 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 considered, the following code
+ will build the same BDS as above (i.e., the constraints 7, 8, and 9
+ are ignored):
+ \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.
+ */
+ typedef Checked_Number<T, Extended_Number_Policy> N;
+
+public:
+ //! The numeric base type upon which bounded differences are built.
+ typedef T base_type;
+
+ /*! \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();
+
+ //! \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.
+ BD_Shape(const BD_Shape& y);
+
+ //! Builds a conservative, upward approximation of \p y.
+ template <typename U>
+ explicit BD_Shape(const BD_Shape<U>& y);
+
+ //! Builds a BDS from the system of constraints \p cs.
+ /*!
+ The BDS inherits the space dimension of \p cs.
+
+ \param cs
+ A system of constraints: constraints that are not
+ \ref Bounded_Difference_Shapes "bounded differences"
+ are ignored (even though they may have contributed
+ to the space dimension).
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints \p cs contains strict inequalities.
+ */
+ BD_Shape(const Constraint_System& cs);
+
+ //! 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.
+ */
+ 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.
+ */
+ BD_Shape(const Polyhedron& ph, 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 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 <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 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
+ or if \p c is a strict inequality or if \p c is not a bounded
+ difference constraint.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) 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;
+
+ /*! \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. If it is not a bounded difference, it
+ will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or if \p c is a strict inequality.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of bounded differences
+ defining \p *this.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param c
+ The constraint to be added. If it is not a bounded difference, it
+ will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or if \p c is a strict inequality.
+ */
+ bool add_constraint_and_minimize(const Constraint& c);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of bounded differences
+ defining \p *this.
+
+ \param cs
+ The constraints that will be added. Constraints that are not bounded
+ differences will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or if \p cs contains a strict inequality.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of bounded differences
+ defining \p *this.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraints that will be added. Constraints that are not bounded
+ differences will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or if \p cs contains a strict inequality.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ //! 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);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool intersection_assign_and_minimize(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BDS containing the convex union
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void bds_hull_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BDS containing the convex union
+ of \p *this and \p y.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool bds_hull_assign_and_minimize(const BD_Shape& y);
+
+ //! Same as bds_hull_assign.
+ void upper_bound_assign(const BD_Shape& y);
+
+ /*! \brief
+ If the bds-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 bds_hull_assign_if_exact(const BD_Shape& y);
+
+ //! Same as bds_hull_assign_if_exact.
+ bool upper_bound_assign_if_exact(const BD_Shape& 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 dimension-incompatible.
+ */
+ void bds_difference_assign(const BD_Shape& y);
+
+ //! Same as bds_difference_assign.
+ void difference_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());
+
+ /*! \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 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
+ 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>descreasing</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);
+
+ /*! \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
+ Seeing a BDS 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 BDSs
+ corresponding, on entry, to \p *this and \p y, respectively.
+ Upon successful completion, \p *this will represent the BDS
+ \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 BD_Shape& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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 class PartialFunction 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 PartialFunction>
+ void map_space_dimensions(const PartialFunction& pfunc);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+ and sets \p *this accordingly. Returns <CODE>true</CODE> if successful,
+ <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+ friend bool Parma_Polyhedra_Library::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;
+
+ //! 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 of Booleans indicating which constraints are redundant.
+ std::vector<std::deque<bool> > redundancy_dbm;
+
+ //! 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();
+
+ //! 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;
+
+ //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j, N k);
+ //! Adds the constraint <CODE>dbm[i][j] \<= num/den</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j,
+ Coefficient_traits::const_reference num,
+ Coefficient_traits::const_reference den);
+
+ //! 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 pos_sum 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_den</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_den,
+ const N& pos_sum);
+
+ //! 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 neg_sum 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_den</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_den,
+ const N& neg_sum);
+
+ /*! \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;
+
+#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<<>(std::ostream& s,
+ const BD_Shape<T>& c);
+#else
+ // This is too lax than wanted.
+ template <typename U>
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const BD_Shape<U>& c);
+#endif
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const BD_Shape& x) 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 Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* name_row,
+ const Linear_Expression& y) const;
+
+ static void throw_constraint_incompatible(const char* method);
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& e);
+
+ static void throw_generic(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+void swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+ Parma_Polyhedra_Library::BD_Shape<T>& y);
+
+} // namespace std
+
+#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..ee435d1
--- /dev/null
+++ b/src/BD_Shape.inlines.hh
@@ -0,0 +1,711 @@
+/* BD_Shape class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Shape_inlines_hh
+#define PPL_BD_Shape_inlines_hh 1
+
+#include "C_Polyhedron.defs.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include <cassert>
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+namespace BD_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+numer_denom(const Checked_Number<T, Policy>& from,
+ Coefficient& num, Coefficient& den) {
+ assert(!is_not_a_number(from)
+ && !is_minus_infinity(from)
+ && !is_plus_infinity(from));
+ mpq_class q;
+ assign_r(q, from, ROUND_NOT_NEEDED);
+ num = q.get_num();
+ den = q.get_den();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+div_round_up(Checked_Number<T, Policy>& to,
+ Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y) {
+ mpq_class qx;
+ mpq_class qy;
+ // Note: this code assumes that a Coefficient is always convertible
+ // to an mpq_class without loss of precision.
+ assign_r(qx, x, ROUND_NOT_NEEDED);
+ assign_r(qy, y, ROUND_NOT_NEEDED);
+ div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
+ assign_r(to, qx, ROUND_UP);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+ if (x > y)
+ x = y;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+ if (x < y)
+ x = y;
+}
+
+} // namespace BD_Shapes
+} // namespace Implementation
+
+
+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_empty() const {
+ return status.test_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+ status.set_empty();
+ assert(OK());
+ assert(marked_empty());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+}
+
+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
+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.
+ status.set_shortest_path_closed();
+ }
+ assert(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y)
+ : 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)
+ : dbm(y.dbm), status(), redundancy_dbm() {
+ // TODO: handle flags properly, possibly taking special cases into account.
+ if (y.marked_empty())
+ set_empty();
+ else if (y.status.test_zero_dim_univ())
+ set_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
+ add_constraint(c);
+ shortest_path_closure_assign();
+ return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i)
+ add_constraint(*i);
+ assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraints_and_minimize(const Constraint_System& cs) {
+ add_constraints(cs);
+ shortest_path_closure_assign();
+ return !marked_empty();
+}
+
+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.
+ status.set_shortest_path_closed();
+ add_constraints(cs);
+ assert(OK());
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::affine_dimension() const {
+ const dimension_type space_dim = space_dimension();
+
+ // 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>
+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>::swap(BD_Shape& y) {
+ std::swap(dbm, y.dbm);
+ std::swap(status, y.status);
+ std::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
+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;
+}
+
+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
+ r = PLUS_INFINITY;
+ 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
+ r = PLUS_INFINITY;
+ 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) {
+ static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+ static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+ static Checked_Number<Temp, Extended_Number_Policy> 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
+ r = PLUS_INFINITY;
+ 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
+ r = PLUS_INFINITY;
+ 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) {
+ static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+ static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+ static Checked_Number<Temp, Extended_Number_Policy> 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
+ r = PLUS_INFINITY;
+ 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
+ r = PLUS_INFINITY;
+ 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) {
+ static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+ static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+ static Checked_Number<Temp, Extended_Number_Policy> 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,
+ N k) {
+ // Private method: the caller has to ensure the following.
+ 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())
+ status.reset_shortest_path_closed();
+ }
+ assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+ const dimension_type j,
+ Coefficient_traits::const_reference num,
+ Coefficient_traits::const_reference den) {
+ // Private method: the caller has to ensure the following.
+ assert(i <= space_dimension() && j <= space_dimension() && i != j);
+ assert(den != 0);
+ N k;
+ Implementation::BD_Shapes::div_round_up(k, num, den);
+ add_dbm_constraint(i, j, k);
+}
+
+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>::bds_hull_assign_and_minimize(const BD_Shape& y) {
+ bds_hull_assign(y);
+ assert(marked_empty()
+ || space_dimension() == 0 || marked_shortest_path_closed());
+ return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+ bds_hull_assign(y);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) {
+ // TODO: this must be properly implemented.
+ return false;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+ return bds_hull_assign_if_exact(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+ bds_difference_assign(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::remove_higher_space_dimensions(const dimension_type new_dim) {
+ // Dimension-compatibility check: the variable having
+ // maximum index is the one occurring last in the set.
+ if (new_dim > space_dimension())
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dim);
+
+ // 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_dim == space_dimension()) {
+ assert(OK());
+ return;
+ }
+
+ // Shortest-path closure is necessary as in remove_space_dimensions().
+ shortest_path_closure_assign();
+ dbm.resize_no_copy(new_dim + 1);
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether or not reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+
+ // If we removed _all_ dimensions from a non-empty BDS,
+ // the zero-dim universe BDS has been obtained.
+ if (new_dim == 0 && !marked_empty())
+ set_zero_dim_univ();
+ assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::intersection_assign_and_minimize(const BD_Shape& y) {
+ intersection_assign(y);
+ shortest_path_closure_assign();
+ return !marked_empty();
+}
+
+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) {
+ // See the documentation for polyhedra.
+ C_Polyhedron px(constraints());
+ C_Polyhedron py(y.constraints());
+ px.H79_widening_assign(py, tp);
+ BD_Shape x(px);
+ swap(x);
+ assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // See the documentation for polyhedra.
+ C_Polyhedron px(constraints());
+ C_Polyhedron py(y.constraints());
+ px.limited_H79_extrapolation_assign(py, cs, tp);
+ BD_Shape x(px);
+ swap(x);
+ assert(OK());
+}
+
+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);
+ // See the documentation for polyhedra.
+ C_Polyhedron px(constraints());
+ C_Polyhedron py(y.constraints());
+ px.time_elapse_assign(py);
+ BD_Shape x(px);
+ swap(x);
+ assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+ assert(0 < v && v <= dbm.num_rows());
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+ dbm_v[i] = PLUS_INFINITY;
+ dbm[i][v] = PLUS_INFINITY;
+ }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+ 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) {
+ dbm_v[i] = PLUS_INFINITY;
+ dbm[i][v] = PLUS_INFINITY;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+ Parma_Polyhedra_Library::BD_Shape<T>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#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..fb9e8ac
--- /dev/null
+++ b/src/BD_Shape.templates.hh
@@ -0,0 +1,3774 @@
+/* BD_Shape class implementation: non-inline template functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BD_Shape_templates_hh
+#define PPL_BD_Shape_templates_hh 1
+
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "LP_Problem.defs.hh"
+#include <cassert>
+#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 Generator_System& gs)
+ : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+ using Implementation::BD_Shapes::max_assign;
+ using Implementation::BD_Shapes::div_round_up;
+
+ 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();
+ assert(OK());
+ return;
+ }
+
+ const dimension_type space_dim = space_dimension();
+ DB_Row<N>& dbm_0 = dbm[0];
+ N tmp;
+
+ bool dbm_initialized = false;
+ bool point_seen = false;
+ // Going through all the points and closure points.
+ for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+ const Generator& g = *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();
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(Variable(i-1));
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (i != j)
+ div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
+ div_round_up(dbm_i[0], -g_i, d);
+ }
+ for (dimension_type j = space_dim; j > 0; --j)
+ div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), 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();
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(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) {
+ div_round_up(tmp, g.coefficient(Variable(j-1)) - 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) {
+ div_round_up(tmp, g.coefficient(Variable(j-1)), 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 std::invalid_argument("PPL::BD_Shape<T>::BD_Shape(gs):\n"
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines and rays.
+ for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+ const Generator& g = *i;
+ switch (g.type()) {
+ case Generator::LINE:
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(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.coefficient(Variable(j-1)))
+ dbm_i[j] = PLUS_INFINITY;
+ if (g_i != 0)
+ dbm_i[0] = PLUS_INFINITY;
+ }
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g.coefficient(Variable(j-1)) != 0)
+ dbm_0[j] = PLUS_INFINITY;
+ break;
+ case Generator::RAY:
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(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.coefficient(Variable(j-1)))
+ dbm_i[j] = PLUS_INFINITY;
+ if (g_i < 0)
+ dbm_i[0] = PLUS_INFINITY;
+ }
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g.coefficient(Variable(j-1)) > 0)
+ dbm_0[j] = PLUS_INFINITY;
+ break;
+ default:
+ // Points and closure points already dealt with.
+ break;
+ }
+ }
+ status.set_shortest_path_closed();
+ assert(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+ : dbm(), status(), redundancy_dbm() {
+ using Implementation::BD_Shapes::div_round_up;
+ const dimension_type num_dimensions = ph.space_dimension();
+
+ if (ph.marked_empty()) {
+ *this = BD_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ if (num_dimensions == 0) {
+ *this = BD_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 = BD_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.
+ 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(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(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) {
+ LP_Problem lp;
+ 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(),
+ iend = ph_cs.end(); i != iend; ++i) {
+ const Constraint& c = *i;
+ lp.add_constraint(c.is_equality()
+ ? (Linear_Expression(c) == 0)
+ : (Linear_Expression(c) >= 0));
+ }
+
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ *this = BD_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ // Get all the upper bounds.
+ LP_Problem_Status lp_status;
+ Generator g(point());
+ TEMP_INTEGER(num);
+ TEMP_INTEGER(den);
+ 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);
+ lp_status = lp.solve();
+ if (lp_status == UNBOUNDED_LP_PROBLEM)
+ dbm[0][i] = PLUS_INFINITY;
+ else {
+ assert(lp_status == OPTIMIZED_LP_PROBLEM);
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, num, den);
+ div_round_up(dbm[0][i], num, den);
+ }
+ // 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);
+ lp_status = lp.solve();
+ if (lp_status == UNBOUNDED_LP_PROBLEM)
+ dbm[j][i] = PLUS_INFINITY;
+ else {
+ assert(lp_status == OPTIMIZED_LP_PROBLEM);
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, num, den);
+ div_round_up(dbm[j][i], num, den);
+ }
+ }
+ // Evaluate optimal upper bound for `-x <= ub'.
+ lp.set_objective_function(-x);
+ lp_status = lp.solve();
+ if (lp_status == UNBOUNDED_LP_PROBLEM)
+ dbm[i][0] = PLUS_INFINITY;
+ else {
+ assert(lp_status == OPTIMIZED_LP_PROBLEM);
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, num, den);
+ div_round_up(dbm[i][0], num, den);
+ }
+ }
+ status.set_shortest_path_closed();
+ return;
+ }
+
+ // Extract easy-to-find bounds from constraints.
+ *this = BD_Shape(ph.con_sys);
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ 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);
+ // Strict inequalities are not allowed.
+ if (c.is_strict_inequality())
+ throw_constraint_incompatible("add_constraint(c)");
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ TEMP_INTEGER(coeff);
+ // Constraints that are not bounded differences are ignored.
+ if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+ return;
+
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint.
+ if (c.inhomogeneous_term() < 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.
+ N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+ if (coeff < 0)
+ coeff = -coeff;
+
+ bool changed = false;
+ // Compute the bound for `x', rounding towards plus infinity.
+ N d;
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ if (x > d) {
+ x = d;
+ changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Also compute the bound for `y', rounding towards plus infinity.
+ div_round_up(d, -c.inhomogeneous_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 system of bounded differences.
+ if (changed && marked_shortest_path_closed())
+ status.reset_shortest_path_closed();
+ 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 system of bounded differences,
+ // let `*this' become empty.
+ if (y_space_dim == 0 && y.marked_empty()) {
+ set_empty();
+ assert(OK());
+ 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);
+ 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())
+ status.reset_shortest_path_closed();
+ 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);
+
+ // The zero-dimensional universe shape contains any other
+ // dimension-compatible shape.
+ // The zero-dimensional empty shape only contains another
+ // zero-dimensional empty shape.
+ if (x_space_dim == 0) {
+ if (!marked_empty())
+ return true;
+ else
+ return y.marked_empty();
+ }
+
+ /*
+ The `y' system of bounded differences need be closed.
+ In fact if, for example, in `*this' we have the constraints:
+
+ x1 - x2 <= 1;
+ x1 <= 3;
+ x2 <= 2;
+
+ in `y' the constraints are:
+
+ x1 - x2 <= 0;
+ x2 <= 1;
+
+ without closure it returns "false", instead if we close `y' we have
+ the implicit constraint
+
+ x1 <= 1;
+
+ and so we obtain the right result "true".
+ */
+ y.shortest_path_closure_assign();
+
+ // An empty shape is contained in any other dimension-compatible shapes.
+ if (y.marked_empty())
+ return true;
+
+ // `*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_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 system of bounded differences 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>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+ assert(!marked_empty() && marked_shortest_path_closed());
+ 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 pred_size = dbm.num_rows();
+ // Initially, each variable is leader of its own zero-equivalence class.
+ predecessor.reserve(pred_size);
+ for (dimension_type i = 0; i < pred_size; ++i)
+ predecessor.push_back(i);
+ // Now compute actual predecessors.
+ for (dimension_type i = pred_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]) {
+ N negated_dbm_ji;
+ if (neg_assign_r(negated_dbm_ji, dbm[j][i], ROUND_NOT_NEEDED) == V_EQ
+ && negated_dbm_ji == 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 {
+ assert(!marked_empty() && marked_shortest_path_closed());
+ assert(leaders.size() == 0);
+ // Compute predecessor information.
+ compute_predecessors(leaders);
+ // Flatten the predecessor chains so as to obtain leaders.
+ assert(leaders[0] == 0);
+ for (dimension_type i = 1, iend = leaders.size(); i != iend; ++i) {
+ const dimension_type l_i = leaders[i];
+ assert(l_i <= i);
+ if (l_i != i) {
+ const dimension_type ll_i = leaders[l_i];
+ assert(ll_i == leaders[ll_i]);
+ leaders[i] = ll_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;
+
+ // 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;
+ const dimension_type x_space_dim = x_copy.space_dimension();
+ x_copy.shortest_path_closure_assign();
+ // If we just discovered emptyness, 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(x_space_dim + 1);
+
+ // We store the leader.
+ for (dimension_type i = x_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 < x_space_dim; ++i) {
+ const DB_Row<N>& xdbm_i = x_copy.dbm[i];
+ for (dimension_type j = i + 1; j <= x_space_dim; ++j) {
+ N negated_xdbm_ji;
+ if (neg_assign_r(negated_xdbm_ji, x_copy.dbm[j][i],
+ ROUND_NOT_NEEDED) == V_EQ
+ && negated_xdbm_ji == xdbm_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 systems of bounded differences, 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.
+ N c;
+ for (dimension_type k = 0; k <= x_space_dim; ++k)
+ if (leader[k] == k) {
+ const DB_Row<N>& x_k = x_copy.dbm[k];
+ for (dimension_type i = 0; i <= x_space_dim; ++i)
+ if (leader[i] == i) {
+ const DB_Row<N>& x_i = x_copy.dbm[i];
+ const std::deque<bool>& redundancy_i = redundancy_dbm[i];
+ const N& x_i_k = x_i[k];
+ for (dimension_type j = 0; j <= x_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(x_space_dim + 1);
+ for (dimension_type i = x_space_dim + 1; i-- > 0; )
+ var_conn[i] = x_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 no-leader with only another zero-equivalent one.
+ for (dimension_type i = 0; i <= x_space_dim; ++i) {
+ // It count with how many variables the selected variable is
+ // connected.
+ dimension_type t = 0;
+ dimension_type ld_i = leader[i];
+ // Case a: leader.
+ if (ld_i == i) {
+ for (dimension_type j = 0; j <= x_space_dim; ++j) {
+ dimension_type ld_j = leader[j];
+ // Only the connectedness with equivalent variables
+ // is considered.
+ if (j != ld_j)
+ if (!redundancy_dbm[i][j]) {
+ if (t == 1)
+ // Two no-leaders couldn't connected with the same leader.
+ return false;
+ else
+ if (ld_j != i)
+ // The variables isn't in the same equivalence class.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ }
+ }
+ // Case b: no-leader.
+ else {
+ for (dimension_type j = 0; j <= x_space_dim; ++j) {
+ if (!redundancy_dbm[i][j]) {
+ dimension_type ld_j = leader[j];
+ if (ld_i != ld_j)
+ // The variables isn't in the same equivalence class.
+ return false;
+ else {
+ if (t == 1)
+ // Two variables couldn't connected with the same leader.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ // A no-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(x_space_dim + 1);
+ for (dimension_type i = x_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 <= x_space_dim; ++i) {
+ bool jc_i = just_checked[i];
+ // We do not re-check the already considered single cycles.
+ if (!jc_i) {
+ dimension_type v_con = var_conn[i];
+ // We consider only the equivalence classes with
+ // 2 or plus variables.
+ if (v_con != x_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>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+ using Implementation::BD_Shapes::div_round_up;
+
+ 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;
+ TEMP_INTEGER(coeff);
+ // Constraints that are not bounded differences are not compatible.
+ if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+ throw_constraint_incompatible("relation_with(c)");
+
+ 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:
+ 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 N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+ if (coeff < 0)
+ coeff = -coeff;
+ N d;
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ N d1;
+ div_round_up(d1, -c.inhomogeneous_term(), coeff);
+
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ if (d == x && d1 == y)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else if (d < y && d1 > x)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case Constraint::NONSTRICT_INEQUALITY:
+ if (d >= x && d1 >= y)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else if (d >= x)
+ return Poly_Con_Relation::is_included();
+ else if (d < x && d1 > y)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case Constraint::STRICT_INEQUALITY:
+ if (d >= x && d1 >= y)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else if (d > x)
+ return Poly_Con_Relation::is_included();
+ else if (d <= x && d1 >= y)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ // Quiet a compiler warning: this program point is unreachable.
+ throw std::runtime_error("PPL internal error");
+}
+
+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);
+
+ // The empty bdiff cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe BD shape 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();
+
+ // The relation between the bdiff and the given generator is obtained
+ // checking if the generator satisfies all the constraints in the bdiff.
+ // 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 bdiff.
+
+ // We find in `*this' all the constraints.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ for (dimension_type j = i + 1; j <= space_dim; ++j) {
+ const Variable x(j - 1);
+ const bool x_dimension_incompatible = x.space_dimension() > g_space_dim;
+ const N& dbm_ij = dbm[i][j];
+ const N& dbm_ji = dbm[j][i];
+ N negated_dbm_ji;
+ const bool is_equality
+ = neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+ && negated_dbm_ji == dbm_ij;
+ const bool dbm_ij_is_infinity = is_plus_infinity(dbm_ij);
+ const bool dbm_ji_is_infinity = is_plus_infinity(dbm_ji);
+ if (i != 0) {
+ const Variable y(i - 1);
+ const bool y_dimension_incompatible
+ = y.space_dimension() > g_space_dim;
+ const bool is_trivial_zero
+ = (x_dimension_incompatible && g.coefficient(y) == 0)
+ || (y_dimension_incompatible && g.coefficient(x) == 0)
+ || (x_dimension_incompatible && y_dimension_incompatible);
+ if (is_equality) {
+ // We have one equality constraint.
+ // The constraint has form ax - ay = b.
+ // The scalar product has the form
+ // 'a * y_i - a * x_j'
+ // where y_i = g.coefficient(y) and x_j = g.coefficient(x).
+ // It is not zero when both the coefficients of the
+ // variables x and y are not zero or when these coefficients
+ if (!is_trivial_zero && g.coefficient(x) != g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // We have the binary inequality constraints.
+ if (!dbm_ij_is_infinity) {
+ // The constraint has form ax - ay <= b.
+ // The scalar product has the form
+ // 'a * y_i - a * x_j'
+ if (is_line
+ && !is_trivial_zero
+ && g.coefficient(x) != g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ else
+ if (g.coefficient(y) < g.coefficient(x))
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (!dbm_ji_is_infinity) {
+ // The constraint has form ay - ax <= b.
+ // The scalar product has the form
+ // 'a * x_j - a* y_i'.
+ if (is_line
+ && !is_trivial_zero
+ && g.coefficient(x) != g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ else if (g.coefficient(x) < g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ else {
+ // Here i == 0.
+ if (is_equality) {
+ // The constraint has form ax = b.
+ // To satisfy the constraint it's necessary that the scalar product
+ // is not zero.It happens when the coefficient of the variable 'x'
+ // in the generator is not zero, because the scalar
+ // product has the form:
+ // 'a * x_i' where x_i = g.coefficient(x)..
+ if (!x_dimension_incompatible && g.coefficient(x) != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // We have the unary inequality constraints.
+ if (!dbm_ij_is_infinity) {
+ // The constraint has form ax <= b.
+ // The scalar product has the form:
+ // '-a * x_i' where x_i = g.coefficient(x).
+ if (is_line
+ && !x_dimension_incompatible
+ && g.coefficient(x) != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (g.coefficient(x) > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (!dbm_ji_is_infinity) {
+ // The constraint has form -ax <= b.
+ // The scalar product has the form:
+ // 'a * x_i' where x_i = g.coefficient(x).
+ if (is_line
+ && !x_dimension_incompatible
+ && g.coefficient(x) != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (g.coefficient(x) < 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ }
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+ using Implementation::BD_Shapes::min_assign;
+
+ // 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; ) {
+ assert(is_plus_infinity(x.dbm[h][h]));
+ assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+ }
+
+ N sum;
+ for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+ const DB_Row<N>& xdbm_k = x.dbm[k];
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& xdbm_i = x.dbm[i];
+ const N& xdbm_i_k = xdbm_i[k];
+ if (!is_plus_infinity(xdbm_i_k))
+ for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+ const N& xdbm_k_j = xdbm_k[j];
+ if (!is_plus_infinity(xdbm_k_j)) {
+ // Rounding upward for correctness.
+ add_assign_r(sum, xdbm_i_k, xdbm_k_j, ROUND_UP);
+ min_assign(xdbm_i[j], sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptyness: 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 (x_dbm_hh < 0) {
+ x.status.set_empty();
+ return;
+ }
+ else {
+ assert(x_dbm_hh == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ x_dbm_hh = PLUS_INFINITY;
+ }
+ }
+
+ // The BDS is not empty and it is now shortest-path closed.
+ x.status.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;
+
+ // First find the tighest 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();
+
+ const dimension_type space_dim = space_dimension();
+ // TODO: directly work on `redundancy_dbm' so as to minimize allocations.
+ std::deque<bool> redundancy_row(space_dim + 1, true);
+ std::vector<std::deque<bool> > redundancy(space_dim + 1, redundancy_row);
+
+ // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+ // subsystem of bounded differences having only leaders as variables.
+ 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];
+ std::deque<bool>& 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[j] = false;
+ 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[j] = true;
+ 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 pred_j = predecessor[j];
+ if (j == pred_j) {
+ // We finally found the leader of `i'.
+ assert(redundancy[i][j]);
+ redundancy[i][j] = false;
+ // Here we dealt with `j' (i.e., `pred_j'), but it is useless
+ // to update `dealt_with' because `j' is a leader.
+ break;
+ }
+ // We haven't found the leader of `i' yet.
+ assert(redundancy[pred_j][j]);
+ redundancy[pred_j][j] = false;
+ dealt_with[pred_j] = true;
+ j = pred_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);
+ std::swap(x.redundancy_dbm, redundancy);
+ x.status.set_shortest_path_reduced();
+
+ assert(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_hull_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("bds_hull_assign(y)", y);
+
+ // The poly-hull of a polyhedron `bd' with an empty polyhedron 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'.
+ 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;
+ }
+ }
+ // The result is still closed.
+ assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_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("bds_difference_assign(y)", y);
+
+ BD_Shape new_bdiffs(space_dim, EMPTY);
+
+ BD_Shape& x = *this;
+
+ x.shortest_path_closure_assign();
+ // The difference of an empty system of bounded differences
+ // and of a system of bounded differences `p' is empty.
+ if (x.marked_empty())
+ return;
+ y.shortest_path_closure_assign();
+ // The difference of a system of bounded differences `p'
+ // and an empty system of bounded differences is `p'.
+ if (y.marked_empty())
+ return;
+
+ // If both systems of bounded differences 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 complementaries 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 system of bounded differences `x' is included
+ // in the system of bounded differences defined by `c',
+ // then `c' _must_ be skipped, as adding its complement to `x'
+ // would result in the empty system of bounded differences,
+ // 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 = Linear_Expression(c);
+ bool change = false;
+ if (c.is_nonstrict_inequality())
+ change = z.add_constraint_and_minimize(e <= 0);
+ if (c.is_equality()) {
+ BD_Shape w = x;
+ if (w.add_constraint_and_minimize(e <= 0))
+ new_bdiffs.bds_hull_assign(w);
+ change = z.add_constraint_and_minimize(e >= 0);
+ }
+ if (change)
+ new_bdiffs.bds_hull_assign(z);
+ }
+ *this = new_bdiffs;
+ // The result is still closed, because both bds_hull_assign() and
+ // add_constraint_and_minimize() preserve closure.
+ assert(OK());
+}
+
+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 system of bounded differences,
+ // 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())
+ status.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)
+ status.set_shortest_path_closed();
+
+ 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);
+ }
+ status.set_shortest_path_closed();
+ }
+ assert(OK());
+ return;
+ }
+
+ // To project an n-dimension space system of bounded differences
+ // 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())
+ status.reset_shortest_path_closed();
+ assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
+ // 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 (to_be_removed.empty()) {
+ assert(OK());
+ return;
+ }
+
+ // Dimension-compatibility check: the variable having
+ // maximum cardinality is the one occurring last in the set.
+ const dimension_type max_dim_to_be_removed = to_be_removed.rbegin()->id();
+ const dimension_type old_space_dim = space_dimension();
+ if (max_dim_to_be_removed >= old_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)",
+ max_dim_to_be_removed);
+
+ // 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 - to_be_removed.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();
+ assert(OK());
+ return;
+ }
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+
+ // For each variable to remove, we erase the corresponding column and
+ // row by shifting the other columns and rows, than are not removed,
+ // respectively left and above.
+ Variables_Set::const_iterator tbr = to_be_removed.begin();
+ Variables_Set::const_iterator tbr_end = to_be_removed.end();
+ dimension_type dst = tbr->id() + 1;
+ dimension_type src = dst + 1;
+ for (++tbr; tbr != tbr_end; ++tbr) {
+ const dimension_type tbr_next = tbr->id() + 1;
+ // All other columns and rows are moved respectively to the left
+ // and above.
+ while (src < tbr_next) {
+ dbm[dst] = dbm[src];
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ dbm_i[dst] = dbm_i[src];
+ }
+ ++dst;
+ ++src;
+ }
+ ++src;
+ }
+
+ // Moving the remaining rows and columns.
+ while (src <= old_space_dim) {
+ dbm[dst] = dbm[src];
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ dbm_i[dst] = dbm_i[src];
+ }
+ ++src;
+ ++dst;
+ }
+
+ // Update the space dimension.
+ dbm.resize_no_copy(new_space_dim + 1);
+ assert(OK());
+}
+
+template <typename T>
+template <typename PartialFunction>
+void
+BD_Shape<T>::map_space_dimensions(const PartialFunction& 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);
+ assert(OK());
+ 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 system of bounded differences.
+ 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())
+ status.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.
+ const 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)) {
+ x_0[new_j + 1] = dbm_0[j];
+ 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)) {
+ const 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;
+ x_new_i[new_j] = dbm_i[j];
+ x[new_j][new_i] = dbm[j][i];
+ }
+ }
+ }
+ }
+
+ std::swap(dbm, x);
+ 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 systems of bounded differences is empty,
+ // the intersection is empty.
+ if (marked_empty())
+ return;
+ if (y.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // If both systems of bounded differences 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 systems of bounded differences 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())
+ status.reset_shortest_path_closed();
+ 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);
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // If both systems of bounded differences 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
+ dbm_ij = PLUS_INFINITY;
+ }
+ }
+ }
+ status.reset_shortest_path_closed();
+ assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+ BD_Shape& limiting_shape) const {
+ using Implementation::BD_Shapes::div_round_up;
+
+ const dimension_type cs_space_dim = cs.space_dimension();
+ // Private method: the caller has to ensure the following.
+ assert(cs_space_dim <= space_dimension());
+
+ bool changed = false;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ const Constraint& c = *i;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ TEMP_INTEGER(coeff);
+ // Constraints that are not bounded differences are ignored.
+ if (extract_bounded_difference(c, cs_space_dim, 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 N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+ DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+ N& ls_x = (coeff < 0) ? ls_dbm[i][j] : ls_dbm[j][i];
+ N& ls_y = (coeff < 0) ? ls_dbm[j][i] : ls_dbm[i][j];
+ if (coeff < 0)
+ coeff = -coeff;
+ // Compute the bound for `x', rounding towards plus infinity.
+ N d;
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ if (x <= d)
+ if (c.is_inequality())
+ if (ls_x > d) {
+ ls_x = d;
+ changed = true;
+ }
+ else {
+ // Compute the bound for `y', rounding towards plus infinity.
+ div_round_up(d, -c.inhomogeneous_term(), coeff);
+ if (y <= d)
+ if (ls_y > d) {
+ ls_y = d;
+ changed = true;
+ }
+
+ }
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure of the system of bounded differences.
+ if (changed && limiting_shape.marked_shortest_path_closed())
+ limiting_shape.status.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_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 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;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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);
+ assert(OK());
+}
+
+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);
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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();
+ 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.
+ 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 std::deque<bool>& 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)
+ dbm_ij = PLUS_INFINITY;
+ }
+ }
+ // 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.
+ status.reset_shortest_path_closed();
+ 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_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+ "(y, cs)");
+
+ // Strict inequalities are not allowed.
+ if (cs.has_strict_inequalities())
+ throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+ "(y, cs)");
+
+ // 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;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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);
+ assert(OK());
+}
+
+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);
+
+#ifndef NDEBUG
+ {
+ // We assume that `*this' is contained in or equal to `y'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(y_copy.contains(x_copy));
+ }
+#endif
+
+ // If both systems of bounded differences 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())
+ status.reset_shortest_path_closed();
+ 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_den,
+ const N& pos_sum) {
+ // 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/den' 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)'.
+ mpq_class mpq_sc_den;
+ assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // No need to consider indices greater than `last_v'.
+ for (dimension_type u = last_v; u > 0; --u)
+ if (u != v) {
+ const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+ if (expr_u > 0)
+ if (expr_u >= sc_den)
+ // Deducing `v - u <= ub_v - ub_u'.
+ sub_assign_r(dbm[u][v], pos_sum, dbm_0[u], ROUND_UP);
+ else {
+ DB_Row<N>& dbm_u = dbm[u];
+ 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_den' be the
+ // rational coefficient of `u' in `sc_expr/sc_den',
+ // the upper bound for `v - u' is computed as
+ // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+ // `pos_sum + (-lb_u) - q * (ub_u + (-lb_u))'.
+ mpq_class minus_lb_u;
+ assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+ mpq_class q;
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+ mpq_class ub_u;
+ assign_r(ub_u, dbm_0[u], 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);
+ N up_approx;
+ 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], pos_sum, 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_den,
+ const N& neg_sum) {
+ // 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/den' 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'.
+ mpq_class mpq_sc_den;
+ assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& dbm_v = dbm[v];
+ // No need to consider indices greater than `last_v'.
+ for (dimension_type u = last_v; u > 0; --u)
+ if (u != v) {
+ const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+ if (expr_u > 0)
+ if (expr_u >= sc_den)
+ // Deducing `u - v <= lb_u - lb_v',
+ // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+ sub_assign_r(dbm_v[u], neg_sum, dbm[u][0], ROUND_UP);
+ else {
+ const N& dbm_0u = dbm_0[u];
+ 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_den' be the
+ // rational coefficient of `u' in `sc_expr/sc_den',
+ // 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)) + neg_sum'.
+ mpq_class ub_u;
+ assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+ mpq_class q;
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+ mpq_class minus_lb_u;
+ assign_r(minus_lb_u, dbm[u][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);
+ N up_approx;
+ 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], up_approx, neg_sum, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_generic("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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ w = i+1;
+
+ // 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.
+ TEMP_INTEGER(minus_den);
+ neg_assign(minus_den, 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())
+ status.reset_shortest_path_reduced();
+ // Add the constraint `var == b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ add_dbm_constraint(v, 0, b, minus_den);
+ assert(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.coefficient(Variable(w-1));
+ if (a == denominator || a == minus_den) {
+ // 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'.
+ N d;
+ div_round_up(d, b, denominator);
+ N c;
+ div_round_up(c, b, minus_den);
+ 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'.
+ std::swap(dbm[v][0], dbm[0][v]);
+ // Shortest-path closure is not preserved.
+ status.reset_shortest_path_closed();
+ if (b != 0) {
+ // Translate the unary constraints on `var',
+ // adding or subtracting the value `b/denominator'.
+ N c;
+ div_round_up(c, b, minus_den);
+ N& dbm_v0 = dbm[v][0];
+ add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+ 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())
+ status.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_den);
+ }
+ 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'.
+ N d;
+ div_round_up(d, b, denominator);
+ add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+ status.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'.
+ N c;
+ div_round_up(c, b, minus_den);
+ add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+ status.reset_shortest_path_closed();
+ }
+ }
+ }
+ 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);
+ TEMP_INTEGER(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_den = is_sc ? denominator : minus_den;
+ const Coefficient& minus_sc_den = is_sc ? minus_den : 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;
+
+ N pos_sum;
+ N neg_sum;
+ // Indices of the variables that are unbounded in `this->dbm'.
+ // (The initializations are just to quiet a compiler warning.)
+ dimension_type pos_pinf_index = 0;
+ dimension_type neg_pinf_index = 0;
+ // 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'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = w; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ N coeff_i;
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i];
+ 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;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i][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;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ TEMP_INTEGER(minus_sc_i);
+ neg_assign(minus_sc_i, sc_i);
+ N minus_coeff_i;
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(pos_sum,
+ minus_coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(neg_sum, minus_coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i;
+ }
+ }
+ }
+ }
+
+ // Remove all constraints on 'v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is maintained, but not reduction.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+ assert(OK());
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ status.reset_shortest_path_closed();
+
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_den' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_den != 1)
+ div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ DB_Row<N>& dbm_0 = dbm[0];
+ assign_r(dbm_0[v], pos_sum, ROUND_UP);
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != v
+ && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ assign_r(dbm[pos_pinf_index][v], pos_sum, ROUND_UP);
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_den != 1)
+ div_assign_r(neg_sum, neg_sum, down_sc_den, 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];
+ assign_r(dbm_v[0], neg_sum, ROUND_UP);
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != v
+ && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ assign_r(dbm[v][neg_pinf_index], neg_sum, ROUND_UP);
+ }
+
+ assert(OK());
+}
+
+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_generic("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 systems of bounded differences.
+ 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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ j = i;
+
+ // 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())
+ status.reset_shortest_path_reduced();
+ assert(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.coefficient(Variable(j));
+ if (a == denominator || a == -denominator) {
+ // Case 2: expr = a*w + b, with a = +/- denominator.
+ if (j == var.id())
+ // Apply affine_image() on the inverse of this transformation.
+ affine_image(var, a*var - b, denominator);
+ 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())
+ status.reset_shortest_path_reduced();
+ }
+ 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())
+ status.reset_shortest_path_reduced();
+ }
+ assert(OK());
+}
+
+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) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_generic("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_generic("generalized_affine_image(v, r, e, d)",
+ "r is a strict relation symbol and "
+ "*this is a BD_Shape");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "==":
+ // this is just an affine image computation.
+ affine_image(var, expr, denominator);
+ assert(OK());
+ 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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ w = i+1;
+
+ // 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];
+ TEMP_INTEGER(minus_den);
+ neg_assign(minus_den, 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.
+ status.reset_shortest_path_closed();
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, b, minus_den);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ assert(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.coefficient(Variable(w-1));
+ if (a == denominator || a == minus_den) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ N d;
+ switch (relsym) {
+ case LESS_THAN_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.
+ status.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);
+ dbm_v[i] = PLUS_INFINITY;
+ }
+ }
+ 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'.
+ dbm_v0 = PLUS_INFINITY;
+ 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())
+ status.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.
+ status.reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ case GREATER_THAN_OR_EQUAL:
+ div_round_up(d, b, minus_den);
+ if (w == v) {
+ // `expr' is of the form: a*w + b.
+ // Shortest-path closure and reduction are not preserved.
+ status.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);
+ dbm[i][v] = PLUS_INFINITY;
+ }
+ }
+ 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'.
+ dbm_0v = PLUS_INFINITY;
+ 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())
+ status.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.
+ status.reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ 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);
+ TEMP_INTEGER(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_den = is_sc ? denominator : minus_den;
+ const Coefficient& minus_sc_den = is_sc ? minus_den : 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;
+
+ N sum;
+ // Index of variable that is unbounded in `this->dbm'.
+ // (The initialization is just to quiet a compiler warning.)
+ dimension_type pinf_index = 0;
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case LESS_THAN_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'.
+ for (dimension_type i = w; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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())
+ status.reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ assert(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_den != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_den' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.coefficient(Variable(pinf_index-1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_THAN_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 (dimension_type i = expr_space_dim + 1; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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())
+ status.reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ assert(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_den != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_den' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.coefficient(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.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ 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_generic("generalized_affine_image(e1, r, e2)",
+ "r is a strict relation symbol and "
+ "*this is a BD_Shape");
+
+ // 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 = 0;
+ // Compute the number of the non-zero components of `lhs'.
+ for (dimension_type i = lhs_space_dim; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0)
+ if (t_lhs++ == 1)
+ break;
+ else
+ j_lhs = i;
+
+ 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_THAN_OR_EQUAL:
+ add_constraint(lhs <= rhs);
+ break;
+ case EQUAL:
+ add_constraint(lhs == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ 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& den = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (den < 0)
+ if (relsym == LESS_THAN_OR_EQUAL)
+ new_relsym = GREATER_THAN_OR_EQUAL;
+ else if (relsym == GREATER_THAN_OR_EQUAL)
+ new_relsym = LESS_THAN_OR_EQUAL;
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_image(v, new_relsym, expr, den);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ bool lhs_vars_intersects_rhs_vars = false;
+ std::vector<Variable> lhs_vars;
+ for (dimension_type i = lhs_space_dim; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0) {
+ lhs_vars.push_back(Variable(i));
+ if (rhs.coefficient(Variable(i)) != 0)
+ lhs_vars_intersects_rhs_vars = true;
+ }
+
+ if (!lhs_vars_intersects_rhs_vars) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Cylindrificate on 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_THAN_OR_EQUAL:
+ add_constraint(lhs <= rhs);
+ break;
+ case EQUAL:
+ add_constraint(lhs == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ 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 = Variable(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of add_constraint()
+ // ensures some approximation is tried even when the constraint
+ // is not a bounded difference.
+ affine_image(new_var, rhs);
+ // Cylindrificate on all variables in the lhs.
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ 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 add_constraint() will simply ignore it.
+ // Should we compute approximations for this constraint?
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ add_constraint(lhs <= new_var);
+ break;
+ case EQUAL:
+ add_constraint(lhs == new_var);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= new_var);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+ }
+ }
+
+ 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) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_generic("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_generic("generalized_affine_preimage(v, r, e, d)",
+ "r is a strict relation symbol and "
+ "*this is a BD_Shape");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "==":
+ // this is just an affine preimage computation.
+ affine_preimage(var, expr, denominator);
+ assert(OK());
+ return;
+ }
+
+ // The image 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_THAN_OR_EQUAL)
+ ? GREATER_THAN_OR_EQUAL : LESS_THAN_OR_EQUAL;
+ const Linear_Expression inverse
+ = expr - (expr_v + denominator)*var;
+ TEMP_INTEGER(inverse_den);
+ neg_assign(inverse_den, expr_v);
+ const Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot
+ // be easily computed by inverting the affine relation.
+ // Shrink the BD shape by adding the constraint induced
+ // by the affine relation.
+ 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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ j = i+1;
+
+ // 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, the `expr' is of the general form.
+ DB_Row<N>& dbm_0 = dbm[0];
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, -b, denominator);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ }
+ else if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& expr_j = expr.coefficient(Variable(j-1));
+ N d;
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ div_round_up(d, b, denominator);
+ // Note that: `j != v', so that `expr' is of the form
+ // expr_j * j + b, with `j != v'.
+ if (expr_j == denominator)
+ // Add the new constraint `v - j <= b/denominator'.
+ add_dbm_constraint(j, v, d);
+ else {
+ // Here expr_j != denominator, so that we should be adding
+ // the constraint `v <= b/denominator - j'.
+ N sum;
+ // Approximate the homogeneous part of `expr'.
+ const int sign_j = sgn(expr_j);
+ const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+ if (!is_plus_infinity(approx_j)) {
+ N coeff_j;
+ if (sign_j > 0)
+ assign_r(coeff_j, expr_j, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_expr_j);
+ neg_assign(minus_expr_j, expr_j);
+ assign_r(coeff_j, minus_expr_j, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+ add_dbm_constraint(0, v, sum);
+ }
+ }
+ break;
+
+ case GREATER_THAN_OR_EQUAL:
+ div_round_up(d, -b, denominator);
+ // Note that: `j != v', so that `expr' is of the form
+ // expr_j * j + b, with `j != v'.
+ if (expr_j == denominator)
+ // Add the new constraint `v - j >= b/denominator'.
+ add_dbm_constraint(j, v, d);
+ else {
+ // Here expr_j != denominator, so that we should be adding
+ // the constraint `v <= b/denominator - j'.
+ N sum;
+ // Approximate the homogeneous part of `expr_j'.
+ const int sign_j = sgn(expr_j);
+ const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+ if (!is_plus_infinity(approx_j)) {
+ N coeff_j;
+ if (sign_j > 0)
+ assign_r(coeff_j, expr_j, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_expr_j);
+ neg_assign(minus_expr_j, expr_j);
+ assign_r(coeff_j, minus_expr_j, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+ add_dbm_constraint(0, v, sum);
+ }
+ }
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ 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);
+ TEMP_INTEGER(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;
+ TEMP_INTEGER(minus_den);
+ neg_assign(minus_den, denominator);
+ const Coefficient& sc_den = is_sc ? denominator : minus_den;
+ const Coefficient& minus_sc_den = is_sc ? minus_den : 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;
+
+ N sum;
+ // Index of variable that is unbounded in `this->dbm'.
+ // (The initialization is just to quiet a compiler warning.)
+ dimension_type pinf_index = 0;
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case LESS_THAN_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 (dimension_type i = j; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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_den != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_den' is known to be
+ // positive, this amounts to rounding downwards, which is achieved
+ // by rounding upwards `minus_sc-den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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, j, sc_expr, sc_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (expr.coefficient(Variable(pinf_index-1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_THAN_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 (dimension_type i = j; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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_den != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_den' is known to be positive,
+ // this amounts to rounding downwards, which is achieved by rounding
+ // upwards `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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, j, sc_expr, sc_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.coefficient(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.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ }
+
+ // If the shrunk BD_Shape is empty, its preimage is empty too.
+ if (is_empty())
+ return;
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+ assert(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+ using Implementation::BD_Shapes::numer_denom;
+
+ Constraint_System cs;
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ }
+ else if (marked_empty())
+ cs.insert(0*Variable(space_dim-1) <= -1);
+ else if (marked_shortest_path_reduced())
+ // Disregard redundant constraints.
+ cs = minimized_constraints();
+ else {
+ // KLUDGE: in the future `cs' will be constructed of the right dimension.
+ // For the time being, we force the dimension with the following line.
+ cs.insert(0*Variable(space_dim-1) <= 0);
+
+ TEMP_INTEGER(a);
+ TEMP_INTEGER(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];
+ N negated_dbm_j0;
+ if (neg_assign_r(negated_dbm_j0, dbm_j0, ROUND_NOT_NEEDED) == V_EQ
+ && negated_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];
+ N negated_dbm_ji;
+ if (neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+ && negated_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 {
+ using Implementation::BD_Shapes::numer_denom;
+
+ shortest_path_reduction_assign();
+ Constraint_System cs;
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ }
+ else if (marked_empty())
+ cs.insert(0*Variable(space_dim-1) <= -1);
+ else {
+ // KLUDGE: in the future `cs' will be constructed of the right dimension.
+ // For the time being, we force the dimension with the following line.
+ cs.insert(0*Variable(space_dim-1) <= 0);
+
+ TEMP_INTEGER(num);
+ TEMP_INTEGER(den);
+
+ // 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.
+ assert(!is_plus_infinity(dbm_0[i]));
+ numer_denom(dbm_0[i], num, den);
+ cs.insert(den*Variable(i-1) == num);
+ }
+ else {
+ // A binary equality has to be generated.
+ assert(!is_plus_infinity(dbm[i][leader]));
+ numer_denom(dbm[i][leader], num, den);
+ cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+ }
+ }
+
+ // Go through the leaders to generate inequality constraints.
+ // First generate all the unary inequalities.
+ const std::deque<bool>& 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], num, den);
+ cs.insert(den*Variable(i-1) <= num);
+ }
+ if (!redundancy_dbm[i][0]) {
+ numer_denom(dbm[i][0], num, den);
+ cs.insert(-den*Variable(i-1) <= num);
+ }
+ }
+ // 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 std::deque<bool>& 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], num, den);
+ cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
+ }
+ if (!redundancy_dbm[j][i]) {
+ numer_denom(dbm[j][i], num, den);
+ cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
+ }
+ }
+ }
+ }
+ return cs;
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& c) {
+ typedef typename BD_Shape<T>::coefficient_type N;
+ if (c.is_universe())
+ s << "true";
+ else {
+ // We control empty system of bounded differences.
+ dimension_type n = c.space_dimension();
+ if (c.marked_empty())
+ s << "false";
+ else {
+ 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 = c.dbm[i][j];
+ const N& c_j_i = c.dbm[j][i];
+ N negated_c_ji;
+ if (neg_assign_r(negated_c_ji, c_j_i, ROUND_NOT_NEEDED) == V_EQ
+ && negated_c_ji == 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 (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 an only Variable.
+ s << Variable(j - 1);
+ N v;
+ neg_assign_r(v, c_j_i, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ else {
+ // We have got a constraint with two Variables.
+ if (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);
+ N v;
+ 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 an only Variable.
+ s << Variable(j - 1);
+ s << " <= " << c_i_j;
+ }
+ else {
+ // We have got a constraint with two Variables.
+ if (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);
+ N v;
+ 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);
+ // Redundancy info.
+ s << "\n";
+ const char separator = ' ';
+ const dimension_type nrows = redundancy_dbm.size();
+ s << nrows << separator << "\n";
+ for (dimension_type i = 0; i < nrows; ++i) {
+ for (dimension_type j = 0; j < nrows; ++j)
+ s << redundancy_dbm[i][j] << separator;
+ s << "\n";
+ }
+}
+
+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;
+ // Load redundancy info.
+ dimension_type nrows;
+ if (!(s >> nrows))
+ return false;
+ redundancy_dbm.clear();
+ redundancy_dbm.reserve(nrows);
+ std::deque<bool> redundancy_row(nrows, false);
+ for (dimension_type i = 0; i < nrows; ++i) {
+ for (dimension_type j = 0; j < nrows; ++j)
+ if (!(s >> redundancy_row[j]))
+ return false;
+ redundancy_dbm.push_back(redundancy_row);
+ }
+ return true;
+}
+
+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 << "][" << i << "] = "
+ << dbm[i][i] << "!"
+ << 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.status.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;
+ }
+ }
+
+ // 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 << "][" << i << "] = "
+ << dbm[i][i] << " is marked as non-redundant!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ BD_Shape x = *this;
+ x.status.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::";
+ s << "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::";
+ s << "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::";
+ s << "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 Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::";
+ s << "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_constraint_incompatible(const char* method) {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "the constraint is incompatible.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& e) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << e << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const char* name_row,
+ const Linear_Expression& y) const {
+ std::ostringstream s;
+ s << "PPL::";
+ s << "BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << name_row << "->space_dimension() == "
+ << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_generic(const char* method, const char* reason) {
+ std::ostringstream s;
+ s << "PPL::";
+ s << "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..60aec43
--- /dev/null
+++ b/src/BD_Shape.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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;
+
+} // 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..654bea9
--- /dev/null
+++ b/src/BHRZ03_Certificate.cc
@@ -0,0 +1,332 @@
+/* BHRZ03_Certificate class implementation
+ (non-inline member functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "BHRZ03_Certificate.defs.hh"
+
+#include "Polyhedron.defs.hh"
+#include <cassert>
+#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.
+ 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;
+ 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;
+ }
+
+ assert(lin_space_dim == 0);
+ 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.
+ {
+ const Generator& r = *i;
+ dimension_type num_zeroes = 0;
+ for (dimension_type j = space_dim; j-- > 0; )
+ if (r.coefficient(Variable(j)) == 0)
+ ++num_zeroes;
+ ++num_rays_null_coord[num_zeroes];
+ }
+ 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;
+ }
+ 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 {
+ 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();
+ 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 {
+ 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.
+ 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.
+ 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.
+ 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()) {
+ const Generator& r = *i;
+ dimension_type num_zeroes = 0;
+ for (dimension_type j = space_dim; j-- > 0; )
+ if (r.coefficient(Variable(j)) == 0)
+ ++num_zeroes;
+ ++ph_num_rays_null_coord[num_zeroes];
+ }
+ // 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..fc02296
--- /dev/null
+++ b/src/BHRZ03_Certificate.defs.hh
@@ -0,0 +1,117 @@
+/* BHRZ03_Certificate class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.types.hh"
+#include <cassert>
+#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 // 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 // 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..3e4277f
--- /dev/null
+++ b/src/BHRZ03_Certificate.inlines.hh
@@ -0,0 +1,62 @@
+/* BHRZ03_Certificate class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.
+ 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..2185260
--- /dev/null
+++ b/src/BHRZ03_Certificate.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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..129e104
--- /dev/null
+++ b/src/BUGS.cc.dist
@@ -0,0 +1,24 @@
+extern const char* const BUGS_array[] = {
+ "",
+ "The PPL developers encourage you to report any bugs you find to",
+ "ppl-devel at cs.unipr.it. 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://www.cs.unipr.it/ppl/Bugs/ .",
+ 0};
diff --git a/src/Bounding_Box.cc b/src/Bounding_Box.cc
new file mode 100644
index 0000000..a9b88ce
--- /dev/null
+++ b/src/Bounding_Box.cc
@@ -0,0 +1,158 @@
+/* Bounding_Box class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Bounding_Box.defs.hh"
+#include "Variable.defs.hh"
+#include "Constraint.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+template <typename Iterator>
+void
+PPL::Bounding_Box::CC76_widening_assign(const Bounding_Box& y,
+ Iterator first, Iterator last) {
+ for (dimension_type i = vec.size(); i-- > 0; ) {
+ Interval& x_vec_i = vec[i];
+ const Interval& y_vec_i = y.vec[i];
+
+ // Upper bound.
+ UBoundary& x_ub = x_vec_i.upper_bound();
+ ERational& x_ubb = x_ub.bound();
+ const ERational& y_ubb = y_vec_i.upper_bound().bound();
+ assert(y_ubb <= x_ubb);
+ if (y_ubb < x_ubb) {
+ Iterator k = std::lower_bound(first, last, x_ubb);
+ if (k != last) {
+ if (x_ubb < *k)
+ x_ubb = *k;
+ }
+ else
+ x_ub = UBoundary(ERational(PLUS_INFINITY), UBoundary::OPEN);
+ }
+
+ // Lower bound.
+ LBoundary& x_lb = x_vec_i.lower_bound();
+ ERational& x_lbb = x_lb.bound();
+ const ERational& y_lbb = y_vec_i.lower_bound().bound();
+ assert(y_lbb >= x_lbb);
+ if (y_lbb > x_lbb) {
+ Iterator k = std::lower_bound(first, last, x_lbb);
+ if (k != last) {
+ if (x_lbb < *k)
+ if (k != first)
+ x_lbb = *--k;
+ else
+ x_lb = LBoundary(ERational(MINUS_INFINITY), LBoundary::OPEN);
+ }
+ else
+ x_lbb = *--k;
+ }
+ }
+}
+
+void
+PPL::Bounding_Box::CC76_widening_assign(const Bounding_Box& y) {
+ static ERational stop_points[] = {
+ ERational(-2, ROUND_NOT_NEEDED),
+ ERational(-1, ROUND_NOT_NEEDED),
+ ERational(0, ROUND_NOT_NEEDED),
+ ERational(1, ROUND_NOT_NEEDED),
+ ERational(2, ROUND_NOT_NEEDED)
+ };
+ CC76_widening_assign(y,
+ stop_points,
+ stop_points
+ + sizeof(stop_points)/sizeof(stop_points[0]));
+}
+
+PPL::Constraint_System
+PPL::Bounding_Box::constraints() const {
+ Constraint_System cs;
+ dimension_type space_dim = space_dimension();
+ if (space_dim == 0) {
+ if (is_empty())
+ cs = Constraint_System::zero_dim_empty();
+ }
+ else if (is_empty())
+ cs.insert(0*Variable(space_dim-1) <= -1);
+ else {
+ // KLUDGE: in the future `cs' will be constructed of the right dimension.
+ // For the time being, we force the dimension with the following line.
+ cs.insert(0*Variable(space_dim-1) <= 0);
+
+ for (dimension_type k = 0; k < space_dim; ++k) {
+ bool closed = false;
+ PPL::Coefficient n;
+ PPL::Coefficient d;
+ if (get_lower_bound(k, closed, n, d)) {
+ if (closed)
+ cs.insert(d*Variable(k) >= n);
+ else
+ cs.insert(d*Variable(k) > n);
+ }
+ if (get_upper_bound(k, closed, n, d)) {
+ if (closed)
+ cs.insert(d*Variable(k) <= n);
+ else
+ cs.insert(d*Variable(k) < n);
+ }
+ }
+ }
+ return cs;
+}
+
+/*! \relates Parma_Polyhedra_Library::Bounding_Box */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const PPL::Bounding_Box& bbox) {
+ if (bbox.is_empty()) {
+ s << "empty";
+ return s;
+ }
+ const dimension_type dimension = bbox.space_dimension();
+ for (dimension_type k = 0; k < dimension; ++k) {
+ bool closed = false;
+ PPL::Coefficient n;
+ PPL::Coefficient d;
+ if (bbox.get_lower_bound(k, closed, n, d)) {
+ s << (closed ? "[" : "(")
+ << n;
+ if (d != 1)
+ s << "/" << d;
+ s << ", ";
+ }
+ else
+ s << "(-inf, ";
+ if (bbox.get_upper_bound(k, closed, n, d)) {
+ s << n;
+ if (d != 1)
+ s << "/" << d;
+ s << (closed ? "]" : ")");
+ }
+ else
+ s << "+inf)";
+ s << "\n";
+ }
+ return s;
+}
diff --git a/src/Bounding_Box.defs.hh b/src/Bounding_Box.defs.hh
new file mode 100644
index 0000000..c8fceda
--- /dev/null
+++ b/src/Bounding_Box.defs.hh
@@ -0,0 +1,207 @@
+/* Bounding_Box class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bounding_Box_defs_hh
+#define PPL_Bounding_Box_defs_hh 1
+
+#include "Coefficient.types.hh"
+#include "globals.types.hh"
+#include "Coefficient.defs.hh"
+#include "Interval.defs.hh"
+#include "Constraint_System.defs.hh"
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A not necessarily closed bounding-box.
+/*! \ingroup PPL_CXX_interface
+ A Bounding_Box object represents the Cartesian product of \f$n\f$
+ not necessarily closed and possibly unbounded intervals,
+ where \f$n\f$ is the space dimension of the box.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Bounding_Box {
+public:
+ //! Constructs a universe bounding box of dimension \p num_dimensions.
+ Bounding_Box(dimension_type num_dimensions);
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns a reference the interval that bounds
+ the box on the <CODE>k</CODE>-th space dimension.
+ */
+ const Interval& operator[](dimension_type k) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+ bool is_empty() const;
+
+ /*! \brief
+ If the <CODE>k</CODE>-th space dimension is unbounded below, returns
+ <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+ \p closed, \p n and \p d accordingly.
+
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+
+ An undefined behavior is obtained if \p k is greater than
+ or equal to the space dimension of \p *this.
+ */
+ bool get_lower_bound(dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const;
+
+ /*! \brief
+ If the <CODE>k</CODE>-th space dimension is unbounded above, returns
+ <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+ \p closed, \p n and \p d accordingly.
+
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+
+ An undefined behavior is obtained if \p k is greater than
+ or equal to the space dimension of \p *this.
+ */
+ bool get_upper_bound(dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const;
+
+ //! Causes the box to become empty, i.e., to represent the empty set.
+ void set_empty();
+
+ /*! \brief
+ Raises the lower bound of the interval corresponding
+ to the <CODE>k</CODE>-th space dimension.
+
+ Intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+ An undefined behavior is obtained if \p k is greater than or equal to
+ the space dimension of \p *this or if \p d is equal to zero.
+ */
+ void raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d);
+
+ /*! \brief
+ Lowers the upper bound of the interval corresponding
+ to the <CODE>k</CODE>-th space dimension.
+
+ Intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+ is <CODE>false</CODE>.
+ An undefined behavior is obtained if \p k is greater than or equal to
+ the space dimension of \p *this or if \p d is equal to zero.
+ */
+ void lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d);
+
+ //! Returns a system of constraints corresponding to \p *this.
+ Constraint_System constraints() const;
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A bounding box that <EM>must</EM> be contained in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_widening_assign(const Bounding_Box& y);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A bounding 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 Iterator>
+ void CC76_widening_assign(const Bounding_Box& y,
+ Iterator first, Iterator last);
+
+private:
+ /*! \brief
+ A vector of rational intervals, one for each dimension
+ of the vector space.
+ */
+ std::vector<Interval> vec;
+ /*! \brief
+ A boolean flag indicating emptiness of the bounding box.
+ Only meaningful when \p empty_up_to_date is <CODE>true</CODE>.
+ */
+ mutable bool empty;
+ //! Tells whether or not the flag \p empty is meaningful.
+ mutable bool empty_up_to_date;
+
+ //! Records the stop points for CC76_widening_assign(const Bounding_Box&).
+ static ERational default_stop_points[];
+};
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Bounding_Box */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+std::ostream& operator<<(std::ostream& s, const Bounding_Box& bbox);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Bounding_Box.inlines.hh"
+
+#endif // !defined(PPL_Bounding_Box_defs_hh)
diff --git a/src/Bounding_Box.inlines.hh b/src/Bounding_Box.inlines.hh
new file mode 100644
index 0000000..9f41ac0
--- /dev/null
+++ b/src/Bounding_Box.inlines.hh
@@ -0,0 +1,137 @@
+/* Bounding_Box class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Bounding_Box_inlines_hh
+#define PPL_Bounding_Box_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bounding_Box::Bounding_Box(dimension_type num_dimensions)
+ : vec(num_dimensions), empty(false), empty_up_to_date(true) {
+}
+
+inline dimension_type
+Bounding_Box::space_dimension() const {
+ return vec.size();
+}
+
+inline const Interval&
+Bounding_Box::operator[](const dimension_type k) const {
+ assert(k < vec.size());
+ return vec[k];
+}
+
+inline bool
+Bounding_Box::is_empty() const {
+ if (empty_up_to_date)
+ return empty;
+ else {
+ empty_up_to_date = true;
+ for (dimension_type k = vec.size(); k-- > 0; )
+ if (vec[k].is_empty()) {
+ empty = true;
+ return true;
+ }
+ empty = false;
+ return false;
+ }
+}
+
+inline bool
+Bounding_Box::get_lower_bound(const dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const {
+ assert(k < vec.size());
+ const LBoundary& lb = vec[k].lower_bound();
+ const ERational& lr = lb.bound();
+
+ if (is_plus_infinity(lr) || is_minus_infinity(lr))
+ return false;
+
+ closed = lb.is_closed();
+ n = raw_value(lr).get_num();
+ d = raw_value(lr).get_den();
+
+ return true;
+}
+
+inline bool
+Bounding_Box::get_upper_bound(const dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const {
+ assert(k < vec.size());
+ const UBoundary& ub = vec[k].upper_bound();
+ const ERational& ur = ub.bound();
+
+ if (is_plus_infinity(ur) || is_minus_infinity(ur))
+ return false;
+
+ closed = ub.is_closed();
+ n = raw_value(ur).get_num();
+ d = raw_value(ur).get_den();
+
+ return true;
+}
+
+inline void
+Bounding_Box::set_empty() {
+ for (dimension_type k = vec.size(); k-- > 0; )
+ vec[k].set_empty();
+ empty = empty_up_to_date = true;
+}
+
+inline void
+Bounding_Box::raise_lower_bound(const dimension_type k, const bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d) {
+ assert(k < vec.size());
+ assert(d != 0);
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ vec[k].raise_lower_bound(LBoundary(ERational(q, ROUND_NOT_NEEDED),
+ (closed
+ ? LBoundary::CLOSED
+ : LBoundary::OPEN)));
+ empty_up_to_date = false;
+}
+
+inline void
+Bounding_Box::lower_upper_bound(const dimension_type k, const bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d) {
+ assert(k < vec.size());
+ assert(d != 0);
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ vec[k].lower_upper_bound(UBoundary(ERational(q, ROUND_NOT_NEEDED),
+ (closed
+ ? UBoundary::CLOSED
+ : UBoundary::OPEN)));
+ empty_up_to_date = false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bounding_Box_inlines_hh)
diff --git a/src/Bounding_Box.types.hh b/src/Bounding_Box.types.hh
new file mode 100644
index 0000000..8ed42d8
--- /dev/null
+++ b/src/Bounding_Box.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Bounding_Box_types_hh
+#define PPL_Bounding_Box_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Bounding_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Bounding_Box_types_hh)
diff --git a/src/COPYING.cc.dist b/src/COPYING.cc.dist
new file mode 100644
index 0000000..457adbb
--- /dev/null
+++ b/src/COPYING.cc.dist
@@ -0,0 +1,342 @@
+extern const char* const COPYING_array[] = {
+ "\t\t GNU GENERAL PUBLIC LICENSE",
+ "\t\t Version 2, June 1991",
+ "",
+ " Copyright (C) 1989, 1991 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.",
+ "",
+ "\t\t\t Preamble",
+ "",
+ " The licenses for most software are designed to take away your",
+ "freedom to share and change it. By contrast, the GNU General Public",
+ "License is intended to guarantee your freedom to share and change free",
+ "software--to make sure the software is free for all its users. This",
+ "General Public License applies to most of the Free Software",
+ "Foundation's software and to any other program whose authors commit to",
+ "using it. (Some other Free Software Foundation software is covered by",
+ "the GNU Library General Public License instead.) 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",
+ "this service 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 make restrictions that forbid",
+ "anyone to deny you these rights or to ask you to surrender the rights.",
+ "These restrictions translate to certain responsibilities for you if you",
+ "distribute copies of the software, or if you modify it.",
+ "",
+ " For example, if you distribute copies of such a program, whether",
+ "gratis or for a fee, you must give the recipients all the rights that",
+ "you have. 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.",
+ "",
+ " We protect your rights with two steps: (1) copyright the software, and",
+ "(2) offer you this license which gives you legal permission to copy,",
+ "distribute and/or modify the software.",
+ "",
+ " Also, for each author's protection and ours, we want to make certain",
+ "that everyone understands that there is no warranty for this free",
+ "software. If the software is modified by someone else and passed on, we",
+ "want its recipients to know that what they have is not the original, so",
+ "that any problems introduced by others will not reflect on the original",
+ "authors' reputations.",
+ "",
+ " Finally, any free program is threatened constantly by software",
+ "patents. We wish to avoid the danger that redistributors of a free",
+ "program will individually obtain patent licenses, in effect making the",
+ "program proprietary. To prevent this, we have made it clear that any",
+ "patent must be licensed for everyone's free use or not licensed at all.",
+ "",
+ " The precise terms and conditions for copying, distribution and",
+ "modification follow.",
+ "
",
+ "\t\t GNU GENERAL PUBLIC LICENSE",
+ " TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION",
+ "",
+ " 0. This License applies to any program or other work which contains",
+ "a notice placed by the copyright holder saying it may be distributed",
+ "under the terms of this General Public License. The \"Program\", below,",
+ "refers to any such program or work, and a \"work based on the Program\"",
+ "means either the Program or any derivative work under copyright law:",
+ "that is to say, a work containing the Program or a portion of it,",
+ "either verbatim or with modifications and/or translated into another",
+ "language. (Hereinafter, translation is included without limitation in",
+ "the term \"modification\".) Each licensee is addressed as \"you\".",
+ "",
+ "Activities other than copying, distribution and modification are not",
+ "covered by this License; they are outside its scope. The act of",
+ "running the Program is not restricted, and the output from the Program",
+ "is covered only if its contents constitute a work based on the",
+ "Program (independent of having been made by running the Program).",
+ "Whether that is true depends on what the Program does.",
+ "",
+ " 1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the",
+ "notices that refer to this License and to the absence of any warranty;",
+ "and give any other recipients of the Program a copy of this License",
+ "along with the Program.",
+ "",
+ "You may charge a fee for the physical act of transferring a copy, and",
+ "you may at your option offer warranty protection in exchange for a fee.",
+ "",
+ " 2. You may modify your copy or copies of the Program or any portion",
+ "of it, thus forming a work based on the Program, and copy and",
+ "distribute such modifications or work under the terms of Section 1",
+ "above, provided that you also meet all of these conditions:",
+ "",
+ " a) You must cause the modified files to carry prominent notices",
+ " stating that you changed the files and the date of any change.",
+ "",
+ " b) You must cause any work that you distribute or publish, that in",
+ " whole or in part contains or is derived from the Program or any",
+ " part thereof, to be licensed as a whole at no charge to all third",
+ " parties under the terms of this License.",
+ "",
+ " c) If the modified program normally reads commands interactively",
+ " when run, you must cause it, when started running for such",
+ " interactive use in the most ordinary way, to print or display an",
+ " announcement including an appropriate copyright notice and a",
+ " notice that there is no warranty (or else, saying that you provide",
+ " a warranty) and that users may redistribute the program under",
+ " these conditions, and telling the user how to view a copy of this",
+ " License. (Exception: if the Program itself is interactive but",
+ " does not normally print such an announcement, your work based on",
+ " the Program is not required to print an announcement.)",
+ "
",
+ "These requirements apply to the modified work as a whole. If",
+ "identifiable sections of that work are not derived from the Program,",
+ "and can be reasonably considered independent and separate works in",
+ "themselves, then this License, and its terms, do not apply to those",
+ "sections when you distribute them as separate works. But when you",
+ "distribute the same sections as part of a whole which is a work based",
+ "on the Program, the distribution of the whole must be on the terms of",
+ "this License, whose permissions for other licensees extend to the",
+ "entire whole, and thus to each and every part regardless of who wrote it.",
+ "",
+ "Thus, it is not the intent of this section to claim rights or contest",
+ "your rights to work written entirely by you; rather, the intent is to",
+ "exercise the right to control the distribution of derivative or",
+ "collective works based on the Program.",
+ "",
+ "In addition, mere aggregation of another work not based on the Program",
+ "with the Program (or with a work based on the Program) on a volume of",
+ "a storage or distribution medium does not bring the other work under",
+ "the scope of this License.",
+ "",
+ " 3. You may copy and distribute the Program (or a work based on it,",
+ "under Section 2) in object code or executable form under the terms of",
+ "Sections 1 and 2 above provided that you also do one of the following:",
+ "",
+ " a) Accompany it with the complete corresponding machine-readable",
+ " source code, which must be distributed under the terms of Sections",
+ " 1 and 2 above on a medium customarily used for software interchange; or,",
+ "",
+ " b) Accompany it with a written offer, valid for at least three",
+ " years, to give any third party, for a charge no more than your",
+ " cost of physically performing source distribution, a complete",
+ " machine-readable copy of the corresponding source code, to be",
+ " distributed under the terms of Sections 1 and 2 above on a medium",
+ " customarily used for software interchange; or,",
+ "",
+ " c) Accompany it with the information you received as to the offer",
+ " to distribute corresponding source code. (This alternative is",
+ " allowed only for noncommercial distribution and only if you",
+ " received the program in object code or executable form with such",
+ " an offer, in accord with Subsection b above.)",
+ "",
+ "The source code for a work means the preferred form of the work for",
+ "making modifications to it. For an executable work, complete source",
+ "code means all the source code for all modules it contains, plus any",
+ "associated interface definition files, plus the scripts used to",
+ "control compilation and installation of the executable. However, as a",
+ "special exception, the source code distributed need not include",
+ "anything that is normally distributed (in either source or binary",
+ "form) with the major components (compiler, kernel, and so on) of the",
+ "operating system on which the executable runs, unless that component",
+ "itself accompanies the executable.",
+ "",
+ "If distribution of executable or object code is made by offering",
+ "access to copy from a designated place, then offering equivalent",
+ "access to copy the source code from the same place counts as",
+ "distribution of the source code, even though third parties are not",
+ "compelled to copy the source along with the object code.",
+ "
",
+ " 4. You may not copy, modify, sublicense, or distribute the Program",
+ "except as expressly provided under this License. Any attempt",
+ "otherwise to copy, modify, sublicense or distribute the Program 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.",
+ "",
+ " 5. You are not required to accept this License, since you have not",
+ "signed it. However, nothing else grants you permission to modify or",
+ "distribute the Program or its derivative works. These actions are",
+ "prohibited by law if you do not accept this License. Therefore, by",
+ "modifying or distributing the Program (or any work based on the",
+ "Program), you indicate your acceptance of this License to do so, and",
+ "all its terms and conditions for copying, distributing or modifying",
+ "the Program or works based on it.",
+ "",
+ " 6. Each time you redistribute the Program (or any work based on the",
+ "Program), the recipient automatically receives a license from the",
+ "original licensor to copy, distribute or modify the Program subject to",
+ "these terms and conditions. You may not impose any further",
+ "restrictions on the recipients' exercise of the rights granted herein.",
+ "You are not responsible for enforcing compliance by third parties to",
+ "this License.",
+ "",
+ " 7. If, as a consequence of a court judgment or allegation of patent",
+ "infringement or for any other reason (not limited to patent issues),",
+ "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",
+ "distribute so as to satisfy simultaneously your obligations under this",
+ "License and any other pertinent obligations, then as a consequence you",
+ "may not distribute the Program at all. For example, if a patent",
+ "license would not permit royalty-free redistribution of the Program by",
+ "all those who receive copies directly or indirectly through you, then",
+ "the only way you could satisfy both it and this License would be to",
+ "refrain entirely from distribution of the Program.",
+ "",
+ "If any portion of this section is held invalid or unenforceable under",
+ "any particular circumstance, the balance of the section is intended to",
+ "apply and the section as a whole is intended to apply in other",
+ "circumstances.",
+ "",
+ "It is not the purpose of this section to induce you to infringe any",
+ "patents or other property right claims or to contest validity of any",
+ "such claims; this section has the sole purpose of protecting the",
+ "integrity of the free software distribution system, which is",
+ "implemented by public license practices. Many people have made",
+ "generous contributions to the wide range of software distributed",
+ "through that system in reliance on consistent application of that",
+ "system; it is up to the author/donor to decide if he or she is willing",
+ "to distribute software through any other system and a licensee cannot",
+ "impose that choice.",
+ "",
+ "This section is intended to make thoroughly clear what is believed to",
+ "be a consequence of the rest of this License.",
+ "
",
+ " 8. If the distribution and/or use of the Program is restricted in",
+ "certain countries either by patents or by copyrighted interfaces, the",
+ "original copyright holder who places the Program under this License",
+ "may add an explicit geographical distribution limitation excluding",
+ "those countries, so that distribution is permitted only in or among",
+ "countries not thus excluded. In such case, this License incorporates",
+ "the limitation as if written in the body of this License.",
+ "",
+ " 9. The Free Software Foundation may publish revised and/or new versions",
+ "of the 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 a version number of this License which applies to it and \"any",
+ "later version\", you have the option of following the terms and conditions",
+ "either of that version or of any later version published by the Free",
+ "Software Foundation. If the Program does not specify a version number of",
+ "this License, you may choose any version ever published by the Free Software",
+ "Foundation.",
+ "",
+ " 10. If you wish to incorporate parts of the Program into other free",
+ "programs whose distribution conditions are different, write to the author",
+ "to ask for permission. For software which is copyrighted by the Free",
+ "Software Foundation, write to the Free Software Foundation; we sometimes",
+ "make exceptions for this. Our decision will be guided by the two goals",
+ "of preserving the free status of all derivatives of our free software and",
+ "of promoting the sharing and reuse of software generally.",
+ "",
+ "\t\t\t NO WARRANTY",
+ "",
+ " 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.",
+ "",
+ " 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING",
+ "WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR",
+ "REDISTRIBUTE 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.",
+ "",
+ "\t\t END OF TERMS AND CONDITIONS",
+ "
",
+ "\t 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",
+ "convey 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 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA",
+ "",
+ "",
+ "Also add information on how to contact you by electronic and paper mail.",
+ "",
+ "If the program is interactive, make it output a short notice like this",
+ "when it starts in an interactive mode:",
+ "",
+ " Gnomovision version 69, Copyright (C) year name of author",
+ " Gnomovision 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, the commands you use may",
+ "be called something other than `show w' and `show c'; they could even be",
+ "mouse-clicks or menu items--whatever suits your program.",
+ "",
+ "You should also get your employer (if you work as a programmer) or your",
+ "school, if any, to sign a \"copyright disclaimer\" for the program, if",
+ "necessary. Here is a sample; alter the names:",
+ "",
+ " Yoyodyne, Inc., hereby disclaims all copyright interest in the program",
+ " `Gnomovision' (which makes passes at compilers) written by James Hacker.",
+ "",
+ " <signature of Ty Coon>, 1 April 1989",
+ " Ty Coon, President of Vice",
+ "",
+ "This 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 Library General",
+ "Public License instead of this License.",
+ 0};
diff --git a/src/CREDITS.cc.dist b/src/CREDITS.cc.dist
new file mode 100644
index 0000000..7c0bc6a
--- /dev/null
+++ b/src/CREDITS.cc.dist
@@ -0,0 +1,224 @@
+extern const char* const CREDITS_array[] = {
+ "",
+ "Authors",
+ "=======",
+ "",
+ "The Parma Polyhedra Library and its documentation is being designed,",
+ "written, debugged and improved by the following people:",
+ "",
+ "",
+ "Current core development team:",
+ "------------------------------",
+ "",
+ " Roberto Bagnara [1] (University of Parma)",
+ " Patricia M. Hill [2] (University of Leeds)",
+ " Enea Zaffanella [3] (University of Parma)",
+ "",
+ "",
+ "Former members of the core development team:",
+ "--------------------------------------------",
+ "",
+ " Elisa Ricci (former student of the University of Parma) has",
+ " been a major contributor to the development of",
+ " the PPL, up until December 2002.",
+ "",
+ "",
+ "Current contributors:",
+ "---------------------",
+ "",
+ " Abramo Bagnara (Opera Unica) rewrote and generalized the",
+ " support for checked coefficients. He also",
+ " wrote the support for extended numbers and is",
+ " currently writing a new implementation of",
+ " intervals. He also helps on other design and",
+ " implementation issues.",
+ "",
+ " Andrea Cimino (University of Parma) wrote the initial version",
+ " of our primal simplex solver. He is still",
+ " working on its refinement and optimization.",
+ "",
+ " Katy Dobson [4] (University of Leeds) is working on the",
+ " formalization and definition of algorithms",
+ " for rational grids.",
+ "",
+ " Elena Mazzi (University of Parma) has been working on our",
+ " first implementation of bounded differences",
+ " and octagons. She also participated in the",
+ " theoretical and practical work concerning",
+ " widening operators for weakly relational",
+ " domains. She is still working on this.",
+ "",
+ " David Merchat [5] (University of Parma) is helping us with",
+ " the generation of the library's documentation",
+ " using Doxygen.",
+ "",
+ " Matthew Mundell [6] (University of Leeds) is working on the",
+ " implementation of rational grids. He also",
+ " helps on other implementation issues.",
+ "",
+ " Andrea Pescetti (University of Parma) is helping with the",
+ " library's documentation. Andrea was also one",
+ " of the four students with which the PPL",
+ " project started.",
+ "",
+ " Barbara Quartieri (University of Parma) is working on the",
+ " implementation of bounded differences",
+ " and octagons.",
+ "",
+ " Alessandro Zaccagnini [7] (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:",
+ "------------------",
+ "",
+ " Irene Bacchi (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.",
+ "",
+ " Danilo Bonardi (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.",
+ "",
+ " Giordano Fracasso (University of Parma) wrote the initial version",
+ " of the support for native and checked integer",
+ " coefficients.",
+ "",
+ " Maximiliano Marchesi (University of Parma) helped to improve the",
+ " documentation for bounded differences.",
+ "",
+ " Angela Stazzone (former student of the University of Parma)",
+ " worked on the library's documentation.",
+ "",
+ "",
+ " Fabio Trabucchi (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 (University of Pisa) worked 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!",
+ "=======",
+ "",
+ "The following people have given important help to the project:",
+ "",
+ " 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.",
+ "",
+ " Marco Comini [8] (University of Udine) allowed us to use his",
+ " Mac OS X machine to work on portability to",
+ " that platform.",
+ "",
+ " Bruno Haible [9] (ILOG) made it possible (by writing the",
+ " AC_LIB_LINKFLAGS macro and explaining how",
+ " to use it) to allow the use of versions of the",
+ " GMP library installed into nonstandard places.",
+ "",
+ " Bertrand Jeannet [10] (IRISA) wrote the New Polka library [11]",
+ " and made it available.",
+ "",
+ " Herve' Le Verge (r.i.p.) wrote and published an implementation",
+ " [12] of the Chernikova's algorithm [13] that",
+ " has set the stage for subsequent",
+ " implementation work, including our own.",
+ "",
+ " Francesco Logozzo [14] (Ecole Polytechnique) helped us straighten",
+ " out some portability issues on Cygwin.",
+ "",
+ " Costantino Medori [15] (University of Parma) helped us on the",
+ " mathematical aspects of the development.",
+ "",
+ " Fred Mesnard [16] (University of La Reunion), the main author",
+ " of cTI [17], has worked with us at 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 [18] 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 them to",
+ " analyze the same Prolog programs. Since that",
+ " systems did not share a single line of code,",
+ " this gave us excellent opportunities for our",
+ " initial testing and debugging work.",
+ "",
+ "",
+ "This work has been partly supported by the following projects and",
+ "organizations:",
+ "",
+ " 1. University of Parma's FIL scientific research project (ex 60%)",
+ " ``Pure and Applied Mathematics'';",
+ "",
+ " 2. MURST project ``Automatic Program Certification by Abstract",
+ " Interpretation'' [19];",
+ "",
+ " 3. MURST project ``Abstract Interpretation, Type Systems and",
+ " Control-Flow Analysis''.",
+ "",
+ " 4. MURST project ``Automatic Aggregate- and Number-Reasoning for",
+ " Computing: from Decision Algorithms to Constraint Programming",
+ " with Multisets, Sets, and Maps'' [20].",
+ "",
+ " 5. MURST project ``Constraint Based Verification of Reactive",
+ " Systems'' [21].",
+ "",
+ " 6. MURST project ``AIDA - Abstract Interpretation: Design and",
+ " Applications'' [22].",
+ "",
+ " 7. Royal Society Joint project 2004/R1-EU (UK-Italy)",
+ " ``Automatic Detection of Unstable Numerical Computations''.",
+ "",
+ " 8. EPSRC (UK) project EP/C520726/1",
+ " ``Numerical Domains for Software Analysis'' [23].",
+ "",
+ "--------",
+ "",
+ " [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.comp.leeds.ac.uk/katyd/",
+ " [5] http://www.cs.unipr.it/~merchat/",
+ " [6] http://www.mundell.ukfsn.org/",
+ " [7] http://www.math.unipr.it/~zaccagni/",
+ " [8] http://www.dimi.uniud.it/~comini/",
+ " [9] http://www.haible.de/bruno/",
+ "[10] http://www.irisa.fr/prive/Bertrand.Jeannet/",
+ "[11] http://www.irisa.fr/prive/Bertrand.Jeannet/newpolka.html",
+ "[12] http://www.cs.unipr.it/ppl/Documentation/chernikova.c",
+ "[13] http://www.cs.unipr.it/ppl/Documentation/bibliography#LeVerge92",
+ "[14] http://www.enseignement.polytechnique.fr/profs/informatique/Francesco.Logozzo/",
+ "[15] http://www.math.unipr.it/~medori/",
+ "[16] http://www.univ-reunion.fr/~fred/",
+ "[17] http://www.cs.unipr.it/cTI/",
+ "[18] http://www.cs.unipr.it/China/",
+ "[19] http://theory.sci.univr.it/p40/",
+ "[20] http://www.cs.unipr.it/Projects/COFIN01",
+ "[21] http://www.disi.unige.it/person/DelzannoG/cover/",
+ "[22] http://www.cs.unipr.it/Projects/AIDA/",
+ "[23] http://www.comp.leeds.ac.uk/hill/linda/",
+ 0};
diff --git a/src/C_Polyhedron.cc b/src/C_Polyhedron.cc
new file mode 100644
index 0000000..4dcb67b
--- /dev/null
+++ b/src/C_Polyhedron.cc
@@ -0,0 +1,71 @@
+/* C_Polyhedron class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "C_Polyhedron.defs.hh"
+#include "NNC_Polyhedron.defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::C_Polyhedron::C_Polyhedron(const NNC_Polyhedron& y)
+ : 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;
+ add_constraint(c.is_strict_inequality() ? (Linear_Expression(c) >= 0) : c);
+ }
+ assert(OK());
+}
+
+PPL::C_Polyhedron::C_Polyhedron(const Congruence_System& cgs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ cgs.space_dimension() <= max_space_dimension()
+ ? cgs.space_dimension()
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"), 0),
+ UNIVERSE) {
+ add_congruences(cgs);
+}
+
+PPL::C_Polyhedron::C_Polyhedron(Congruence_System& cgs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ cgs.space_dimension() <= max_space_dimension()
+ ? cgs.space_dimension()
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"), 0),
+ UNIVERSE) {
+ add_congruences(cgs);
+}
+
+bool
+PPL::C_Polyhedron::poly_hull_assign_if_exact(const C_Polyhedron& q) {
+ return PPL::poly_hull_assign_if_exact(*this, q);
+}
diff --git a/src/C_Polyhedron.defs.hh b/src/C_Polyhedron.defs.hh
new file mode 100644
index 0000000..7dc1d7f
--- /dev/null
+++ b/src/C_Polyhedron.defs.hh
@@ -0,0 +1,213 @@
+/* C_Polyhedron class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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"
+
+//! 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 will be
+ recycled to build the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints contains strict inequalities.
+ */
+ explicit C_Polyhedron(Constraint_System& cs);
+
+ //! 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 will be
+ recycled to build 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(Generator_System& gs);
+
+ //! 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. It is not
+ declared <CODE>const</CODE> because its data-structures will be
+ recycled to build the polyhedron.
+ */
+ explicit C_Polyhedron(const Congruence_System& cgs);
+
+ //! Builds an 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 will be
+ recycled to build the polyhedron.
+ */
+ explicit C_Polyhedron(Congruence_System& cgs);
+
+ /*! \brief
+ Builds a C polyhedron representing the topological closure
+ of the NNC polyhedron \p y.
+ */
+ explicit C_Polyhedron(const NNC_Polyhedron& y);
+
+ //! Builds a C polyhedron out of a generic, interval-based bounding box.
+ /*!
+ For a description of the methods that should be provided by
+ the template class Box, see the documentation of the protected method:
+ template \<typename Box\>
+ Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+ \param box
+ The bounding box representing the polyhedron to be built;
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one from the other
+ constructors.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p box has intervals that are not topologically closed
+ (i.e., having some finite but open bounds).
+ */
+ template <typename Box>
+ C_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+ //! Ordinary copy-constructor.
+ C_Polyhedron(const C_Polyhedron& y);
+
+ /*! \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);
+};
+
+#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..75efd0d
--- /dev/null
+++ b/src/C_Polyhedron.inlines.hh
@@ -0,0 +1,135 @@
+/* C_Polyhedron class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NECESSARILY_CLOSED,
+ num_dimensions <= max_space_dimension()
+ ? num_dimensions
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ num_dimensions),
+ kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)){
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)){
+}
+
+template <typename Box>
+inline
+C_Polyhedron::C_Polyhedron(const Box& box, From_Bounding_Box)
+ : Polyhedron(NECESSARILY_CLOSED,
+ box.space_dimension() <= max_space_dimension()
+ ? box
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(box): ",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension"), box)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y)
+ : 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);
+ swap(c_y);
+ return *this;
+}
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+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..b048063
--- /dev/null
+++ b/src/C_Polyhedron.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Checked_Number.cc b/src/Checked_Number.cc
new file mode 100644
index 0000000..58b7ba9
--- /dev/null
+++ b/src/Checked_Number.cc
@@ -0,0 +1,89 @@
+/* Checked_Number class implementation
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Checked_Number.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+Minus_Infinity MINUS_INFINITY;
+Plus_Infinity PLUS_INFINITY;
+Not_A_Number NOT_A_NUMBER;
+
+void
+throw_result_exception(Result r) {
+ switch (r) {
+ 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 VC_MINUS_INFINITY:
+ throw std::overflow_error("Minus infinity.");
+ case V_NEG_OVERFLOW:
+ throw std::overflow_error("Negative overflow.");
+ case V_UNKNOWN_NEG_OVERFLOW:
+ throw std::overflow_error("Unknown result due to negative overflow.");
+ case VC_PLUS_INFINITY:
+ throw std::overflow_error("Plus infinity.");
+ case V_POS_OVERFLOW:
+ throw std::overflow_error("Positive overflow.");
+ case V_UNKNOWN_POS_OVERFLOW:
+ throw std::overflow_error("Unknown result due to positive overflow.");
+ 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.");
+ case V_UNORD_COMP:
+ throw std::domain_error("Unordered comparison.");
+ 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..ca73522
--- /dev/null
+++ b/src/Checked_Number.defs.hh
@@ -0,0 +1,913 @@
+/* Checked_Number class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Checked_Number_defs_hh
+#define PPL_Checked_Number_defs_hh 1
+
+#include "Checked_Number.types.hh"
+#include "checked.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Transparent_Policy {
+ //! Checks for overflowed result.
+ static const int check_overflow = 0;
+
+ //! Checks for attempts to add infinities with different sign.
+ static const int check_inf_add_inf = 0;
+
+ //! Checks for attempts to sub infinities with same sign.
+ static const int check_inf_sub_inf = 0;
+
+ //! Checks for attempts to mul infinities by zero.
+ static const int check_inf_mul_zero = 0;
+
+ //! Checks for attempts to divide by zero.
+ static const int check_div_zero = 0;
+
+ //! Checks for attempts to divide infinities.
+ static const int check_inf_div_inf = 0;
+
+ //! Checks for attempts to compute remainder of infinities.
+ static const int check_inf_mod = 0;
+
+ //! Checks for attempts to take the square root of a negative number.
+ static const int check_sqrt_neg = 0;
+
+ //! Handles not-a-number special value.
+ static const int handle_nan = 0;
+
+ //! Handles infinity special values.
+ static const int handle_infinity = 0;
+
+ //! Representation is identical to primitive.
+ static const int convertible = 1;
+
+ //! Checks for FPU inexact result.
+ static const int fpu_check_inexact = 0;
+
+ //! Checks for NaN arguments
+ static const int check_nan_args = 0;
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Default_Policy {
+ static const int check_overflow = 1;
+ static const int check_inf_add_inf = 0;
+ static const int check_inf_sub_inf = 0;
+ static const int check_inf_mul_zero = 0;
+ static const int check_div_zero = 0;
+ static const int check_inf_div_inf = 0;
+ static const int check_inf_mod = 0;
+ static const int check_sqrt_neg = 0;
+ static const int handle_nan = 0;
+ static const int handle_infinity = 0;
+ static const int convertible = 1;
+ static const int fpu_check_inexact = 0;
+ static const int check_nan_args = 1;
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Extended_Number_Policy {
+ static const int check_overflow = 1;
+ static const int check_inf_add_inf = 0;
+ static const int check_inf_sub_inf = 0;
+ static const int check_inf_mul_zero = 0;
+ static const int check_div_zero = 0;
+ static const int check_inf_div_inf = 0;
+ static const int check_inf_mod = 0;
+ static const int check_sqrt_neg = 0;
+ static const int handle_nan = 1;
+ static const int handle_infinity = 1;
+ // Don't uncomment the following.
+ // The compile time error on conversions is the expected behaviour.
+ // static const int convertible = 0;
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ static const int fpu_check_inexact = 1;
+#else
+ static const int fpu_check_inexact = 0;
+#endif
+ static const int check_nan_args = 1;
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
+ static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
+ // Don't uncomment the following.
+ // The compile time error is the expected behaviour.
+ // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
+ static void handle_result(Result r);
+};
+
+typedef Checked::Check_Overflow_Policy Default_To_Policy;
+typedef Checked_Number_Transparent_Policy Default_From_Policy;
+
+template <typename T>
+struct Native_Checked_From_Wrapper {
+ typedef Default_From_Policy Policy;
+ static const T& raw_value(const T& v) {
+ return v;
+ }
+};
+
+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();
+ }
+};
+
+template <typename T>
+struct Native_Checked_To_Wrapper {
+ typedef Default_To_Policy Policy;
+ static T& raw_value(T& v) {
+ return v;
+ }
+};
+
+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();
+ }
+};
+
+//! 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 signed char and rounding mode.
+ Checked_Number(const signed char y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed short and rounding mode.
+ Checked_Number(const signed short y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed int and rounding mode.
+ Checked_Number(const signed int y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long and rounding mode.
+ Checked_Number(const signed long y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long long and rounding mode.
+ Checked_Number(const signed long long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned char and rounding mode.
+ Checked_Number(const unsigned char y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned short and rounding mode.
+ Checked_Number(const unsigned short y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned int and rounding mode.
+ Checked_Number(const unsigned int y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long and rounding mode.
+ Checked_Number(const unsigned long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long long and rounding mode.
+ Checked_Number(const unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+ //! Direct initialization from a float and rounding mode.
+ Checked_Number(const float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+ //! Direct initialization from a double and rounding mode.
+ Checked_Number(const double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+ //! Direct initialization from a long double and rounding mode.
+ Checked_Number(const 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 minus infinity and rounding mode.
+ Checked_Number(const Minus_Infinity& y, Rounding_Dir dir);
+
+ //! Direct initialization from plus infinity and rounding mode.
+ Checked_Number(const Plus_Infinity& y, Rounding_Dir dir);
+
+ //! Direct initialization from NAN and rounding mode.
+ Checked_Number(const Not_A_Number& y, Rounding_Dir dir);
+
+ //! 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 signed char, default rounding mode.
+ Checked_Number(const signed char y);
+
+ //! Direct initialization from a signed short, default rounding mode.
+ Checked_Number(const signed short y);
+
+ //! Direct initialization from a signed int, default rounding mode.
+ Checked_Number(const signed int y);
+
+ //! Direct initialization from a signed long, default rounding mode.
+ Checked_Number(const signed long y);
+
+ //! Direct initialization from a signed long long, default rounding mode.
+ Checked_Number(const signed long long y);
+
+ //! Direct initialization from an unsigned char, default rounding mode.
+ Checked_Number(const unsigned char y);
+
+ //! Direct initialization from an unsigned short, default rounding mode.
+ Checked_Number(const unsigned short y);
+
+ //! Direct initialization from an unsigned int, default rounding mode.
+ Checked_Number(const unsigned int y);
+
+ //! Direct initialization from an unsigned long, default rounding mode.
+ Checked_Number(const unsigned long y);
+
+ //! Direct initialization from an unsigned long long, default rounding mode.
+ Checked_Number(const unsigned long long y);
+
+ //! Direct initialization from a float, default rounding mode.
+ Checked_Number(const float y);
+
+ //! Direct initialization from a double, default rounding mode.
+ Checked_Number(const double y);
+
+ //! Direct initialization from a long double, default rounding mode.
+ Checked_Number(const 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 minus infinity, default rounding mode.
+ Checked_Number(const Minus_Infinity& y);
+
+ //! Direct initialization from plus infinity, default rounding mode.
+ Checked_Number(const Plus_Infinity& y);
+
+ //! Direct initialization from NAN, default rounding mode.
+ Checked_Number(const Not_A_Number& y);
+
+ //@} // 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, typename From_Policy>
+ Checked_Number& operator=(const Checked_Number<From, From_Policy>& y);
+
+ //! Assignment operator.
+ template <typename From>
+ Checked_Number& operator=(const From& y);
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Not_A_Number& y);
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Minus_Infinity& y);
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Plus_Infinity& 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 From_Policy>
+ Checked_Number& operator+=(const Checked_Number<From, From_Policy>& y);
+
+ template <typename From>
+ Checked_Number& 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 From_Policy>
+ Checked_Number& operator-=(const Checked_Number<From, From_Policy>& y);
+
+ //! Subtract and assign operator.
+ template <typename From>
+ Checked_Number& 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);
+ template <typename From, typename From_Policy>
+
+ //! Multiply and assign operator.
+ Checked_Number& operator*=(const Checked_Number<From, From_Policy>& y);
+
+ //! Multiply and assign operator.
+ template <typename From>
+ Checked_Number& 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 From_Policy>
+ Checked_Number& operator/=(const Checked_Number<From, From_Policy>& y);
+
+ //! Divide and assign operator.
+ template <typename From>
+ Checked_Number& 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 From_Policy>
+ Checked_Number& operator%=(const Checked_Number<From, From_Policy>& y);
+
+ //! Compute remainder and assign operator.
+ template <typename From>
+ Checked_Number& 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;
+};
+
+template <typename T, typename Policy>
+bool is_not_a_number(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_minus_infinity(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_plus_infinity(const Checked_Number<T, Policy>& x);
+
+template <typename To>
+Result assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const char* x, Rounding_Dir dir);
+template <typename To, typename To_Policy>
+Result assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, Rounding_Dir dir);
+
+FUNC1(assign_r)
+FUNC1(neg_assign_r)
+FUNC1(abs_assign_r)
+FUNC1(sqrt_assign_r)
+
+#undef FUNC1
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, int exp, Rounding_Dir dir);
+
+FUNC1(mul2exp_assign_r)
+FUNC1(div2exp_assign_r)
+
+#undef FUNC1
+
+#define FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+Result name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+FUNC2(add_assign_r)
+FUNC2(sub_assign_r)
+FUNC2(mul_assign_r)
+FUNC2(div_assign_r)
+FUNC2(rem_assign_r)
+FUNC2(gcd_assign_r)
+FUNC2(lcm_assign_r)
+FUNC2(add_mul_assign_r)
+FUNC2(sub_mul_assign_r)
+
+#undef FUNC2
+
+#define FUNC4(name) \
+template <typename To1, typename From1, typename From2, \
+ typename To2, typename To3> \
+Result name(To1& to, const From1& x, const From2& y, \
+ To2& s, To3& t, Rounding_Dir dir);
+
+FUNC4(gcdext_assign_r)
+
+#undef FUNC4
+
+//! Swaps \p *this with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+const T&
+raw_value(const Checked_Number<T, Policy>& x);
+
+//! Returns a reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+T&
+raw_value(Checked_Number<T, Policy>& x);
+
+//@} // 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>
+size_t
+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>
+size_t
+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 its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! 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,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z,
+ Checked_Number<T, Policy>& s,
+ Checked_Number<T, Policy>& t);
+
+//! 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);
+
+/*! \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 Policy1,
+ typename T2, typename Policy2>
+bool
+operator==(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator!=(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator>=(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator>(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator<=(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator<(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& 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 T, typename Policy>
+int
+sgn(const Checked_Number<T, Policy>& 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 T1, typename Policy1,
+ typename T2, typename Policy2>
+int
+cmp(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Result
+output(std::ostream& os,
+ const Checked_Number<T, Policy>& x,
+ const Numeric_Format& fmt,
+ 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);
+
+//! 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>;
+ - 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 : unum | '+'
+ | SIGN unum ;
+
+unum : unum1 EXP : 'e'
+ | HEX unum1 | '*^'
+ | base BASE unum1 ;
+ ;
+ POINT : '.'
+unum1 : 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 Policy>
+Result
+input(std::istream& is, Checked_Number<T, Policy>& x, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//@} // 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();
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Checked_Number.inlines.hh"
+#include "checked_numeric_limits.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..0445da2
--- /dev/null
+++ b/src/Checked_Number.inlines.hh
@@ -0,0 +1,820 @@
+/* Checked_Number class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Checked_Number_inlines_hh
+#define PPL_Checked_Number_inlines_hh 1
+
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ return ROUND_DIRECT;
+#else
+ return ROUND_IGNORE;
+#endif
+ }
+ return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED && !is_special(r)) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ // FIXME: this is wrong. If an overflow happens the Result may be
+ // V_LT or V_GT. What's the better way to cope with that?
+ assert(r == V_EQ);
+#else
+ return V_EQ;
+#endif
+ }
+ return r;
+}
+
+
+inline void
+Checked_Number_Transparent_Policy::handle_result(Result) {
+}
+
+inline void
+Checked_Number_Default_Policy::handle_result(Result r) {
+ if (is_special(r))
+ throw_result_exception(r);
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+ if (is_special(r))
+ 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>(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 DEF_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x, Rounding_Dir dir) { \
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+} \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x) { \
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+}
+
+#define COND_0(...)
+#define COND_1(...) __VA_ARGS__
+#define COND_(if, ...) COND_##if(__VA_ARGS__)
+#define COND(if, ...) COND_(if, __VA_ARGS__)
+
+DEF_CTOR(signed char)
+DEF_CTOR(signed short)
+DEF_CTOR(signed int)
+DEF_CTOR(signed long)
+DEF_CTOR(signed long long)
+DEF_CTOR(unsigned char)
+DEF_CTOR(unsigned short)
+DEF_CTOR(unsigned int)
+DEF_CTOR(unsigned long)
+DEF_CTOR(unsigned long long)
+COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float))
+COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double))
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double))
+DEF_CTOR(mpq_class&)
+DEF_CTOR(mpz_class&)
+
+#undef DEF_CTOR
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x, Rounding_Dir dir) {
+ std::istringstream s(x);
+ 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* x) {
+ std::istringstream s(x);
+ 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>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x) {
+ // TODO: avoid default construction of value member
+ Rounding_Dir dir = ROUND_IGNORE;
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x) {
+ // TODO: avoid default construction of value member
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x) {
+ // TODO: avoid default construction of value member
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T>
+inline bool
+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 bool
+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 bool
+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 bool
+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 Checked::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 Checked::external_memory_in_bytes(x.raw_value());
+}
+
+template <typename To>
+inline Result
+assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir) {
+ return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir) {
+ return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir) {
+ return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+
+template <typename To>
+inline Result
+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 FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+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); \
+}
+
+FUNC1(construct, construct_ext)
+FUNC1(assign_r, assign_ext)
+FUNC1(neg_assign_r, neg_ext)
+FUNC1(abs_assign_r, abs_ext)
+FUNC1(sqrt_assign_r, sqrt_ext)
+
+#undef FUNC1
+
+#define FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+name(To& to, const From& x, 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); \
+}
+
+FUNC1(mul2exp_assign_r, mul2exp_ext)
+FUNC1(div2exp_assign_r, div2exp_ext)
+
+#undef FUNC1
+
+#define FUNC2(name, func) \
+template <typename To, \
+ typename From1, \
+ typename From2> \
+inline Result \
+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); \
+}
+
+FUNC2(add_assign_r, add_ext)
+FUNC2(sub_assign_r, sub_ext)
+FUNC2(mul_assign_r, mul_ext)
+FUNC2(div_assign_r, div_ext)
+FUNC2(rem_assign_r, rem_ext)
+FUNC2(gcd_assign_r, gcd_ext)
+FUNC2(lcm_assign_r, lcm_ext)
+FUNC2(add_mul_assign_r, add_mul_ext)
+FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef FUNC2
+
+#define FUNC4(name, func) \
+template <typename To1, \
+ typename From1, \
+ typename From2, \
+ typename To2, \
+ typename To3> \
+inline Result \
+name(To1& to, const From1& x, const From2& y, To2& s, To3& t, \
+ Rounding_Dir dir) { \
+ return \
+ check_result \
+ (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy, \
+ typename Native_Checked_From_Wrapper<From1>::Policy, \
+ typename Native_Checked_From_Wrapper<From2>::Policy, \
+ typename Native_Checked_To_Wrapper<To2>::Policy, \
+ typename Native_Checked_To_Wrapper<To3>::Policy> \
+ (Native_Checked_To_Wrapper<To1>::raw_value(to), \
+ Native_Checked_From_Wrapper<From1>::raw_value(x), \
+ Native_Checked_From_Wrapper<From2>::raw_value(y), \
+ Native_Checked_To_Wrapper<To2>::raw_value(s), \
+ Native_Checked_To_Wrapper<To3>::raw_value(t), \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef FUNC4
+
+#define DEF_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;\
+}
+
+DEF_INCREMENT(operator ++, add_assign_r)
+DEF_INCREMENT(operator --, sub_assign_r)
+
+#undef DEF_INCREMENT
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+ std::swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+ Checked::copy<Policy>(v, y.raw_value());
+ return *this;
+}
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>
+::operator=(const Checked_Number<From, From_Policy>& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+ 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;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Not_A_Number& y) {
+ Policy::handle_result(assign_r(*this, y, ROUND_IGNORE));
+ return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Minus_Infinity& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+ return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Plus_Infinity& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+ return *this;
+}
+
+#define DEF_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, typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<From, From_Policy>& y) { \
+ Checked_Number<T, Policy> cy(y); \
+ Policy::handle_result(fun(*this, *this, cy, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline Checked_Number<T, Policy>& \
+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; \
+}
+
+DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef DEF_BINARY_OP_ASSIGN
+
+#define DEF_BINARY_OP_TYPE(f, fun, Type) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+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> \
+inline Checked_Number<T, Policy> \
+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; \
+}
+
+#define DEF_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+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; \
+} \
+DEF_BINARY_OP_TYPE(f, fun, signed char) \
+DEF_BINARY_OP_TYPE(f, fun, signed short) \
+DEF_BINARY_OP_TYPE(f, fun, signed int) \
+DEF_BINARY_OP_TYPE(f, fun, signed long) \
+DEF_BINARY_OP_TYPE(f, fun, signed long long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned char) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned short) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned int) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_BINARY_OP_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, long double)) \
+DEF_BINARY_OP_TYPE(f, fun, mpz_class&) \
+DEF_BINARY_OP_TYPE(f, fun, mpq_class&)
+
+DEF_BINARY_OP(operator +, add_assign_r)
+DEF_BINARY_OP(operator -, sub_assign_r)
+DEF_BINARY_OP(operator *, mul_assign_r)
+DEF_BINARY_OP(operator /, div_assign_r)
+DEF_BINARY_OP(operator %, rem_assign_r)
+
+#undef DEF_BINARY_OP_TYPE
+#undef DEF_BINARY_OP
+
+#define DEF_COMPARE_TYPE(f, fun, Type) \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Type x, const Checked_Number<From, From_Policy>& y) { \
+ return Checked::fun<Default_From_Policy, From_Policy>(x, y.raw_value()); \
+} \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Checked_Number<From, From_Policy>& x, const Type y) { \
+ return Checked::fun<From_Policy, Default_From_Policy>(x.raw_value(), y); \
+}
+
+#define DEF_COMPARE(f, fun) \
+template <typename T1, typename Policy1, \
+ typename T2, typename Policy2> \
+inline bool \
+f(const Checked_Number<T1, Policy1>& x, \
+ const Checked_Number<T2, Policy2>& y) { \
+ return Checked::fun<Policy1, Policy2>(x.raw_value(), y.raw_value()); \
+} \
+DEF_COMPARE_TYPE(f, fun, signed char) \
+DEF_COMPARE_TYPE(f, fun, signed short) \
+DEF_COMPARE_TYPE(f, fun, signed int) \
+DEF_COMPARE_TYPE(f, fun, signed long) \
+DEF_COMPARE_TYPE(f, fun, signed long long) \
+DEF_COMPARE_TYPE(f, fun, unsigned char) \
+DEF_COMPARE_TYPE(f, fun, unsigned short) \
+DEF_COMPARE_TYPE(f, fun, unsigned int) \
+DEF_COMPARE_TYPE(f, fun, unsigned long) \
+DEF_COMPARE_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_COMPARE_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_COMPARE_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_COMPARE_TYPE(f, fun, long double)) \
+DEF_COMPARE_TYPE(f, fun, mpz_class&) \
+DEF_COMPARE_TYPE(f, fun, mpq_class&)
+
+
+DEF_COMPARE(operator ==, eq_ext)
+DEF_COMPARE(operator !=, ne_ext)
+DEF_COMPARE(operator >=, ge_ext)
+DEF_COMPARE(operator >, gt_ext)
+DEF_COMPARE(operator <=, le_ext)
+DEF_COMPARE(operator <, lt_ext)
+
+#undef DEF_COMPARE_TYPE
+#undef DEF_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 DEF_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x) { \
+ Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+ Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+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 DEF_ASSIGN_FUN5_5(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+ const Checked_Number<T, Policy>& z, \
+ Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t) { \
+ Policy::handle_result(fun(x, y, z, s, t, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef DEF_ASSIGN_FUN2_1
+#undef DEF_ASSIGN_FUN2_2
+#undef DEF_ASSIGN_FUN3_2
+#undef DEF_ASSIGN_FUN3_3
+
+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 T, typename Policy>
+inline int
+sgn(const Checked_Number<T, Policy>& x) {
+ Result r = Checked::sgn_ext<Policy>(x.raw_value());
+ switch (r) {
+ case V_LT:
+ return -1;
+ case V_EQ:
+ return 0;
+ case V_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+inline int
+cmp(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y) {
+ Result r = Checked::cmp_ext<Policy1, Policy2>(x.raw_value(), y.raw_value());
+ switch (r) {
+ case V_LT:
+ return -1;
+ case V_EQ:
+ return 0;
+ case V_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Result
+output(std::ostream& os, const Checked_Number<T, Policy>& x,
+ const Numeric_Format& fmt, Rounding_Dir dir) {
+ return check_result(Checked::output_ext<Policy>(os,
+ x.raw_value(),
+ fmt,
+ 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 Policy>
+inline Result
+input(Checked_Number<T, Policy>& x, std::istream& is, Rounding_Dir dir) {
+ return check_result(Checked::input_ext<Policy>(x.raw_value(),
+ 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;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Checked_Number_inlines_hh)
diff --git a/src/Checked_Number.types.hh b/src/Checked_Number.types.hh
new file mode 100644
index 0000000..0f0ad38
--- /dev/null
+++ b/src/Checked_Number.types.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 Checked_Number_Default_Policy;
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy = Checked_Number_Default_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..f1983df
--- /dev/null
+++ b/src/Coefficient.cc
@@ -0,0 +1,25 @@
+/* Coefficient class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Coefficient.defs.hh"
diff --git a/src/Coefficient.defs.hh b/src/Coefficient.defs.hh
new file mode 100644
index 0000000..6355525
--- /dev/null
+++ b/src/Coefficient.defs.hh
@@ -0,0 +1,47 @@
+/* Coefficient class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Coefficient_defs_hh
+#define PPL_Coefficient_defs_hh 1
+
+#include "Coefficient.types.hh"
+#include <iosfwd>
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+#include "Checked_Number.defs.hh"
+#include "checked_int.inlines.hh"
+#endif
+
+#ifdef GMP_INTEGERS
+#include "GMP_Integer.defs.hh"
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+Coefficient_traits::const_reference Coefficient_zero();
+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..ae5535c
--- /dev/null
+++ b/src/Coefficient.inlines.hh
@@ -0,0 +1,42 @@
+/* Coefficient class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Coefficient_inlines_hh
+#define PPL_Coefficient_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+ static Coefficient z(0);
+ return z;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+ static Coefficient o(1);
+ return o;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Coefficient_inlines_hh)
diff --git a/src/Coefficient.types.hh b/src/Coefficient.types.hh
new file mode 100644
index 0000000..5d45236
--- /dev/null
+++ b/src/Coefficient.types.hh
@@ -0,0 +1,99 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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"
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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 // 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 // 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 // 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(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+#ifdef GMP_INTEGERS
+#include "GMP_Integer.types.hh"
+#endif
+
+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 its default
+ policy (Checked_Number_Default_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 COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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/Coefficient_traits_template.hh b/src/Coefficient_traits_template.hh
new file mode 100644
index 0000000..7dff40e
--- /dev/null
+++ b/src/Coefficient_traits_template.hh
@@ -0,0 +1,27 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_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 // 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/Congruence.cc b/src/Congruence.cc
new file mode 100644
index 0000000..a50c15d
--- /dev/null
+++ b/src/Congruence.cc
@@ -0,0 +1,251 @@
+/* Congruence class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Congruence.defs.hh"
+
+#include "Variable.defs.hh"
+#include <cassert>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence::Congruence(const Constraint& c)
+ : Row(c.is_equality()
+ ? c
+ : (throw_invalid_argument("Congruence(c)",
+ "constraint c must be an equality."),
+ c),
+ c.space_dimension() + 2,
+ compute_capacity(c.space_dimension() + 2, Row::max_size())) {
+
+ (*this)[size()-1] = 0;
+}
+
+PPL::Congruence::Congruence(const Constraint& c,
+ dimension_type sz, dimension_type capacity)
+ : Row(c.is_equality()
+ ? c
+ : (throw_invalid_argument("Congruence(c)",
+ "constraint c must be an equality."),
+ c),
+ sz,
+ capacity) {
+
+ (*this)[sz-1] = 0;
+}
+
+void
+PPL::Congruence::sign_normalize() {
+ Row& x = *this;
+ const dimension_type sz = x.size() - 1;
+ // `first_non_zero' indicates the index of the first
+ // coefficient of the row different from zero, disregarding
+ // the very first coefficient (inhomogeneous term).
+ dimension_type first_non_zero;
+ for (first_non_zero = 1; first_non_zero < sz; ++first_non_zero)
+ if (x[first_non_zero] != 0)
+ break;
+ if (first_non_zero < sz)
+ // If the first non-zero coefficient of the row is negative,
+ // negate all the coefficients and the inhomogeneous term.
+ if (x[first_non_zero] < 0) {
+ for (dimension_type j = first_non_zero; j < sz; ++j)
+ neg_assign(x[j]);
+ // Also negate the inhomogeneous term.
+ neg_assign(x[0]);
+ }
+}
+
+void
+PPL::Congruence::normalize() {
+ sign_normalize();
+
+ dimension_type sz = size();
+ if (sz == 0)
+ return;
+
+ Coefficient_traits::const_reference mod = modulus();
+ if (mod == 0)
+ return;
+
+ Coefficient& row_0 = (*this)[0];
+ // Factor the modulus out of the inhomogeneous term.
+ row_0 %= mod;
+ if (row_0 < 0)
+ // Make inhomogeneous term positive.
+ row_0 += mod;
+ return;
+}
+
+void
+PPL::Congruence::strong_normalize() {
+ normalize();
+ Row::normalize();
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+PPL::Congruence
+PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ // Ensure that diff is created with capacity for the modulus.
+ dimension_type dim, e1_dim, e2_dim;
+ e1_dim = e1.space_dimension();
+ e2_dim = e2.space_dimension();
+ if (e1_dim > e2_dim)
+ dim = e1_dim;
+ else
+ dim = e2_dim;
+ Linear_Expression diff(e1_dim > e2_dim ? e1 : e2,
+ dim + 2);
+ diff -= (e1_dim > e2_dim ? e2 : e1);
+ Congruence cg(diff, 1, false);
+ return cg;
+}
+
+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() << ".";
+ throw_invalid_argument(method, s.str().c_str());
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Congruence& c) {
+ const int num_variables = c.space_dimension();
+ bool first = true;
+ for (int v = 0; v < num_variables; ++v) {
+ Coefficient cv = c.coefficient(Variable(v));
+ if (cv != 0) {
+ 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 << PPL::Variable(v);
+ }
+ }
+ if (first)
+ s << Coefficient_zero();
+ s << " = " << -c.inhomogeneous_term();
+ if (c.is_proper_congruence())
+ s << " (mod " << c.modulus() << ")";
+ return s;
+}
+
+bool
+PPL::Congruence::is_trivial_true() const {
+ if ((is_equality() && inhomogeneous_term() == 0)
+ || (is_proper_congruence()
+ && (inhomogeneous_term() % modulus() == 0))) {
+ for (unsigned i = 1; i <= space_dimension(); i++)
+ if ((*this)[i] != 0)
+ return false;
+ return true;
+ }
+ return false;
+}
+
+bool
+PPL::Congruence::is_trivial_false() const {
+ if (inhomogeneous_term() == 0
+ || (is_proper_congruence()
+ && ((inhomogeneous_term() % modulus()) == 0)))
+ return false;
+ for (unsigned i = 1; i <= space_dimension(); i++)
+ if ((*this)[i] != 0)
+ return false;
+ return true;
+}
+
+void
+PPL::Congruence::ascii_dump(std::ostream& s) const {
+ const Row& x = *this;
+ dimension_type x_size = x.size();
+ for (dimension_type i = 0; i < x_size - 1; ++i)
+ s << x[i] << ' ';
+ if (x_size)
+ s << "m " << x[x_size - 1];
+ s << std::endl;
+}
+
+PPL_OUTPUT_DEFINITIONS(Congruence);
+
+bool
+PPL::Congruence::ascii_load(std::istream& s) {
+ std::string str;
+ Congruence& x = *this;
+ dimension_type col = 0;
+ while (col < x.size() - 1)
+ if (!(s >> x[col]))
+ return false;
+ else
+ col++;
+
+ if (!(s >> str) || str.compare("m"))
+ return false;
+
+ if (!(s >> x[col]))
+ return false;
+
+ 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;
+}
diff --git a/src/Congruence.defs.hh b/src/Congruence.defs.hh
new file mode 100644
index 0000000..d4f4059
--- /dev/null
+++ b/src/Congruence.defs.hh
@@ -0,0 +1,474 @@
+/* Congruence class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Congruence_defs_hh
+#define PPL_Congruence_defs_hh 1
+
+#include "Congruence.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Row.defs.hh"
+#include "Grid.types.hh"
+#include "Polyhedron.types.hh"
+#include "Variable.defs.hh"
+#include "Constraint.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Linear_Row.types.hh"
+#include "Congruence_System.defs.hh"
+#include <iosfwd>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+// Put this in the namespace here to declare it a friend later.
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+
+} // namespace IO_Operators
+
+// Put these in the namespace here to declare them friend later.
+
+//! 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);
+
+//! 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,
+ const 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,
+ const Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c,
+ const Coefficient_traits::const_reference m);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence */
+void
+swap(Parma_Polyhedra_Library::Congruence& x,
+ Parma_Polyhedra_Library::Congruence& y);
+
+} // namespace std
+
+//! 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;
+ Coefficient m = cg1.modulus();
+ if (m == 0)
+ cout << "Congruence cg1 is an equality." << endl;
+ else {
+ Linear_Expression e;
+ for (int i = cg1.space_dimension() - 1; i >= 0; --i)
+ 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 : private Row {
+public:
+ //! Ordinary copy-constructor.
+ Congruence(const Congruence& cg);
+
+ //! Copy-constructs (modulo 0) from equality constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p c is a relation.
+ */
+ explicit Congruence(const Constraint& c);
+
+ //! Destructor.
+ ~Congruence();
+
+ //! Assignment operator.
+ Congruence& operator=(const Congruence& cg);
+
+ //! 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;
+
+ //! 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;
+
+ //! 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/=(const Coefficient_traits::const_reference k);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a trivially
+ true congruence.
+
+ Trivially true congruences are of 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 n is the space dimension and m is the modulus.
+ */
+ bool is_trivial_true() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a trivially
+ false congruence.
+
+ Trivially false congruences have 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 congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+ where \f$b \neq 0 \pmod{m}\f$.
+ */
+ bool is_trivial_false() 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;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+ dimension \p dim.
+ */
+ bool is_equal_at_dimension(dimension_type dim,
+ const Congruence& cg) const;
+
+ /*! \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();
+
+ /*! \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;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation of the internal
+ representation of \p *this.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+protected:
+
+ //! 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 their syntaxes (as output by operator<<) are equal.
+ */
+ void strong_normalize();
+
+private:
+
+ //! Returns a reference to the modulus of \p *this.
+ Coefficient& modulus();
+
+ //! Marks this congruence as a linear equality.
+ void set_is_equality();
+
+ //! Negates the elements from index \p start to index \p end.
+ void negate(dimension_type start, dimension_type end);
+
+ //! Default constructor: private and not implemented.
+ Congruence();
+
+ //! Copy-constructs with specified size and capacity.
+ Congruence(const Congruence& cg,
+ dimension_type sz,
+ dimension_type capacity);
+
+ //! Constructs from a constraint, with specified size and capacity.
+ Congruence(const Constraint& c,
+ dimension_type sz,
+ dimension_type capacity);
+
+ //! Copy-constructs from \p cg, multiplying \p k into the 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$.
+ */
+ Congruence(const Congruence& cg, Coefficient_traits::const_reference k);
+
+ //! Constructs from Linear_Expression \p le, using modulus \p m.
+ /*!
+ Builds a congruence with modulus \p m, stealing the coefficients
+ from \p le.
+
+ \param le
+ The Linear_Expression holding the coefficients.
+
+ \param m
+ The modulus for the congruence.
+
+ \param capacity
+ If <CODE>true</CODE> then the size of the \p le row is expanded
+ and the modulus is stored in the extra space. In this case it is
+ assumed that \p le has spare capacity of at least one element.
+ If <CODE>false</CODE> then the modulus is stored in the last
+ element of the \p le row.
+ */
+ Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m,
+ bool capacity = true);
+
+ //! Swaps \p *this with \p y.
+ void swap(Congruence& y);
+
+ /*! \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 Congruence
+ PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Congruence
+ PPL::operator%=(const Linear_Expression& e,
+ const Coefficient_traits::const_reference n);
+
+ friend Congruence
+ PPL::operator/(const Congruence& cg,
+ const Coefficient_traits::const_reference k);
+
+ friend Congruence
+ PPL::operator/(const Constraint& c,
+ const Coefficient_traits::const_reference m);
+
+ friend bool
+ PPL::operator==(const Congruence& x, const Congruence& y);
+
+ friend bool
+ PPL::operator!=(const Congruence& x, const Congruence& y);
+
+ friend std::ostream&
+ PPL::IO_Operators::operator<<(std::ostream& s,
+ const Congruence_System& cgs);
+
+ friend class PPL::Scalar_Products;
+ friend class PPL::Congruence_System;
+ friend class PPL::Congruence_System::const_iterator;
+ // FIXME: The following friend declaration is at least for
+ // operator[] access in Grid::conversion.
+ friend class PPL::Grid;
+ friend class PPL::Linear_Expression;
+
+ friend void
+ std::swap(PPL::Congruence& x, PPL::Congruence& y);
+};
+
+#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..e318657
--- /dev/null
+++ b/src/Congruence.inlines.hh
@@ -0,0 +1,233 @@
+/* Congruence class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Congruence_inlines_hh
+#define PPL_Congruence_inlines_hh 1
+
+#include "Constraint.defs.hh"
+#include "Linear_Expression.defs.hh"
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(const Congruence& cg)
+ : Row(cg) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ dimension_type sz, dimension_type capacity)
+ : Row(cg, sz, capacity) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ Coefficient_traits::const_reference k)
+ : Row(cg) {
+ if (k >= 0)
+ (*this)[size()-1] *= k;
+ else
+ (*this)[size()-1] *= -k;
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+ static const Congruence zdi(Linear_Expression::zero() %= Coefficient(-1));
+ return zdi;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+ static const Congruence
+ zdf((Linear_Expression::zero() %= Coefficient_one()) / 0);
+ return zdf;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& c) {
+ Row::operator=(c);
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e,
+ const Coefficient_traits::const_reference n) {
+ // Ensure that diff has capacity for the modulus.
+ Linear_Expression diff(e, e.space_dimension() + 2);
+ diff -= n;
+ Congruence cg(diff, 1, false);
+ return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg,
+ const Coefficient_traits::const_reference k) {
+ Congruence ret (cg, k);
+ return ret;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c,
+ const Coefficient_traits::const_reference m) {
+ Congruence ret (c);
+ return ret / m;
+}
+
+inline Congruence&
+Congruence::operator/=(const Coefficient_traits::const_reference k) {
+ if (k >= 0)
+ (*this)[size()-1] *= k;
+ else
+ (*this)[size()-1] *= -k;
+ return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+ Congruence x_temp(x);
+ Congruence y_temp(y);
+ x_temp.strong_normalize();
+ y_temp.strong_normalize();
+ return static_cast<const Row&>(x_temp) == static_cast<const Row&>(y_temp);
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+ return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+ // The first coefficient holds the inhomogeneous term, while
+ // the last coefficient is for the modulus.
+ return max_size() - 2;
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+ return size() - 2;
+}
+
+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 (*this)[v.id()+1];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+ return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+ assert(size() > 0);
+ return (*this)[size()-1];
+}
+
+inline Coefficient&
+Congruence::modulus() {
+ assert(size() > 0);
+ return (*this)[size()-1];
+}
+
+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(dimension_type dim,
+ const Congruence& cg) const {
+ return operator[](dim) * cg.modulus() == cg[dim] * modulus();
+}
+
+inline void
+Congruence::set_is_equality() {
+ modulus() = 0;
+}
+
+inline void
+Congruence::negate(dimension_type start, dimension_type end) {
+ while (start <= end)
+ neg_assign(operator[](start++));
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+ return Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+ return Row::total_memory_in_bytes();
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m,
+ bool capacity) {
+ Row::swap(static_cast<Row&>(le));
+ if (capacity)
+ Row::expand_within_capacity(size()+1);
+ if (m >= 0)
+ (*this)[size()-1] = m;
+ else
+ (*this)[size()-1] = -m;
+}
+
+inline void
+Congruence::swap(Congruence& y) {
+ Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline void
+swap(Parma_Polyhedra_Library::Congruence& x,
+ Parma_Polyhedra_Library::Congruence& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Congruence_inlines_hh)
diff --git a/src/Congruence.types.hh b/src/Congruence.types.hh
new file mode 100644
index 0000000..3d57459
--- /dev/null
+++ b/src/Congruence.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Congruence_System.cc b/src/Congruence_System.cc
new file mode 100644
index 0000000..3f40eea
--- /dev/null
+++ b/src/Congruence_System.cc
@@ -0,0 +1,550 @@
+/* Congruence_System class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <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 <cassert>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Congruence_System::Congruence_System(const Constraint_System& cs)
+ : Matrix(0, 2) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i)
+ if (i->is_equality())
+ insert(*i);
+}
+
+bool
+PPL::Congruence_System::
+increase_space_dimension(const dimension_type new_space_dim) {
+ assert(space_dimension() <= new_space_dim);
+
+ dimension_type cols_to_add = new_space_dim - space_dimension();
+
+ if (cols_to_add)
+ if (num_rows()) {
+ dimension_type old_num_cols = num_columns();
+ add_zero_columns(cols_to_add);
+ // Move the moduli.
+ swap_columns(num_columns() - 1, old_num_cols - 1);
+ }
+ else
+ // Empty system.
+ add_zero_columns(cols_to_add);
+
+ assert(OK());
+ return true;
+}
+
+void
+PPL::Congruence_System::insert_verbatim(const Congruence& cg) {
+ const dimension_type old_num_columns = num_columns();
+ const dimension_type cg_size = cg.size();
+
+ if (cg_size > old_num_columns) {
+ // Resize the system, if necessary.
+ add_zero_columns(cg_size - old_num_columns);
+ if (num_rows() != 0)
+ // Move the moduli to the last column.
+ swap_columns(old_num_columns - 1, cg_size - 1);
+ add_row(cg);
+ }
+ else if (cg_size < old_num_columns) {
+ // Create a resized copy of `cg'.
+ Congruence rc(cg, old_num_columns, row_capacity);
+ // Move the modulus to its place.
+ std::swap(rc[cg_size - 1], rc[old_num_columns - 1]);
+ add_recycled_row(rc);
+ }
+ else
+ // Here cg_size == old_num_columns.
+ add_row(cg);
+
+ assert(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Constraint& c) {
+ dimension_type cg_size = c.space_dimension() + 2;
+ const dimension_type old_num_columns = num_columns();
+ if (cg_size < old_num_columns) {
+ // Create a congruence of the required size from `c'.
+ Congruence cg(c, old_num_columns, row_capacity);
+ add_recycled_row(cg);
+ }
+ else {
+ if (cg_size > old_num_columns) {
+ // Resize the system, if necessary.
+ add_zero_columns(cg_size - old_num_columns);
+ if (num_rows() != 0)
+ // Move the moduli to the last column.
+ swap_columns(old_num_columns - 1, cg_size - 1);
+ }
+ Congruence cg(c, cg_size, row_capacity);
+ add_recycled_row(cg);
+ }
+ operator[](rows.size()-1).strong_normalize();
+
+ assert(OK());
+}
+
+void
+PPL::Congruence_System::recycling_insert(Congruence_System& cgs) {
+ const dimension_type old_num_rows = num_rows();
+ const dimension_type cgs_num_rows = cgs.num_rows();
+ const dimension_type old_num_cols = num_columns();
+ dimension_type cgs_num_cols = cgs.num_columns();
+ if (old_num_cols >= cgs_num_cols)
+ add_zero_rows(cgs_num_rows, Row::Flags());
+ else {
+ add_zero_rows_and_columns(cgs_num_rows,
+ cgs_num_cols - old_num_cols,
+ Row::Flags());
+ // Swap the modulus column into the new last column.
+ swap_columns(old_num_cols - 1, num_columns() - 1);
+ }
+ --cgs_num_cols; // Convert to modulus index.
+ const dimension_type mod_index = num_columns() - 1;
+ for (dimension_type i = cgs_num_rows; i-- > 0; ) {
+ // Swap one coefficient at a time into the newly added rows, instead
+ // of swapping each entire row. This ensures that the added rows
+ // have the same capacities as the existing rows.
+ Congruence& new_cg = operator[](old_num_rows + i);
+ Congruence& old_cg = cgs[i];
+ for (dimension_type j = cgs_num_cols; j-- > 0; )
+ std::swap(new_cg[j], old_cg[j]);
+ std::swap(new_cg[mod_index], old_cg[cgs_num_cols]); // Modulus.
+ }
+
+ assert(OK());
+}
+
+void
+PPL::Congruence_System::insert(const Congruence_System& y) {
+ Congruence_System& x = *this;
+
+ const dimension_type x_n_rows = x.num_rows();
+ const dimension_type y_n_rows = y.num_rows();
+ const dimension_type old_n_cols = x.num_columns();
+ const dimension_type y_n_cols = y.num_columns();
+ // Grow to the required size.
+ if (old_n_cols >= y_n_cols)
+ add_zero_rows(y_n_rows, Row::Flags());
+ else {
+ add_zero_rows_and_columns(y_n_rows,
+ y_n_cols - old_n_cols,
+ Row::Flags());
+ // Swap the modulus column into the new last column.
+ swap_columns(old_n_cols - 1, num_columns() - 1);
+ }
+
+ // Copy the rows of `y', forcing size and capacity.
+ const dimension_type x_mod_index = x.num_columns() - 1;
+ const dimension_type y_mod_index = y_n_cols - 1;
+ for (dimension_type i = y_n_rows; i-- > 0; ) {
+ Row copy(y[i], x.row_size, x.row_capacity);
+ // Swap the modulus to the correct column.
+ std::swap(copy[x_mod_index], copy[y_mod_index]);
+ std::swap(copy, x[x_n_rows+i]);
+ }
+ assert(OK());
+}
+
+void
+PPL::Congruence_System::normalize_moduli() {
+ dimension_type row = num_rows();
+ if (row > 0) {
+ // Calculate the LCM of all the moduli.
+ TEMP_INTEGER(lcm);
+ // Find last proper congruence.
+ while (true) {
+ lcm = operator[](--row).modulus();
+ if (lcm > 0)
+ break;
+ if (row == 0)
+ // All rows are equalities.
+ return;
+ }
+ while (row > 0) {
+ TEMP_INTEGER(modulus);
+ modulus = operator[](--row).modulus();
+ if (modulus > 0)
+ lcm_assign(lcm, lcm, modulus);
+ }
+
+ // Represent every row using the LCM as the modulus.
+ dimension_type row_size = operator[](0).size();
+ for (dimension_type row = num_rows(); row-- > 0; ) {
+ TEMP_INTEGER(modulus);
+ modulus = operator[](row).modulus();
+ if (modulus <= 0 || modulus == lcm)
+ continue;
+ TEMP_INTEGER(factor);
+ factor = lcm / modulus;
+ for (dimension_type col = row_size; col-- > 0; )
+ operator[](row)[col] *= factor;
+ operator[](row)[row_size-1] = lcm;
+ }
+ }
+ assert(OK());
+}
+
+bool
+PPL::Congruence_System::is_equal_to(const Congruence_System& cgs) const {
+ if (num_rows() != cgs.num_rows())
+ return false;
+
+ for (dimension_type row = 0; row < cgs.num_rows(); ++row)
+ for (dimension_type col = 0; col < cgs.num_columns(); ++col) {
+ if (operator[](row)[col] == cgs[row][col])
+ continue;
+ return false;
+ }
+ return true;
+}
+
+bool
+PPL::Congruence_System::has_linear_equalities() const {
+ const Congruence_System& cgs = *this;
+ dimension_type modulus_index = cgs.num_columns() - 1;
+ for (dimension_type i = cgs.num_rows(); i-- > 0; )
+ if (cgs[i][modulus_index] == 0)
+ return true;
+ return false;
+}
+
+void
+PPL::Congruence_System::const_iterator::skip_forward() {
+ const Matrix::const_iterator csp_end = csp->end();
+ while (i != csp_end && (*this)->is_trivial_true())
+ ++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 {
+ assert(g.space_dimension() <= space_dimension());
+
+ const Congruence_System& cgs = *this;
+ TEMP_INTEGER(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.
+ dimension_type space_dim = space_dimension();
+ std::vector<bool> free_dim(space_dim, true);
+ dimension_type free_dims = space_dim;
+ for (dimension_type row = num_rows(); row-- > 0; ) {
+ const Congruence& cg = operator[](row);
+ for (dimension_type dim = 0; dim < space_dim; ++dim)
+ if (free_dim[dim] && cg[dim+1] != 0) {
+ if (--free_dims == 0) {
+ // All dimensions are constrained.
+#ifndef NDEBUG
+ free_dim[dim] = false;
+ // Check that there are free_dims dimensions marked free
+ // in free_dim.
+ dimension_type count = 0;
+ for (dimension_type dim = 0; dim < space_dim; ++dim)
+ count += free_dim[dim];
+ assert(count == free_dims);
+#endif
+ return true;
+ }
+ free_dim[dim] = false;
+ }
+ }
+ // At least one dimension is free of constraint.
+ return false;
+}
+
+void
+PPL::Congruence_System::
+affine_preimage(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ // `v' is the index of a column corresponding to a "user" variable
+ // (i.e., it cannot be the inhomogeneous term).
+ assert(v > 0 && v <= space_dimension());
+ assert(expr.space_dimension() <= space_dimension());
+ assert(denominator > 0);
+
+ const dimension_type n_columns = num_columns();
+ const dimension_type n_rows = num_rows();
+ const dimension_type expr_size = expr.size();
+ const bool not_invertible = (v >= expr_size || expr[v] == 0);
+ Congruence_System& x = *this;
+
+ if (denominator == 1)
+ // Optimized computation only considering columns having indexes <
+ // expr_size.
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Congruence& row = x[i];
+ Coefficient& row_v = row[v];
+ if (row_v != 0) {
+ for (dimension_type j = expr_size; j-- > 0; )
+ if (j != v)
+ // row[j] = row[j] + row_v * expr[j]
+ add_mul_assign(row[j], row_v, expr[j]);
+ if (not_invertible)
+ row_v = 0;
+ else
+ row_v *= expr[v];
+ }
+ }
+ else
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Congruence& row = x[i];
+ Coefficient& row_v = row[v];
+ if (row_v != 0) {
+ for (dimension_type j = n_columns; j-- > 0; )
+ if (j != v) {
+ Coefficient& row_j = row[j];
+ row_j *= denominator;
+ if (j < expr_size)
+ add_mul_assign(row_j, row_v, expr[j]);
+ }
+ if (not_invertible)
+ row_v = 0;
+ else
+ row_v *= expr[v];
+ }
+ }
+}
+
+void
+PPL::Congruence_System::ascii_dump(std::ostream& s) const {
+ const Congruence_System& x = *this;
+ dimension_type x_num_rows = x.num_rows();
+ dimension_type x_num_columns = x.num_columns();
+ s << x_num_rows << " x " << x_num_columns
+ << std::endl;
+ if (x_num_rows && x_num_columns)
+ 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 nrows;
+ dimension_type ncols;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str))
+ return false;
+ if (!(s >> ncols))
+ return false;
+ resize_no_copy(nrows, ncols);
+
+ Congruence_System& x = *this;
+ for (dimension_type i = 0; i < x.num_rows(); ++i)
+ x[i].ascii_load(s);
+
+ // Check for well-formedness.
+ assert(OK());
+ return true;
+}
+
+bool
+PPL::Congruence_System::OK() const {
+ // A Congruence_System must be a valid Matrix.
+ if (!Matrix::OK())
+ return false;
+
+ if (num_rows()) {
+ if (num_columns() < 2) {
+#ifndef NDEBUG
+ std::cerr << "Congruence_System has rows and fewer than two columns."
+ << std::endl;
+#endif
+ return false;
+ }
+ }
+
+ // Checking each congruence in the system.
+ const Congruence_System& x = *this;
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ const Congruence& cg = x[i];
+ 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;
+ 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_columns() == y.num_columns()) {
+ dimension_type num_rows = x.num_rows();
+ if (num_rows == y.num_rows()) {
+ while (num_rows--) {
+ if (x[num_rows] == y[num_rows])
+ continue;
+ return false;
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+void
+PPL::Congruence_System::add_unit_rows_and_columns(dimension_type dims) {
+ assert(num_columns() > 0);
+ dimension_type col = num_columns() - 1;
+ dimension_type old_num_rows = num_rows();
+ add_zero_rows_and_columns(dims, dims,
+ Linear_Row::Flags(NECESSARILY_CLOSED,
+ Linear_Row::LINE_OR_EQUALITY));
+ // Swap the modulus column into the new last column.
+ swap_columns(col, col + dims);
+
+ // Swap the added columns to the front of the matrix.
+ for (dimension_type row = old_num_rows; row-- > 0; )
+ std::swap(operator[](row), operator[](row + dims));
+
+ col += dims - 1;
+ // Set the diagonal element of each added row.
+ for (dimension_type row = 0; row < dims; ++row)
+ const_cast<Coefficient&>(operator[](row)[col - row]) = 1;
+}
+
+void
+PPL::Congruence_System::concatenate(const Congruence_System& const_cgs) {
+ // TODO: this implementation is just an executable specification.
+ Congruence_System cgs = const_cgs;
+
+ dimension_type added_rows = cgs.num_rows();
+ dimension_type added_columns = cgs.space_dimension();
+
+ if (added_rows == 0) {
+ increase_space_dimension(space_dimension() + added_columns);
+ return;
+ }
+
+ dimension_type old_num_rows = num_rows();
+ dimension_type old_modi = num_columns() - 1;
+ dimension_type old_space_dim = space_dimension();
+
+ add_zero_rows_and_columns(added_rows, added_columns,
+ Row::Flags());
+
+ dimension_type cgs_num_columns = cgs.num_columns();
+ dimension_type modi = num_columns() - 1;
+
+ // Swap the modulus and the new last column, in the old rows.
+ for (dimension_type i = 0; i < old_num_rows; ++i) {
+ Congruence& cg = operator[](i);
+ std::swap(cg[old_modi], cg[modi]);
+ }
+
+ // 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[i];
+ Congruence& cg_new = operator[](old_num_rows + i);
+ // The inhomogeneous term is moved to the same column.
+ std::swap(cg_new[0], cg_old[0]);
+ // All homogeneous terms are shifted by `space_dim' columns.
+ for (dimension_type j = 1; j < cgs_num_columns; ++j)
+ std::swap(cg_old[j], cg_new[old_space_dim + j]);
+ }
+}
diff --git a/src/Congruence_System.defs.hh b/src/Congruence_System.defs.hh
new file mode 100644
index 0000000..f7f175d
--- /dev/null
+++ b/src/Congruence_System.defs.hh
@@ -0,0 +1,480 @@
+/* Congruence_System class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 "Matrix.defs.hh"
+#include "Grid_Certificate.types.hh"
+#include <iosfwd>
+
+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
+
+// Put this in the namespace here to declare it a friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+ Parma_Polyhedra_Library::Congruence_System& y);
+
+} // namespace std
+
+//! 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 : private Matrix {
+public:
+ //! Default constructor: builds an empty system of congruences.
+ Congruence_System();
+
+ //! Builds the singleton system containing only congruence \p cg.
+ explicit Congruence_System(const Congruence& cg);
+
+ /*! \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);
+
+ //! Builds a system containing copies of any equalities in \p cs.
+ explicit Congruence_System(const Constraint_System& cs);
+
+ //! Ordinary copy-constructor.
+ Congruence_System(const Congruence_System& cgs);
+
+ //! Destructor.
+ ~Congruence_System();
+
+ //! Assignment operator.
+ Congruence_System& operator=(const Congruence_System& cgs);
+
+ //! 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 cgs.
+ */
+ bool is_equal_to(const Congruence_System& cgs) 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 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 relation.
+ */
+ void insert(const Constraint& c);
+
+ // TODO: Consider adding a recycling_insert(cg).
+
+ /*! \brief
+ Inserts in \p *this a copy of the congruences in \p cgs,
+ increasing the number of space dimensions if needed.
+
+ The inserted copies will be strongly normalized.
+ */
+ void insert(const Congruence_System& cgs);
+
+ /*! \brief
+ Inserts into \p *this the congruences in \p cgs, increasing the
+ number of space dimensions if needed.
+ */
+ void recycling_insert(Congruence_System& cgs);
+
+ //! 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 matrix of congruences.
+ Matrix::const_iterator i;
+
+ //! A const pointer to the matrix of congruences.
+ const Matrix* csp;
+
+ //! Constructor.
+ const_iterator(const Matrix::const_iterator& iter,
+ const Congruence_System& cgs);
+
+ //! \p *this skips to the next non-trivial congruence.
+ void skip_forward();
+ };
+
+ /*! \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 \p *this is a valid
+ Matrix, each row in the system is a valid Congruence and the
+ number of columns is consistent with the number of congruences.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) and sets \p *this accordingly. Returns
+ <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(Congruence_System& cgs);
+
+ /*! \brief
+ Adds \p dims rows and \p dims columns of zeroes to the matrix,
+ initializing the added rows as in the unit congruence 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({0 \atop A}{B \atop A}\bigr)\f$ where
+ \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+ \f$\bigl({0 \atop 1}{1 \atop 0}\bigr)\f$. The matrix is expanded
+ avoiding reallocation whenever possible.
+ */
+ void add_unit_rows_and_columns(dimension_type dims);
+
+ /*! \brief
+ Concatenates copies of the congruences from \p cgs onto \p *this.
+
+ 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 cgs in the lower right-hand side, and padding
+ with zeroes.
+ */
+ void concatenate(const Congruence_System& cgs);
+
+protected:
+
+ //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+ bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+
+ //! Adjusts all expressions to have the same moduli.
+ void normalize_moduli();
+
+ //! Increase the number of space dimensions to \p new_space_dim.
+ /*!
+ \p new_space_dim must at least equal to the current space
+ dimension.
+ */
+ bool increase_space_dimension(const dimension_type new_space_dim);
+
+ /*! \brief
+ Inserts in \p *this an exact copy of the congruence \p cg,
+ increasing the number of space dimensions if needed.
+
+ This method inserts a copy of \p cg in the given form, instead of
+ first strong normalizing \p cg as \ref insert would do.
+ */
+ void insert_verbatim(const Congruence& cg);
+
+ friend class const_iterator;
+ // FIXME: Reduce the dependence on this declaration.
+ friend class Grid;
+ friend class Grid_Certificate;
+
+ friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x,
+ Parma_Polyhedra_Library::Congruence_System& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Congruence_System& x,
+ const Congruence_System& y);
+
+ //! Returns the \p k- th congruence of the system.
+ Congruence& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k- th congruence of the system.
+ const Congruence& operator[](dimension_type k) const;
+
+ /*! \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;
+
+ /*! \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(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Resizes the system without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized system;
+
+ \param new_n_columns
+ The number of columns of the resized system.
+
+ The system is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original system is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+};
+
+// 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..0a3d776
--- /dev/null
+++ b/src/Congruence_System.inlines.hh
@@ -0,0 +1,211 @@
+/* Congruence_System class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Congruence_System_inlines_hh
+#define PPL_Congruence_System_inlines_hh 1
+
+#include "Congruence.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence_System::Congruence_System()
+ : Matrix(0, 2) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg)
+ : Matrix(0, 2) {
+ insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c)
+ : Matrix(0, 2) {
+ insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cs)
+ : Matrix(cs) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+ Matrix::operator=(y);
+ return *this;
+}
+
+inline Congruence&
+Congruence_System::operator[](const dimension_type k) {
+ return static_cast<Congruence&>(Matrix::operator[](k));
+}
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+ return static_cast<const Congruence&>(Matrix::operator[](k));
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+ return Matrix::max_num_columns() - 2;
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+ return Matrix::num_columns() - 2;
+}
+
+inline void
+Congruence_System::clear() {
+ Matrix::clear();
+ add_zero_columns(2); // Modulus and constant term.
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+ insert_verbatim(cg);
+ static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
+ assert(OK());
+}
+
+inline void
+Congruence_System::resize_no_copy(const dimension_type new_n_rows,
+ const dimension_type new_n_columns) {
+ Matrix::resize_no_copy(new_n_rows, new_n_columns, Row::Flags());
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+ static const Congruence_System zdf(Congruence::zero_dim_false());
+ return zdf;
+}
+
+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 static_cast<const Congruence&>(*i);
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+ return static_cast<const Congruence*>(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 Matrix::const_iterator& iter,
+ const Congruence_System& csys)
+ : i(iter), csp(&csys) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+ const_iterator i(Matrix::begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+ const const_iterator i(Matrix::end(), *this);
+ return i;
+}
+
+inline void
+Congruence_System::swap(Congruence_System& y) {
+ Matrix::swap(y);
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+ return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+ return Matrix::total_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+inline void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+ Parma_Polyhedra_Library::Congruence_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#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..2d8c64a
--- /dev/null
+++ b/src/Congruence_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Constraint.cc b/src/Constraint.cc
new file mode 100644
index 0000000..95f6154
--- /dev/null
+++ b/src/Constraint.cc
@@ -0,0 +1,268 @@
+/* Constraint class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Constraint.defs.hh"
+
+#include "Variable.defs.hh"
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+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 = Variable(0);
+ Constraint c(e, NONSTRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ return c;
+}
+
+bool
+PPL::Constraint::is_tautological() const {
+ assert(size() > 0);
+ const Constraint& x = *this;
+ if (x.all_homogeneous_terms_are_zero())
+ if (is_equality())
+ return x[0] == 0;
+ else
+ // Non-strict inequality constraint.
+ return x[0] >= 0;
+ else
+ // There is a non-zero homogeneous coefficient.
+ if (is_necessarily_closed())
+ return false;
+ else {
+ // The constraint is NOT necessarily closed.
+ const dimension_type eps_index = size() - 1;
+ const int eps_sign = sgn(x[eps_index]);
+ 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 (x[0] <= 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.
+ for (dimension_type i = eps_index; --i > 0; )
+ if (x[i] != 0)
+ return false;
+ // We have the inequality `k > 0',
+ // where k is a positive integer.
+ return true;
+ }
+ }
+}
+
+bool
+PPL::Constraint::is_inconsistent() const {
+ assert(size() > 0);
+ const Constraint& x = *this;
+ if (x.all_homogeneous_terms_are_zero())
+ // The inhomogeneous term is the only non-zero coefficient.
+ if (is_equality())
+ return x[0] != 0;
+ else
+ // Non-strict inequality constraint.
+ return x[0] < 0;
+ else
+ // There is a non-zero homogeneous coefficient.
+ if (is_necessarily_closed())
+ return false;
+ else {
+ // The constraint is NOT necessarily closed.
+ const dimension_type eps_index = size() - 1;
+ if (x[eps_index] >= 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 (x[0] > 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.
+ for (dimension_type i = eps_index; --i > 0; )
+ if (x[i] != 0)
+ return false;
+ // We have the inequality `k > 0',
+ // where k is zero or a negative integer.
+ return true;
+ }
+ }
+}
+
+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);
+ Linear_Expression y_expr(y);
+ // ... then, re-normalize ...
+ x_expr.normalize();
+ y_expr.normalize();
+ // ... and finally check for syntactic equality.
+ for (dimension_type i = x_space_dim + 1; i-- > 0; )
+ if (x_expr[i] != y_expr[i])
+ return false;
+ return true;
+ }
+
+ // `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.
+ for (dimension_type i = x_space_dim + 1; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Constraint& c) {
+ const int num_variables = c.space_dimension();
+ bool first = true;
+ for (int v = 0; v < num_variables; ++v) {
+ Coefficient cv = c.coefficient(Variable(v));
+ if (cv != 0) {
+ 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 << PPL::Variable(v);
+ }
+ }
+ 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 check.
+ const dimension_type min_size = is_necessarily_closed() ? 1 : 2;
+ if (size() < min_size) {
+#ifndef NDEBUG
+ std::cerr << "Constraint has fewer coefficients than the minimum "
+ << "allowed by its topology:"
+ << std::endl
+ << "size is " << size()
+ << ", minimum is " << min_size << "."
+ << 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.defs.hh b/src/Constraint.defs.hh
new file mode 100644
index 0000000..95880de
--- /dev/null
+++ b/src/Constraint.defs.hh
@@ -0,0 +1,489 @@
+/* Constraint class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Constraint_defs_hh
+#define PPL_Constraint_defs_hh 1
+
+#include "Constraint.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Linear_Row.defs.hh"
+#include "Variable.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Polyhedron.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! 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);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+//! 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 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 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 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 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);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+void swap(Parma_Polyhedra_Library::Constraint& x,
+ Parma_Polyhedra_Library::Constraint& y);
+
+} // namespace std
+
+//! 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 (int i = c1.space_dimension() - 1; i >= 0; i--)
+ 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 : private Linear_Row {
+public:
+ //! Ordinary copy-constructor.
+ Constraint(const Constraint& c);
+
+ //! Destructor.
+ ~Constraint();
+
+ //! 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;
+
+ //! 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
+ };
+
+ //! 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;
+
+ //! 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;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void swap(Constraint& y);
+
+private:
+ friend class Parma_Polyhedra_Library::Congruence;
+ friend class Parma_Polyhedra_Library::Scalar_Products;
+ friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+ friend class Parma_Polyhedra_Library::Constraint_System;
+ friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
+ // FIXME: the following friend declaration should be avoided.
+ friend class Parma_Polyhedra_Library::Polyhedron;
+
+ friend
+ Parma_Polyhedra_Library
+ ::Linear_Expression::Linear_Expression(const Constraint& c);
+
+ //! Default constructor: private and not implemented.
+ Constraint();
+
+ /*! \brief
+ Builds a constraint of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+ */
+ Constraint(Linear_Expression& e, Type type, Topology topology);
+
+ /*! \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;
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator==(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator==(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator==(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator>=(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>=(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>=(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator<=(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<=(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<=(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator>(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator<(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ //! Copy-constructor with given size.
+ Constraint(const Constraint& c, dimension_type sz);
+
+ /*! \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();
+
+ //! 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();
+
+ //! 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();
+};
+
+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
+
+} // 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..c213ecb
--- /dev/null
+++ b/src/Constraint.inlines.hh
@@ -0,0 +1,343 @@
+/* Constraint class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Constraint_inlines_hh
+#define PPL_Constraint_inlines_hh 1
+
+#include "Linear_Expression.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) {
+ assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+ Linear_Row::swap(e);
+ flags() = Flags(topology, (type == EQUALITY
+ ? LINE_OR_EQUALITY
+ : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+ : Linear_Row(c) {
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type sz)
+ : Linear_Row(c, sz, sz) {
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+ Linear_Row::operator=(c);
+ return *this;
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+ return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+ return Linear_Row::space_dimension();
+}
+
+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;
+ else
+ return ((*this)[size() - 1] < 0)
+ ? STRICT_INEQUALITY
+ : 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 Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+ return Linear_Row::inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+ return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+ return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \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 - e2;
+ Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.strong_normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff = e1 - e2;
+ Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff;
+ // Setting the epsilon coefficient to -1.
+ // NOTE: this also enforces normalization.
+ const dimension_type e1_dim = e1.space_dimension();
+ const dimension_type e2_dim = e2.space_dimension();
+ if (e1_dim > e2_dim)
+ diff -= Variable(e1_dim);
+ else
+ diff -= Variable(e2_dim);
+ diff += e1;
+ diff -= e2;
+
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff = n - e;
+ Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.strong_normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff = n - e;
+ Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff;
+ // Setting the epsilon coefficient to -1.
+ // NOTE: this also enforces normalization.
+ diff -= Variable(e.space_dimension());
+ diff += n;
+ diff -= e;
+
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff = e - n;
+ Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.strong_normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff = e - n;
+ Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff;
+ // Setting the epsilon coefficient to -1.
+ // NOTE: this also enforces normalization.
+ diff -= Variable(e.space_dimension());
+ diff += e;
+ diff -= n;
+
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ c.set_not_necessarily_closed();
+ c.set_is_inequality();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return e2 >= e1;
+}
+
+/*! \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<(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() {
+ static const Constraint zdf(Linear_Expression::zero() == Coefficient_one());
+ return zdf;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+ static const Constraint zdp(Linear_Expression::zero() <= Coefficient_one());
+ return zdp;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+ static const Constraint eps_geq_zero = construct_epsilon_geq_zero();
+ return eps_geq_zero;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+ static const Constraint
+ eps_leq_one(Linear_Expression::zero() < Coefficient_one());
+ return eps_leq_one;
+}
+
+inline void
+Constraint::ascii_dump(std::ostream& s) const {
+ Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Constraint::ascii_load(std::istream& s) {
+ return Linear_Row::ascii_load(s);
+}
+
+inline void
+Constraint::swap(Constraint& y) {
+ Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+inline void
+swap(Parma_Polyhedra_Library::Constraint& x,
+ Parma_Polyhedra_Library::Constraint& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Constraint_inlines_hh)
diff --git a/src/Constraint.types.hh b/src/Constraint.types.hh
new file mode 100644
index 0000000..6750d8c
--- /dev/null
+++ b/src/Constraint.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Constraint_System.cc b/src/Constraint_System.cc
new file mode 100644
index 0000000..8ab6f17
--- /dev/null
+++ b/src/Constraint_System.cc
@@ -0,0 +1,594 @@
+/* Constraint_System class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Generator.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#include <string>
+#include <vector>
+#include <iostream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::Constraint_System::
+adjust_topology_and_space_dimension(const Topology new_topology,
+ const dimension_type new_space_dim) {
+ assert(space_dimension() <= new_space_dim);
+
+ const dimension_type old_space_dim = space_dimension();
+ const Topology old_topology = topology();
+ dimension_type cols_to_be_added = new_space_dim - old_space_dim;
+
+ // Dealing with empty constraint systems first.
+ if (num_rows() == 0) {
+ if (num_columns() == 0)
+ if (new_topology == NECESSARILY_CLOSED) {
+ add_zero_columns(++cols_to_be_added);
+ set_necessarily_closed();
+ }
+ else {
+ cols_to_be_added += 2;
+ add_zero_columns(cols_to_be_added);
+ set_not_necessarily_closed();
+ }
+ else
+ // Here `num_columns() > 0'.
+ if (old_topology != new_topology)
+ if (new_topology == NECESSARILY_CLOSED) {
+ switch (cols_to_be_added) {
+ case 0:
+ remove_trailing_columns(1);
+ break;
+ case 1:
+ // Nothing to do.
+ break;
+ default:
+ add_zero_columns(--cols_to_be_added);
+ }
+ set_necessarily_closed();
+ }
+ else {
+ // Here old_topology == NECESSARILY_CLOSED
+ // and new_topology == NOT_NECESSARILY_CLOSED.
+ add_zero_columns(++cols_to_be_added);
+ set_not_necessarily_closed();
+ }
+ else {
+ // Here topologies agree.
+ if (cols_to_be_added > 0)
+ add_zero_columns(cols_to_be_added);
+ }
+ assert(OK());
+ return true;
+ }
+
+ // Here `num_rows() > 0'.
+ if (cols_to_be_added > 0)
+ if (old_topology != new_topology)
+ if (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.
+ Constraint_System& cs = *this;
+ const dimension_type eps_index = old_space_dim + 1;
+ dimension_type cs_num_rows = cs.num_rows();
+ bool was_sorted = cs.is_sorted();
+ if (was_sorted)
+ cs.set_sorted(false);
+
+ // If we have no pending rows, we only check if
+ // we must erase some rows.
+ if (cs.num_pending_rows() == 0) {
+ for (dimension_type i = cs_num_rows; i-- > 0; )
+ if (cs[i][eps_index] != 0) {
+ --cs_num_rows;
+ std::swap(cs[i], cs[cs_num_rows]);
+ }
+ cs.erase_to_end(cs_num_rows);
+ cs.unset_pending_rows();
+ }
+ else {
+ // There are pending rows, and we cannot swap them
+ // into the non-pending part of the matrix.
+ // Thus, we first work on the non-pending part as if it was
+ // an independent matrix; then we work on the pending part.
+ const dimension_type old_first_pending = cs.first_pending_row();
+ dimension_type new_first_pending = old_first_pending;
+ for (dimension_type i = new_first_pending; i-- > 0; )
+ if (cs[i][eps_index] != 0) {
+ --new_first_pending;
+ std::swap(cs[i], cs[new_first_pending]);
+ }
+ const dimension_type num_swaps
+ = old_first_pending - new_first_pending;
+ cs.set_index_first_pending_row(new_first_pending);
+ // Move the swapped rows to the real end of the matrix.
+ for (dimension_type i = num_swaps; i-- > 0; )
+ std::swap(cs[old_first_pending - i], cs[cs_num_rows - i]);
+ cs_num_rows -= num_swaps;
+ // Now iterate through the pending rows.
+ for (dimension_type i = cs_num_rows; i-- > new_first_pending; )
+ if (cs[i][eps_index] != 0) {
+ --cs_num_rows;
+ std::swap(cs[i], cs[cs_num_rows]);
+ }
+ cs.erase_to_end(cs_num_rows);
+ }
+
+ // If `cs' was sorted we sort it again.
+ if (was_sorted)
+ cs.sort_rows();
+ if (--cols_to_be_added > 0)
+ add_zero_columns(cols_to_be_added);
+ set_necessarily_closed();
+ }
+ else {
+ // A NECESSARILY_CLOSED constraint system is converted to
+ // a NOT_NECESSARILY_CLOSED one by adding a further column
+ // of zeroes for the epsilon coefficients.
+ add_zero_columns(++cols_to_be_added);
+ set_not_necessarily_closed();
+ }
+ else {
+ // Topologies agree: first add the required zero columns ...
+ add_zero_columns(cols_to_be_added);
+ // ... and, if needed, move the epsilon coefficients
+ // to the new last column.
+ if (old_topology == NOT_NECESSARILY_CLOSED)
+ swap_columns(old_space_dim + 1, new_space_dim + 1);
+ }
+ else
+ // Here `cols_to_be_added == 0'.
+ if (old_topology != new_topology)
+ if (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;
+ // We just remove the column of the epsilon coefficients.
+ remove_trailing_columns(1);
+ set_necessarily_closed();
+ }
+ else {
+ // We just add the column of the epsilon coefficients.
+ add_zero_columns(1);
+ set_not_necessarily_closed();
+ }
+ // We successfully adjusted space dimensions and topology.
+ assert(OK());
+ return true;
+}
+
+bool
+PPL::Constraint_System::has_strict_inequalities() const {
+ if (is_necessarily_closed())
+ return false;
+ const Constraint_System& cs = *this;
+ const dimension_type eps_index = cs.num_columns() - 1;
+ // We verify if the system has strict inequalities
+ // also in the pending part.
+ for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+ const Constraint& c = cs[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[eps_index] < 0 && !c.is_tautological())
+ return true;
+ }
+ return false;
+}
+
+void
+PPL::Constraint_System::insert(const Constraint& c) {
+ // We are sure that the matrix has no pending rows
+ // and that the new row is not a pending constraint.
+ assert(num_pending_rows() == 0);
+ if (topology() == c.topology())
+ Linear_System::insert(c);
+ else
+ // `*this' and `c' have different topologies.
+ if (is_necessarily_closed()) {
+ // Padding the matrix with a columns of zeroes
+ // corresponding to the epsilon coefficients.
+ add_zero_columns(1);
+ set_not_necessarily_closed();
+ Linear_System::insert(c);
+ }
+ else {
+ // Here `*this' is NNC and `c' is necessarily closed.
+ // Copying the constraint adding the epsilon coefficient
+ // and the missing space dimensions, if any.
+ // FIXME: provide a resizing copy-constructor taking
+ // topology and the space dimension.
+ const dimension_type new_size = 2 + std::max(c.space_dimension(),
+ space_dimension());
+ Constraint tmp_c(c, new_size);
+ tmp_c.set_not_necessarily_closed();
+ Linear_System::insert(tmp_c);
+ }
+ assert(OK());
+}
+
+void
+PPL::Constraint_System::insert_pending(const Constraint& c) {
+ if (topology() == c.topology())
+ Linear_System::insert_pending(c);
+ else
+ // `*this' and `c' have different topologies.
+ if (is_necessarily_closed()) {
+ // Padding the matrix with a columns of zeroes
+ // corresponding to the epsilon coefficients.
+ add_zero_columns(1);
+ set_not_necessarily_closed();
+ Linear_System::insert_pending(c);
+ }
+ else {
+ // Here `*this' is NNC and `c' is necessarily closed.
+ // Copying the constraint adding the epsilon coefficient
+ // and the missing space dimensions, if any.
+ const dimension_type new_size = 2 + std::max(c.space_dimension(),
+ space_dimension());
+ Constraint tmp_c(c, new_size);
+ tmp_c.set_not_necessarily_closed();
+ Linear_System::insert_pending(tmp_c);
+ }
+ 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.
+ assert(num_pending_rows() == 0);
+ const Constraint_System& cs = *this;
+ dimension_type n = 0;
+ // If the Linear_System happens to be sorted, take advantage of the fact
+ // that inequalities are at the bottom of the system.
+ if (is_sorted())
+ for (dimension_type i = num_rows(); i > 0 && cs[--i].is_inequality(); )
+ ++n;
+ else
+ for (dimension_type i = 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.
+ assert(num_pending_rows() == 0);
+ return num_rows() - num_inequalities();
+}
+
+void
+PPL::Constraint_System::const_iterator::skip_forward() {
+ const Linear_System::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 {
+ 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).
+ Topology_Adjusted_Scalar_Product_Sign sps(g);
+
+ const Constraint_System& cs = *this;
+ if (cs.is_necessarily_closed()) {
+ if (g.is_line()) {
+ // Lines must saturate all constraints.
+ for (dimension_type i = cs.num_rows(); i-- > 0; )
+ if (sps(g, cs[i]) != 0)
+ return false;
+ }
+ else
+ // `g' is either a ray, a point or a closure point.
+ for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+ const Constraint& c = cs[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 = cs.num_rows(); i-- > 0; )
+ if (sps(g, cs[i]) != 0)
+ return false;
+ break;
+
+ case Generator::POINT:
+ // Have to perform the special test
+ // when dealing with a strict inequality.
+ for (dimension_type i = cs.num_rows(); i-- > 0; ) {
+ const Constraint& c = cs[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 = cs.num_rows(); i-- > 0; ) {
+ const Constraint& c = cs[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 dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ Constraint_System& x = *this;
+ // `v' is the index of a column corresponding to
+ // a "user" variable (i.e., it cannot be the inhomogeneous term,
+ // nor the epsilon dimension of NNC polyhedra).
+ assert(v > 0 && v <= x.space_dimension());
+ assert(expr.space_dimension() <= x.space_dimension());
+ assert(denominator > 0);
+
+ const dimension_type n_columns = x.num_columns();
+ const dimension_type n_rows = x.num_rows();
+ const dimension_type expr_size = expr.size();
+ const bool not_invertible = (v >= expr_size || expr[v] == 0);
+
+ if (denominator != 1)
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Constraint& row = x[i];
+ Coefficient& row_v = row[v];
+ if (row_v != 0) {
+ for (dimension_type j = n_columns; j-- > 0; )
+ if (j != v) {
+ Coefficient& row_j = row[j];
+ row_j *= denominator;
+ if (j < expr_size)
+ add_mul_assign(row_j, row_v, expr[j]);
+ }
+ if (not_invertible)
+ row_v = 0;
+ else
+ row_v *= expr[v];
+ }
+ }
+ else
+ // Here `denominator' == 1: optimized computation
+ // only considering columns having indexes < expr_size.
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Constraint& row = x[i];
+ Coefficient& row_v = row[v];
+ if (row_v != 0) {
+ for (dimension_type j = expr_size; j-- > 0; )
+ if (j != v)
+ add_mul_assign(row[j], row_v, expr[j]);
+ if (not_invertible)
+ row_v = 0;
+ else
+ row_v *= expr[v];
+ }
+ }
+ // Strong normalization also resets the sortedness flag.
+ x.strong_normalize();
+}
+
+void
+PPL::Constraint_System::ascii_dump(std::ostream& s) const {
+ const Constraint_System& x = *this;
+ const dimension_type x_num_rows = x.num_rows();
+ const dimension_type x_num_columns = x.num_columns();
+ s << "topology " << (is_necessarily_closed()
+ ? "NECESSARILY_CLOSED"
+ : "NOT_NECESSARILY_CLOSED")
+ << "\n"
+ << x_num_rows << " x " << x_num_columns << ' '
+ << (x.is_sorted() ? "(sorted)" : "(not_sorted)")
+ << "\n"
+ << "index_first_pending " << x.first_pending_row()
+ << "\n";
+ for (dimension_type i = 0; i < x_num_rows; ++i) {
+ const Constraint& c = x[i];
+ for (dimension_type j = 0; j < x_num_columns; ++j)
+ s << c[j] << ' ';
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ s << "=";
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ s << ">=";
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ s << ">";
+ break;
+ }
+ s << "\n";
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS(Constraint_System);
+
+bool
+PPL::Constraint_System::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "topology")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "NECESSARILY_CLOSED")
+ set_necessarily_closed();
+ else {
+ if (str != "NOT_NECESSARILY_CLOSED")
+ return false;
+ set_not_necessarily_closed();
+ }
+
+ dimension_type nrows;
+ dimension_type ncols;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str))
+ return false;
+ if (!(s >> ncols))
+ return false;
+ resize_no_copy(nrows, ncols);
+
+ if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+ return false;
+ set_sorted(str == "(sorted)");
+ dimension_type index;
+ if (!(s >> str) || str != "index_first_pending")
+ return false;
+ if (!(s >> index))
+ return false;
+ set_index_first_pending_row(index);
+
+ Constraint_System& x = *this;
+ for (dimension_type i = 0; i < x.num_rows(); ++i) {
+ for (dimension_type j = 0; j < x.num_columns(); ++j)
+ if (!(s >> x[i][j]))
+ return false;
+
+ if (!(s >> str))
+ return false;
+ if (str == "=")
+ x[i].set_is_equality();
+ else
+ x[i].set_is_inequality();
+
+ // Checking for equality of actual and declared types.
+ switch (x[i].type()) {
+ case Constraint::EQUALITY:
+ if (str == "=")
+ continue;
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ if (str == ">=")
+ continue;
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ if (str == ">")
+ continue;
+ break;
+ }
+ // Reaching this point means that the input was illegal.
+ return false;
+ }
+ // Check for well-formedness.
+ assert(OK());
+ return true;
+}
+
+bool
+PPL::Constraint_System::OK() const {
+ // A Constraint_System must be a valid Linear_System; do not check for
+ // strong normalization, since this will be done when
+ // checking each individual constraint.
+ if (!Linear_System::OK(false))
+ return false;
+
+ // Checking each constraint in the system.
+ const Constraint_System& x = *this;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ if (!x[i].OK())
+ return false;
+
+ // All checks passed.
+ return true;
+}
+
+/*! \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++;
+ 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..53789bf
--- /dev/null
+++ b/src/Constraint_System.defs.hh
@@ -0,0 +1,394 @@
+/* Constraint_System class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Constraint_System_defs_hh
+#define PPL_Constraint_System_defs_hh 1
+
+#include "Constraint_System.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Linear_System.defs.hh"
+#include "Generator.types.hh"
+#include "Polyhedron.types.hh"
+#include "Constraint.types.hh"
+#include "LP_Problem.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
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+void swap(Parma_Polyhedra_Library::Constraint_System& x,
+ Parma_Polyhedra_Library::Constraint_System& y);
+
+} // namespace std
+
+//! 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 : private Linear_System {
+public:
+ //! Default constructor: builds an empty system of constraints.
+ Constraint_System();
+
+ //! Builds the singleton system containing only constraint \p c.
+ explicit Constraint_System(const Constraint& c);
+
+ //! Ordinary copy-constructor.
+ Constraint_System(const Constraint_System& cs);
+
+ //! Destructor.
+ ~Constraint_System();
+
+ //! Assignment operator.
+ Constraint_System& operator=(const Constraint_System& y);
+
+ //! 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;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more strict inequality constraints.
+ */
+ bool has_strict_inequalities() const;
+
+ /*! \brief
+ Removes all the constraints from the constraint system
+ and sets its space dimension to 0.
+ */
+ void clear();
+
+ /*! \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);
+
+ /*! \brief
+ Returns the singleton system containing only
+ Constraint::zero_dim_false().
+ */
+ static const Constraint_System& zero_dim_empty();
+
+ //! 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
+ */
+ class const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Constraint,
+ ptrdiff_t,
+ const Constraint*,
+ const Constraint&> {
+ 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 Constraint& operator*() const;
+
+ //! Indirect member selector.
+ const Constraint* 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 Constraint_System;
+
+ //! The const iterator over the matrix of constraints.
+ Linear_System::const_iterator i;
+
+ //! A const pointer to the matrix of constraints.
+ const Linear_System* csp;
+
+ //! Constructor.
+ const_iterator(const Linear_System::const_iterator& iter,
+ const Constraint_System& csys);
+
+ //! \p *this skips to the next non-trivial constraint.
+ void skip_forward();
+ };
+
+ /*! \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.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*!
+ Returns <CODE>true</CODE> if and only if \p *this is a valid
+ Linear_System and each row in the system is a valid Constraint.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(Constraint_System& y);
+
+private:
+ friend class const_iterator;
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ friend class Parma_Polyhedra_Library::LP_Problem;
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+ const Polyhedron& y);
+
+ //! Builds an empty system of constraints having the specified topology.
+ explicit Constraint_System(Topology topol);
+
+ /*! \brief
+ Builds a system of \p n_rows constraints on a \p n_columns - 1
+ dimensional space (including the \f$\epsilon\f$ dimension, if
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+ */
+ Constraint_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns);
+
+ /*! \brief
+ Adjusts \p *this so that it matches the topology and
+ the number of space dimensions given as parameters
+ (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 topol,
+ dimension_type num_dimensions);
+
+ //! Returns the \p k- th constraint of the system.
+ Constraint& operator[](dimension_type k);
+
+ //! 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
+ 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 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(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! 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's 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
+ 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();
+};
+
+// 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..be17a33
--- /dev/null
+++ b/src/Constraint_System.inlines.hh
@@ -0,0 +1,220 @@
+/* Constraint_System class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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()
+ : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c)
+ : Linear_System(c.topology()) {
+ Linear_System::insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+ : Linear_System(cs) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol)
+ : Linear_System(topol) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+ const dimension_type n_rows,
+ const dimension_type n_columns)
+ : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+ Linear_System::operator=(y);
+ return *this;
+}
+
+inline Constraint&
+Constraint_System::operator[](const dimension_type k) {
+ return static_cast<Constraint&>(Linear_System::operator[](k));
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+ return static_cast<const Constraint&>(Linear_System::operator[](k));
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+ return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+ return Linear_System::space_dimension();
+}
+
+inline void
+Constraint_System::clear() {
+ Linear_System::clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+ static const Constraint_System zdf(Constraint::zero_dim_false());
+ return zdf;
+}
+
+inline
+Constraint_System::const_iterator::const_iterator()
+ : i(), csp(0) {
+}
+
+inline
+Constraint_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System::const_iterator::~const_iterator() {
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ csp = y.csp;
+ return *this;
+}
+
+inline const Constraint&
+Constraint_System::const_iterator::operator*() const {
+ return static_cast<const Constraint&>(*i);
+}
+
+inline const Constraint*
+Constraint_System::const_iterator::operator->() const {
+ return static_cast<const Constraint*>(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 const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Constraint_System::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Constraint_System::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Constraint_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+ const Constraint_System& csys)
+ : i(iter), csp(&csys) {
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::begin() const {
+ const_iterator i(Linear_System::begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::end() const {
+ const const_iterator i(Linear_System::end(), *this);
+ return i;
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+ if (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::swap(Constraint_System& y) {
+ Linear_System::swap(y);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+ return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+ return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Constraint_System::simplify() {
+ Linear_System::simplify();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Constraint_System& x,
+ Parma_Polyhedra_Library::Constraint_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#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..37b718c
--- /dev/null
+++ b/src/Constraint_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Constraint_System_types_hh)
diff --git a/src/DB_Matrix.defs.hh b/src/DB_Matrix.defs.hh
new file mode 100644
index 0000000..9a76a2f
--- /dev/null
+++ b/src/DB_Matrix.defs.hh
@@ -0,0 +1,324 @@
+/* DB_Matrix class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 // 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 templatic 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 // 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 // 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 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 \ref ascii_dump)
+ 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;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+ Parma_Polyhedra_Library::DB_Matrix<T>& 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 DB_Matrix */
+#endif // 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 // 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 // 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,
+ const 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 // 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,
+ const 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 // 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,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "DB_Matrix.inlines.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..dbd67ff
--- /dev/null
+++ b/src/DB_Matrix.inlines.hh
@@ -0,0 +1,679 @@
+/* DB_Matrix class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_DB_Matrix_inlines_hh
+#define PPL_DB_Matrix_inlines_hh 1
+
+#include "globals.defs.hh"
+#include "Checked_Number.defs.hh"
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::swap(DB_Matrix& y) {
+ std::swap(rows, y.rows);
+ std::swap(row_size, y.row_size);
+ std::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
+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) {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+ 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 // 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 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);
+ assert(OK());
+}
+
+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>
+template <typename U>
+inline
+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);
+ assert(OK());
+}
+
+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;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+ const dimension_type old_n_rows = rows.size();
+ 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)
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::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) {
+ DB_Row<T> new_row(rows[i],
+ new_matrix.row_size,
+ new_matrix.row_capacity);
+ std::swap(new_matrix.rows[i], new_row);
+ }
+ // Put the new vector into place.
+ 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; ) {
+ DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+ std::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)
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::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);
+ swap(new_matrix);
+ return;
+ }
+ }
+ else if (new_n_rows < old_n_rows) {
+ // Drop some rows.
+ rows.erase(rows.begin() + new_n_rows, rows.end());
+ // 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);
+ std::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_UP);
+ // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+ if (!s || r == V_CVT_STR_UNK)
+ return false;
+ }
+ // Check for well-formedness.
+ assert(OK());
+ return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline 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 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 // 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);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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:
+ r = PLUS_INFINITY;
+ 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);
+ assert(tmp1 >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization {
+ static inline void
+ combine(Temp& running, const Temp& current, Rounding_Dir dir) {
+ add_assign_r(running, running, current, dir);
+ }
+
+ static inline void
+ finalize(Temp&, Rounding_Dir) {
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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);
+}
+
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization {
+ static inline void
+ combine(Temp& running, Temp& current, Rounding_Dir dir) {
+ mul_assign_r(current, current, current, dir);
+ add_assign_r(running, running, current, dir);
+ }
+
+ static inline void
+ finalize(Temp& running, Rounding_Dir dir) {
+ sqrt_assign_r(running, running, dir);
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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);
+}
+
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization {
+ static inline void
+ combine(Temp& running, const Temp& current, Rounding_Dir) {
+ if (current > running)
+ running = current;
+ }
+
+ static inline void
+ finalize(Temp&, Rounding_Dir) {
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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);
+}
+
+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 */ //FIXME!!
+#endif // 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
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+ Parma_Polyhedra_Library::DB_Matrix<T>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_DB_Matrix_inlines_hh)
diff --git a/src/DB_Matrix.types.hh b/src/DB_Matrix.types.hh
new file mode 100644
index 0000000..3163bc8
--- /dev/null
+++ b/src/DB_Matrix.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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..5ecd770
--- /dev/null
+++ b/src/DB_Row.defs.hh
@@ -0,0 +1,431 @@
+/* DB_Row class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ When EXTRA_ROW_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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+
+#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 // 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 EXTRA_ROW_DEBUG
+ //! The capacity of \p impl (only available during debugging).
+ dimension_type capacity_;
+#endif // EXTRA_ROW_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 // 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 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;
+
+ //! 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 EXTRA_ROW_DEBUG
+ //! Returns the capacity of the row (only available during debugging).
+ dimension_type capacity() const;
+#endif // defined(EXTRA_ROW_DEBUG)
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // 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 // 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 // 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;
+ //@}
+
+private:
+ //! The number of coefficients in the row.
+ dimension_type size_;
+
+ //! The vector of coefficients.
+ T vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ 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);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+ Parma_Polyhedra_Library::DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator x,
+ typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator y);
+
+} // namespace std
+
+#include "DB_Row.inlines.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..bc246df
--- /dev/null
+++ b/src/DB_Row.inlines.hh
@@ -0,0 +1,556 @@
+/* DB_Row class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_DB_Row_inlines_hh
+#define PPL_DB_Row_inlines_hh 1
+
+#include <cassert>
+#include <algorithm>
+#include <iostream>
+#include "checked.defs.hh"
+
+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 CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+ 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 dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+ return size_t(-1)/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 EXTRA_ROW_DEBUG
+ capacity_ = 0;
+#endif
+}
+
+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 CXX_SUPPORTS_FLEXIBLE_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
+ assert(y_size > 0);
+ if (y_size > 0) {
+ vec_[0] = y[0];
+ 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
+}
+
+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) {
+ assert(k < size());
+ return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+ 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 EXTRA_ROW_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+ return this->capacity_;
+}
+#endif // EXTRA_ROW_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 CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ const
+#endif
+ dimension_type capacity) {
+ DB_Row<T>& x = *this;
+ assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ if (capacity == 0)
+ ++capacity;
+#endif
+ assert(x.impl == 0);
+ x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if EXTRA_ROW_DEBUG
+ 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;
+ assert(x.impl);
+#if EXTRA_ROW_DEBUG
+ 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;
+ assert(x.impl && y.impl);
+#if EXTRA_ROW_DEBUG
+ 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;
+ assert(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity);
+ 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) {
+ 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) {
+ 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>() {
+ assert(y.impl);
+ 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>() {
+ assert(y.impl);
+ 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;
+ assert(x.impl);
+ x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::swap(DB_Row& y) {
+ DB_Row<T>& x = *this;
+ std::swap(x.impl, y.impl);
+#if EXTRA_ROW_DEBUG
+ std::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 EXTRA_ROW_DEBUG
+ x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+ // Copy-construct `tmp' from `y'.
+ DB_Row tmp(y);
+ // Swap the implementation of `*this' with the one of `tmp'.
+ swap(tmp);
+ // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+ 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 void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+ assert(size() <= new_size && new_size <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ // vec_[0] is already constructed.
+ if (size() == 0 && new_size > 0)
+ 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);
+ bump_size();
+ }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+ const dimension_type old_size = size();
+ assert(new_size <= old_size);
+ // Since ~T() does not throw exceptions, nothing here does.
+ set_size(new_size);
+#if !CXX_SUPPORTS_FLEXIBLE_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 CXX_SUPPORTS_FLEXIBLE_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
+ assert(y_size > 0);
+ 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
+}
+
+template <typename T>
+typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+ DB_Row<T>& x = *this;
+ return iterator(x.impl->vec_);
+}
+
+template <typename T>
+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>
+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>
+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 bool
+DB_Row<T>::OK(const dimension_type row_size,
+ const dimension_type
+#if EXTRA_ROW_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 EXTRA_ROW_DEBUG
+# if !CXX_SUPPORTS_FLEXIBLE_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
+ if (x.capacity_ != row_capacity) {
+ cerr << "DB_Row capacity mismatch: is " << x.capacity_
+ << ", should be " << row_capacity << "."
+ << endl;
+ is_broken = true;
+ }
+#endif
+ 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 EXTRA_ROW_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
+
+ 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>
+inline 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;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+ Parma_Polyhedra_Library::DB_Row<T>& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator x,
+ typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_DB_Row_inlines_hh)
diff --git a/src/DB_Row.types.hh b/src/DB_Row.types.hh
new file mode 100644
index 0000000..97cb9e8
--- /dev/null
+++ b/src/DB_Row.types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 BT>
+class DB_Row_Impl_Handler;
+
+template <typename BT>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_DB_Row_types_hh)
diff --git a/src/Determinate.defs.hh b/src/Determinate.defs.hh
new file mode 100644
index 0000000..6fd91bb
--- /dev/null
+++ b/src/Determinate.defs.hh
@@ -0,0 +1,316 @@
+/* Determinate class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are the same domain element.
+
+ \relates Determinate
+*/
+template <typename PH>
+bool operator==(const Determinate<PH>& x, const Determinate<PH>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are different domain elements.
+
+ \relates Determinate
+*/
+template <typename PH>
+bool operator!=(const Determinate<PH>& x, const Determinate<PH>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PH>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! Wraps a PPL class into a determinate constraint system interface.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Determinate {
+public:
+ //! \name Constructors and Destructor
+ //@{
+
+ /*! \brief
+ Injection operator: builds the determinate constraint system element
+ corresponding to the base-level element \p p.
+ */
+ Determinate(const PH& p);
+
+ /*! \brief
+ Injection operator: builds the determinate constraint system element
+ corresponding to the base-level element represented by \p cs.
+ */
+ Determinate(const Constraint_System& cs);
+
+ //! \brief
+ //! Injection operator: builds the determinate constraint system element
+ //! corresponding to the base-level element represented 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 element.
+ const PH& element() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the top of the
+ determinate constraint system (i.e., the whole vector space).
+ */
+ bool is_top() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the bottom
+ of the determinate constraint system.
+ */
+ 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 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;
+
+ //! 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);
+
+ /*! \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.
+ PH& element();
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ void mutate();
+
+ //! Assignment operator.
+ Determinate& operator=(const Determinate& y);
+
+ //! Swaps \p *this with \p y.
+ void 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 PH, producing the corresponding function object taking
+ arguments of type Determinate<PH>.
+
+ 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(PH& x, const PH& 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 // 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 // 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 ph is non-const;
+ - 1: one reference, \p ph is non-const;
+ - > 1: more than one reference, \p ph 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:
+ //! A possibly shared base-level domain element.
+ PH ph;
+
+ /*! \brief
+ Builds a new representation by creating a domain element
+ of the specified kind, in the specified vector space.
+ */
+ Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+ //! Builds a new representation by copying base-level element \p p.
+ Rep(const PH& 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==<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+ friend bool
+ operator!=<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+ Parma_Polyhedra_Library::Determinate<PH>& y);
+
+} // namespace std
+
+#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..b6d9a1f
--- /dev/null
+++ b/src/Determinate.inlines.hh
@@ -0,0 +1,291 @@
+/* Determinate class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Determinate_inlines_hh
+#define PPL_Determinate_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : references(0), ph(num_dimensions, kind) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const PH& p)
+ : references(0), ph(p) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Constraint_System& cs)
+ : references(0), ph(cs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Congruence_System& cgs)
+ : references(0), ph(cgs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::~Rep() {
+ assert(references == 0);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::Rep::new_reference() const {
+ ++references;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::del_reference() const {
+ return --references == 0;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::is_shared() const {
+ return references > 1;
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::external_memory_in_bytes() const {
+ return ph.external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const PH& ph)
+ : prep(new Rep(ph)) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Constraint_System& cs)
+ : prep(new Rep(cs)) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Congruence_System& cgs)
+ : prep(new Rep(cgs)) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Determinate& y)
+ : prep(y.prep) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::~Determinate() {
+ if (prep->del_reference())
+ delete prep;
+}
+
+template <typename PH>
+inline Determinate<PH>&
+Determinate<PH>::operator=(const Determinate& y) {
+ y.prep->new_reference();
+ if (prep->del_reference())
+ delete prep;
+ prep = y.prep;
+ return *this;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::swap(Determinate& y) {
+ std::swap(prep, y.prep);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::mutate() {
+ if (prep->is_shared()) {
+ Rep* new_prep = new Rep(prep->ph);
+ (void) prep->del_reference();
+ new_prep->new_reference();
+ prep = new_prep;
+ }
+}
+
+template <typename PH>
+inline const PH&
+Determinate<PH>::element() const {
+ return prep->ph;
+}
+
+template <typename PH>
+inline PH&
+Determinate<PH>::element() {
+ mutate();
+ return prep->ph;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::upper_bound_assign(const Determinate& y) {
+ element().upper_bound_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::meet_assign(const Determinate& y) {
+ element().intersection_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::concatenate_assign(const Determinate& y) {
+ element().concatenate_assign(y.element());
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::definitely_entails(const Determinate& y) const {
+ return prep == y.prep || y.prep->ph.contains(prep->ph);
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_definitely_equivalent_to(const Determinate& y) const {
+ return prep == y.prep || prep->ph == y.prep->ph;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_top() const {
+ return prep->ph.is_universe();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_bottom() const {
+ return prep->ph.is_empty();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::external_memory_in_bytes() const {
+ return prep->total_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::OK() const {
+ return prep->ph.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PH>& x) {
+ s << x.element();
+ return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator==(const Determinate<PH>& x, const Determinate<PH>& y) {
+ return x.prep == y.prep || x.prep->ph == y.prep->ph;
+}
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator!=(const Determinate<PH>& x, const Determinate<PH>& y) {
+ return x.prep != y.prep && x.prep->ph != y.prep->ph;
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+ : op_assign_(op_assign) {
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+ op_assign_(x.element(), y.element());
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PH>::lift_op_assign(Binary_Operator_Assign op_assign) {
+ return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+ Parma_Polyhedra_Library::Determinate<PH>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Determinate_inlines_hh)
diff --git a/src/Determinate.types.hh b/src/Determinate.types.hh
new file mode 100644
index 0000000..71c514e
--- /dev/null
+++ b/src/Determinate.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PH>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Determinate_types_hh)
diff --git a/src/Float.cc b/src/Float.cc
new file mode 100644
index 0000000..c6b05b1
--- /dev/null
+++ b/src/Float.cc
@@ -0,0 +1,42 @@
+/* IEC 559 floating point format related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <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::LSP_MAX;
+
+} // Parma_Polyhedra_Library
diff --git a/src/Float.defs.hh b/src/Float.defs.hh
new file mode 100644
index 0000000..de0519c
--- /dev/null
+++ b/src/Float.defs.hh
@@ -0,0 +1,249 @@
+/* IEC 559 floating point format related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Float_defs_hh
+#define PPL_Float_defs_hh 1
+
+#include "compiler.hh"
+#include <gmp.h>
+#include <cassert>
+#include <cmath>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifndef NAN
+#define NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_single {
+ uint32_t word;
+ static const uint32_t SGN_MASK = 0x80000000;
+ static const uint32_t EXP_MASK = 0x7f800000;
+ static const uint32_t POS_INF = 0x7f800000;
+ static const uint32_t NEG_INF = 0xff800000;
+ static const uint32_t POS_ZERO = 0x00000000;
+ static const uint32_t NEG_ZERO = 0x80000000;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_double {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x80000000;
+ static const uint32_t MSP_POS_INF = 0x7ff00000;
+ static const uint32_t MSP_NEG_INF = 0xfff00000;
+ static const uint32_t MSP_POS_ZERO = 0x00000000;
+ static const uint32_t MSP_NEG_ZERO = 0x80000000;
+ static const uint32_t LSP_INF = 0;
+ static const uint32_t LSP_ZERO = 0;
+ static const uint32_t LSP_MAX = 0xffffffff;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_intel_double_extended {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x00008000;
+ static const uint32_t MSP_POS_INF = 0x00007fff;
+ static const uint32_t MSP_NEG_INF = 0x0000ffff;
+ static const uint32_t MSP_POS_ZERO = 0x00000000;
+ static const uint32_t MSP_NEG_ZERO = 0x00008000;
+ static const uint64_t LSP_INF = 0x8000000000000000ULL;
+ static const uint64_t LSP_ZERO = 0;
+ static const uint64_t LSP_DMAX = 0x7fffffffffffffffULL;
+ static const uint64_t LSP_NMAX = 0xffffffffffffffffULL;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_quad {
+#ifdef WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ static const uint64_t MSP_SGN_MASK = 0x8000000000000000ULL;
+ static const uint64_t MSP_POS_INF = 0x7fff000000000000ULL;
+ static const uint64_t MSP_NEG_INF = 0xffff000000000000ULL;
+ static const uint64_t MSP_POS_ZERO = 0x0000000000000000ULL;
+ static const uint64_t MSP_NEG_ZERO = 0x8000000000000000ULL;
+ static const uint64_t LSP_INF = 0;
+ static const uint64_t LSP_ZERO = 0;
+ static const uint64_t LSP_MAX = 0xffffffffffffffffULL;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Float {
+public:
+ static const bool fpu_related = false;
+};
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> {
+public:
+ typedef CXX_FLOAT_BINARY_FORMAT Binary;
+ union {
+ float number;
+ Binary binary;
+ } u;
+ Float();
+ Float(float v);
+ float value();
+ static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> {
+public:
+ typedef CXX_DOUBLE_BINARY_FORMAT Binary;
+ union {
+ double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(double v);
+ double value();
+ static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> {
+public:
+ typedef CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
+ union {
+ long double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(long double v);
+ long double value();
+ static const bool fpu_related = true;
+};
+#endif
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Float.inlines.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..cb1c86c
--- /dev/null
+++ b/src/Float.inlines.hh
@@ -0,0 +1,388 @@
+/* IEC 559 floating point format related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Float_inlines_hh
+#define PPL_Float_inlines_hh 1
+
+#include <climits>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_single::is_inf() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_ieee754_single::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::is_zero() 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 int
+float_ieee754_single::sign_bit() const {
+ return !!(word & SGN_MASK);
+}
+
+inline void
+float_ieee754_single::dec() {
+ word--;
+}
+
+inline void
+float_ieee754_single::inc() {
+ word++;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+ word = 0x7f7fffff;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+ word = mpz_get_ui(mantissa) & ((1UL << MANTISSA_BITS) - 1);
+ if (negative)
+ word |= SGN_MASK;
+ word |= static_cast<uint32_t>(exponent + EXPONENT_BIAS) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::is_inf() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_ieee754_double::is_nan() 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::is_zero() 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 int
+float_ieee754_double::sign_bit() const {
+ return !!(msp & MSP_SGN_MASK);
+}
+
+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 = 0x7fefffff;
+ lsp = 0xffffffff;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+ lsp = mpz_get_ui(mantissa);
+ mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+ unsigned long m = mpz_get_ui(mantissa);
+#else
+ unsigned long m = mpz_get_ui(mantissa);
+ lsp = m;
+ m >>= 32;
+#endif
+ msp = m & ((1UL << (MANTISSA_BITS - 32)) - 1);
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS)
+ << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_intel_double_extended::is_inf() const {
+ if (lsp != LSP_INF)
+ return 0;
+ uint32_t a = msp & MSP_NEG_INF;
+ if (a == MSP_NEG_INF)
+ return -1;
+ if (a == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_intel_double_extended::is_nan() const {
+ return (msp & MSP_POS_INF) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::is_zero() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ 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 int
+float_intel_double_extended::sign_bit() const {
+ return !!(msp & MSP_SGN_MASK);
+}
+
+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 = 0x00007ffe;
+ lsp = 0xffffffffffffffffULL;
+ 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, 8, 0, 0, mantissa);
+#else
+ lsp = mpz_get_ui(mantissa);
+#endif
+ msp = (negative ? MSP_SGN_MASK : 0);
+ msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS);
+}
+
+inline int
+float_ieee754_quad::is_inf() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_ieee754_quad::is_nan() const {
+ return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::is_zero() 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 int
+float_ieee754_quad::sign_bit() const {
+ return !!(msp & MSP_SGN_MASK);
+}
+
+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 = 0x7ffeffffffffffffULL;
+ lsp = 0xffffffffffffffffULL;
+ 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, 8, 0, 0, mantissa);
+ lsp = parts[0];
+ msp = parts[1];
+ msp &= ((1ULL << (MANTISSA_BITS - 64)) - 1);
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ msp |= static_cast<uint64_t>(exponent + EXPONENT_BIAS)
+ << (MANTISSA_BITS - 64);
+}
+
+#ifdef CXX_FLOAT_BINARY_FORMAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+ u.number = v;
+}
+
+inline float
+Float<float>::value() {
+ return u.number;
+}
+#endif
+
+#ifdef CXX_DOUBLE_BINARY_FORMAT
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+ u.number = v;
+}
+
+inline double
+Float<double>::value() {
+ return u.number;
+}
+#endif
+
+#ifdef CXX_LONG_DOUBLE_BINARY_FORMAT
+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/GMP_Integer.defs.hh b/src/GMP_Integer.defs.hh
new file mode 100644
index 0000000..7d17567
--- /dev/null
+++ b/src/GMP_Integer.defs.hh
@@ -0,0 +1,136 @@
+/* GMP_Integer class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates GMP_Integer */
+memory_size_type total_memory_in_bytes(const GMP_Integer& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates GMP_Integer */
+memory_size_type external_memory_in_bytes(const GMP_Integer& x);
+
+//@} // Memory Size Inspection 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 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,
+ const GMP_Integer& y, const GMP_Integer& z,
+ GMP_Integer& s, GMP_Integer& t);
+
+//! 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);
+
+/*! \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
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+void swap(Parma_Polyhedra_Library::GMP_Integer& x,
+ Parma_Polyhedra_Library::GMP_Integer& y);
+
+} // namespace std
+
+#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..c301cd3
--- /dev/null
+++ b/src/GMP_Integer.inlines.hh
@@ -0,0 +1,112 @@
+/* GMP_Integer class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_GMP_Integer_inlines_hh
+#define PPL_GMP_Integer_inlines_hh 1
+
+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
+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
+gcdext_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z,
+ GMP_Integer& s, GMP_Integer& t) {
+ 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
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ 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;
+}
+
+inline memory_size_type
+external_memory_in_bytes(const GMP_Integer& x) {
+ return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const GMP_Integer& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+inline void
+std::swap(Parma_Polyhedra_Library::GMP_Integer& x,
+ Parma_Polyhedra_Library::GMP_Integer& y) {
+ mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+#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..37f802c
--- /dev/null
+++ b/src/GMP_Integer.types.hh
@@ -0,0 +1,43 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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>
+
+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://www.swox.com/gmp/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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..778d353
--- /dev/null
+++ b/src/Generator.cc
@@ -0,0 +1,381 @@
+/* Generator class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Generator.defs.hh"
+
+#include "Variable.defs.hh"
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Generator::throw_dimension_incompatible(const char* method,
+ const char* name_var,
+ const Variable v) const {
+ std::ostringstream s;
+ s << "PPL::Generator::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension() << ", "
+ << name_var << ".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) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::point(e, d):\n"
+ "d == 0.");
+ Linear_Expression ec = e;
+ Generator g(ec, Generator::POINT, NECESSARILY_CLOSED);
+ g[0] = d;
+
+ // 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)
+ for (dimension_type i = g.size(); i-- > 0; )
+ neg_assign(g[i]);
+
+ // Enforce normalization.
+ g.normalize();
+ return g;
+}
+
+PPL::Generator
+PPL::Generator::closure_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::closure_point(e, d):\n"
+ "d == 0.");
+ // Adding the epsilon dimension with coefficient 0.
+ Linear_Expression ec = 0 * Variable(e.space_dimension());
+ ec += e;
+ // A closure point is indeed a point in the higher dimension space.
+ Generator g = point(ec, d);
+ // Fix the topology.
+ g.set_not_necessarily_closed();
+ // Enforce normalization.
+ g.normalize();
+ return g;
+}
+
+PPL::Generator
+PPL::Generator::ray(const Linear_Expression& e) {
+ // 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;
+ Generator g(ec, Generator::RAY, NECESSARILY_CLOSED);
+ g[0] = 0;
+ // Enforce normalization.
+ g.normalize();
+ return g;
+}
+
+PPL::Generator
+PPL::Generator::line(const Linear_Expression& e) {
+ // 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;
+ Generator g(ec, Generator::LINE, NECESSARILY_CLOSED);
+ g[0] = 0;
+ // Enforce normalization.
+ g.strong_normalize();
+ return g;
+}
+
+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);
+ Linear_Expression y_expr(y);
+ // ... second, re-normalize ...
+ x_expr.normalize();
+ y_expr.normalize();
+ // ... and finally check for syntactic equality.
+ for (dimension_type i = x_space_dim + 1; i-- > 0; )
+ if (x_expr[i] != y_expr[i])
+ return false;
+ return true;
+ }
+
+ // Here the epsilon-coefficient, if present, is zero.
+ // It is sufficient to check for syntactic equality.
+ for (dimension_type i = x_space_dim + 1; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Generator& g) {
+ bool needed_divisor = false;
+ bool extra_parentheses = false;
+ const int num_variables = g.space_dimension();
+ Generator::Type t = g.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 (g[0] != 1) {
+ needed_divisor = true;
+ int num_non_zero_coefficients = 0;
+ for (int v = 0; v < num_variables; ++v)
+ if (g[v+1] != 0)
+ if (++num_non_zero_coefficients > 1) {
+ extra_parentheses = true;
+ s << "(";
+ break;
+ }
+ }
+ break;
+ }
+
+ bool first = true;
+ for (int v = 0; v < num_variables; ++v) {
+ Coefficient gv = g[v+1];
+ if (gv != 0) {
+ if (!first) {
+ if (gv > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(gv);
+ }
+ }
+ else
+ first = false;
+ if (gv == -1)
+ s << "-";
+ else if (gv != 1)
+ s << gv << "*";
+ s << PPL::Variable(v);
+ }
+ }
+ if (first)
+ // A point or closure point in the origin.
+ s << 0;
+ if (extra_parentheses)
+ s << ")";
+ if (needed_divisor)
+ s << "/" << g[0];
+ 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 {
+ assert(topology() == p.topology()
+ && space_dimension() == p.space_dimension()
+ && type() == CLOSURE_POINT
+ && p.type() == POINT);
+ const Generator& cp = *this;
+ if (cp[0] == p[0]) {
+ // Divisors are equal: we can simply compare coefficients
+ // (disregarding the epsilon coefficient).
+ for (dimension_type i = cp.size() - 2; i > 0; --i)
+ if (cp[i] != p[i])
+ return false;
+ return true;
+ }
+ else {
+ // Divisors are different: divide them by their GCD
+ // to simplify the following computation.
+ TEMP_INTEGER(gcd);
+ gcd_assign(gcd, cp[0], p[0]);
+ const bool rel_prime = (gcd == 1);
+ TEMP_INTEGER(cp_0_scaled);
+ TEMP_INTEGER(p_0_scaled);
+ if (!rel_prime) {
+ exact_div_assign(cp_0_scaled, cp[0], gcd);
+ exact_div_assign(p_0_scaled, p[0], gcd);
+ }
+ const Coefficient& cp_div = rel_prime ? cp[0] : cp_0_scaled;
+ const Coefficient& p_div = rel_prime ? p[0] : p_0_scaled;
+ TEMP_INTEGER(prod1);
+ TEMP_INTEGER(prod2);
+ for (dimension_type i = cp.size() - 2; i > 0; --i) {
+ prod1 = cp[i] * p_div;
+ prod2 = p[i] * cp_div;
+ if (prod1 != prod2)
+ return false;
+ }
+ return true;
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator);
+
+bool
+PPL::Generator::OK() const {
+ const Generator& g = *this;
+
+ // Topology consistency check.
+ const dimension_type min_size = is_necessarily_closed() ? 1 : 2;
+ if (size() < min_size) {
+#ifndef NDEBUG
+ std::cerr << "Generator has fewer coefficients than the minimum "
+ << "allowed by its topology:"
+ << std::endl
+ << "size is " << size()
+ << ", minimum is " << min_size << "."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Normalization check.
+ Generator tmp = g;
+ tmp.strong_normalize();
+ if (tmp != g) {
+#ifndef NDEBUG
+ std::cerr << "Generators should be strongly normalized!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ switch (g.type()) {
+ case LINE:
+ // Intentionally fall through.
+ case RAY:
+ if (g[0] != 0) {
+#ifndef NDEBUG
+ std::cerr << "Lines must have a zero inhomogeneous term!"
+ << std::endl;
+#endif
+ return false;
+ }
+ if (!g.is_necessarily_closed() && g[size() - 1] != 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 (g.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 (g[0] <= 0) {
+#ifndef NDEBUG
+ std::cerr << "Points must have a positive divisor!"
+ << std::endl;
+#endif
+ return false;
+ }
+ if (!g.is_necessarily_closed())
+ if (g[size() - 1] <= 0) {
+#ifndef NDEBUG
+ std::cerr << "In the NNC topology, points must have epsilon > 0"
+ << std::endl;
+#endif
+ return false;
+ }
+ break;
+
+ case CLOSURE_POINT:
+ if (g[0] <= 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.defs.hh b/src/Generator.defs.hh
new file mode 100644
index 0000000..57caab1
--- /dev/null
+++ b/src/Generator.defs.hh
@@ -0,0 +1,508 @@
+/* Generator class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Generator_defs_hh
+#define PPL_Generator_defs_hh 1
+
+#include "Generator.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Row.defs.hh"
+#include "Variable.defs.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.defs.hh"
+#include "Congruence_System.types.hh"
+#include "Linear_Expression.defs.hh"
+#include "Polyhedron.types.hh"
+#include "Grid_Generator.types.hh"
+#include "Grid_Generator_System.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator */
+void swap(Parma_Polyhedra_Library::Generator& x,
+ Parma_Polyhedra_Library::Generator& y);
+
+} // namespace std
+
+
+//! 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 (int i = g1.space_dimension() - 1; i >= 0; i--)
+ 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 : private Linear_Row {
+public:
+ //! 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);
+
+ //! 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);
+
+ //! 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());
+
+ //! 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());
+
+ //! Ordinary copy-constructor.
+ Generator(const Generator& g);
+
+ //! Destructor.
+ ~Generator();
+
+ //! Assignment operator.
+ Generator& operator=(const Generator& g);
+
+ //! 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;
+
+ //! 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 // 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;
+
+ //! 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;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void swap(Generator& y);
+
+private:
+ /*! \brief
+ Builds a generator of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+ */
+ Generator(Linear_Expression& e, Type type, Topology topology);
+
+ /*! \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,
+ 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 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;
+ friend class Parma_Polyhedra_Library::Grid_Generator;
+ // This is for access to Row and Linear_Row in `insert'.
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+ friend
+ Parma_Polyhedra_Library
+ ::Linear_Expression::Linear_Expression(const Generator& g);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Generator& g);
+
+ //! Copy-constructor with given space dimension.
+ Generator(const Generator& g, dimension_type dimension);
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+ bool is_ray_or_point() const;
+
+ //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Linear_Row 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;
+
+ //! Default constructor: private and not implemented.
+ Generator();
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator Generator::line(const Linear_Expression& e).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e);
+
+//! Shorthand for Generator Generator::ray(const Linear_Expression& e).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e);
+
+/*! \brief
+ Shorthand for Generator
+ Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+ \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+ Shorthand for Generator
+ Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+ \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+//! 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);
+
+
+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..b66f4f1
--- /dev/null
+++ b/src/Generator.inlines.hh
@@ -0,0 +1,225 @@
+/* Generator class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Generator_inlines_hh
+#define PPL_Generator_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator::Generator(Linear_Expression& e, Type type, Topology topology) {
+ assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+ Linear_Row::swap(e);
+ flags() = Flags(topology, (type == LINE
+ ? LINE_OR_EQUALITY
+ : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Generator::Generator(const Generator& g)
+ : Linear_Row(g) {
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type dimension)
+ : Linear_Row(g, dimension, dimension) {
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+ Linear_Row::operator=(g);
+ return *this;
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+ return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+ return Linear_Row::space_dimension();
+}
+
+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 (*this)[0] == 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.
+ const Generator& g = *this;
+ return (g[size() - 1] == 0) ? CLOSURE_POINT : 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 Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+ Coefficient_traits::const_reference d = Linear_Row::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 memory_size_type
+Generator::external_memory_in_bytes() const {
+ return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+ return Linear_Row::total_memory_in_bytes();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+ static const Generator zdp = point();
+ return zdp;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+ static const Generator zdcp = closure_point();
+ return zdcp;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e) {
+ return Generator::line(e);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e) {
+ return Generator::ray(e);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d) {
+ return Generator::point(e, d);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ return Generator::closure_point(e, d);
+}
+
+/*! \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 {
+ Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+ return Linear_Row::ascii_load(s);
+}
+
+inline void
+Generator::swap(Generator& y) {
+ Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+inline void
+swap(Parma_Polyhedra_Library::Generator& x,
+ Parma_Polyhedra_Library::Generator& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Generator_inlines_hh)
diff --git a/src/Generator.types.hh b/src/Generator.types.hh
new file mode 100644
index 0000000..6ed070c
--- /dev/null
+++ b/src/Generator.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Generator_System.cc b/src/Generator_System.cc
new file mode 100644
index 0000000..821ef2f
--- /dev/null
+++ b/src/Generator_System.cc
@@ -0,0 +1,1032 @@
+/* Generator_System class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Generator_System.defs.hh"
+#include "Generator_System.inlines.hh"
+#include "Constraint.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#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) {
+ assert(space_dimension() <= new_space_dim);
+
+ const dimension_type old_space_dim = space_dimension();
+ const Topology old_topology = topology();
+ dimension_type cols_to_be_added = new_space_dim - old_space_dim;
+
+ // Dealing with empty constraint systems first.
+ if (num_rows() == 0) {
+ if (num_columns() == 0)
+ if (new_topology == NECESSARILY_CLOSED) {
+ add_zero_columns(cols_to_be_added + 1);
+ set_necessarily_closed();
+ }
+ else {
+ add_zero_columns(cols_to_be_added + 2);
+ set_not_necessarily_closed();
+ }
+ else
+ // Here `num_columns() > 0'.
+ if (old_topology != new_topology)
+ if (new_topology == NECESSARILY_CLOSED) {
+ switch (cols_to_be_added) {
+ case 0:
+ remove_trailing_columns(1);
+ break;
+ case 1:
+ // Nothing to do.
+ break;
+ default:
+ add_zero_columns(cols_to_be_added - 1);
+ }
+ set_necessarily_closed();
+ }
+ else {
+ // Here old_topology == NECESSARILY_CLOSED
+ // and new_topology == NOT_NECESSARILY_CLOSED.
+ add_zero_columns(cols_to_be_added + 1);
+ set_not_necessarily_closed();
+ }
+ else
+ // Here topologies agree.
+ if (cols_to_be_added > 0)
+ add_zero_columns(cols_to_be_added);
+ assert(OK());
+ return true;
+ }
+
+ // Here `num_rows() > 0'.
+ if (cols_to_be_added > 0)
+ if (old_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).
+ Generator_System& gs = *this;
+ dimension_type num_closure_points = 0;
+ dimension_type gs_end = gs.num_rows();
+ for (dimension_type i = 0; i < gs_end; ) {
+ // All the closure points seen so far have consecutive
+ // indices starting from `i'.
+ if (num_closure_points > 0)
+ // Let next generator have index `i'.
+ std::swap(gs[i], gs[i+num_closure_points]);
+ if (gs[i].is_closure_point()) {
+ ++num_closure_points;
+ --gs_end;
+ }
+ else
+ ++i;
+ }
+ // We may have identified some closure points.
+ if (num_closure_points > 0) {
+ assert(num_closure_points == num_rows() - gs_end);
+ erase_to_end(gs_end);
+ }
+ // Remove the epsilon column, re-normalize and, after that,
+ // add the missing dimensions. This ensures that
+ // non-zero epsilon coefficients will be cleared.
+ remove_trailing_columns(1);
+ set_necessarily_closed();
+ normalize();
+ add_zero_columns(cols_to_be_added);
+ }
+ else {
+ // A NECESSARILY_CLOSED generator system is converted to
+ // a NOT_NECESSARILY_CLOSED one by adding a further column
+ // and setting the epsilon coordinate of all points to 1.
+ // Note: normalization is preserved.
+ add_zero_columns(cols_to_be_added + 1);
+ Generator_System& gs = *this;
+ const dimension_type eps_index = new_space_dim + 1;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ gs[i][eps_index] = gs[i][0];
+ set_not_necessarily_closed();
+ }
+ else {
+ // Topologies agree: first add the required zero columns ...
+ add_zero_columns(cols_to_be_added);
+ // ... and, if needed, move the epsilon coefficients
+ // to the new last column.
+ if (old_topology == NOT_NECESSARILY_CLOSED)
+ swap_columns(old_space_dim + 1, new_space_dim + 1);
+ }
+ else
+ // Here `cols_to_be_added == 0'.
+ if (old_topology != new_topology)
+ if (new_topology == NECESSARILY_CLOSED) {
+ // A NOT_NECESSARILY_CLOSED generator system
+ // can be converted in to a NECESSARILY_CLOSED one
+ // only if it does not contain closure points.
+ if (has_closure_points())
+ return false;
+ // We just remove the column of the epsilon coefficients.
+ remove_trailing_columns(1);
+ set_necessarily_closed();
+ }
+ else {
+ // Add the column of the epsilon coefficients
+ // and set the epsilon coordinate of all points to 1.
+ // Note: normalization is preserved.
+ add_zero_columns(1);
+ Generator_System& gs = *this;
+ const dimension_type eps_index = new_space_dim + 1;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ gs[i][eps_index] = gs[i][0];
+ set_not_necessarily_closed();
+ }
+ // We successfully adjusted dimensions and topology.
+ 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() {
+ assert(!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.num_rows();
+ const dimension_type eps_index = gs.num_columns() - 1;
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ const Generator& g = gs[i];
+ if (g[eps_index] > 0) {
+ // `g' is a point: adding the closure point.
+ Generator cp = g;
+ cp[eps_index] = 0;
+ // Enforcing normalization.
+ cp.normalize();
+ gs.add_pending_row(cp);
+ }
+ }
+ 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() {
+ assert(!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.num_rows();
+ const dimension_type eps_index = gs.num_columns() - 1;
+ for (dimension_type i = 0; i < n_rows; i++) {
+ const Generator& g = gs[i];
+ if (!g.is_line_or_ray() && g[eps_index] == 0) {
+ // `g' is a closure point: adding the point.
+ // Note: normalization is preserved.
+ Generator p = g;
+ p[eps_index] = p[0];
+ gs.add_pending_row(p);
+ }
+ }
+ assert(OK());
+}
+
+bool
+PPL::Generator_System::has_closure_points() const {
+ if (is_necessarily_closed())
+ return false;
+ // Adopt the point of view of the user.
+ for (Generator_System::const_iterator i = begin(),
+ iend = end(); i != iend; ++i)
+ if (i->is_closure_point())
+ return true;
+ return false;
+}
+
+bool
+PPL::Generator_System::has_points() const {
+ const Generator_System& gs = *this;
+ // Avoiding the repeated tests on topology.
+ if (is_necessarily_closed())
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ if (!gs[i].is_line_or_ray())
+ return true;
+ }
+ else {
+ // !is_necessarily_closed()
+ const dimension_type eps_index = gs.num_columns() - 1;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ if (gs[i][eps_index] != 0)
+ return true;
+ }
+ return false;
+}
+
+void
+PPL::Generator_System::const_iterator::skip_forward() {
+ const Linear_System::const_iterator gsp_end = gsp->end();
+ if (i != gsp_end) {
+ Linear_System::const_iterator i_next = i;
+ ++i_next;
+ if (i_next != gsp_end) {
+ const Generator& cp = static_cast<const Generator&>(*i);
+ const Generator& p = static_cast<const Generator&>(*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) {
+ // We are sure that the matrix has no pending rows
+ // and that the new row is not a pending generator.
+ assert(num_pending_rows() == 0);
+ if (topology() == g.topology())
+ Linear_System::insert(g);
+ else
+ // `*this' and `g' have different topologies.
+ if (is_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.
+ const dimension_type eps_index = num_columns();
+ add_zero_columns(1);
+ Generator_System& gs = *this;
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ Generator& gen = gs[i];
+ if (!gen.is_line_or_ray())
+ gen[eps_index] = gen[0];
+ }
+ set_not_necessarily_closed();
+ // Inserting the new generator.
+ Linear_System::insert(g);
+ }
+ else {
+ // The generator system is NOT necessarily closed:
+ // copy the generator, adding the missing dimensions
+ // and the epsilon coefficient.
+ const dimension_type new_size = 2 + std::max(g.space_dimension(),
+ space_dimension());
+ Generator tmp_g(g, new_size);
+ // 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 (!tmp_g.is_line_or_ray())
+ tmp_g[new_size - 1] = tmp_g[0];
+ tmp_g.set_not_necessarily_closed();
+ // Inserting the new generator.
+ Linear_System::insert(tmp_g);
+ }
+ assert(OK());
+}
+
+void
+PPL::Generator_System::insert_pending(const Generator& g) {
+ if (topology() == g.topology())
+ Linear_System::insert_pending(g);
+ else
+ // `*this' and `g' have different topologies.
+ if (is_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.
+ const dimension_type eps_index = num_columns();
+ add_zero_columns(1);
+ Generator_System& gs = *this;
+ for (dimension_type i = num_rows(); i-- > 0; ) {
+ Generator& gen = gs[i];
+ if (!gen.is_line_or_ray())
+ gen[eps_index] = gen[0];
+ }
+ set_not_necessarily_closed();
+ // Inserting the new generator.
+ Linear_System::insert_pending(g);
+ }
+ else {
+ // The generator system is NOT necessarily closed:
+ // copy the generator, adding the missing dimensions
+ // and the epsilon coefficient.
+ const dimension_type new_size = 2 + std::max(g.space_dimension(),
+ space_dimension());
+ Generator tmp_g(g, new_size);
+ // 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 (!tmp_g.is_line_or_ray())
+ tmp_g[new_size - 1] = tmp_g[0];
+ tmp_g.set_not_necessarily_closed();
+ // Inserting the new generator.
+ Linear_System::insert_pending(tmp_g);
+ }
+ 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.
+ assert(num_pending_rows() == 0);
+ const Generator_System& gs = *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 (is_sorted()) {
+ dimension_type nrows = num_rows();
+ for (dimension_type i = 0; i < nrows && gs[i].is_line(); ++i)
+ ++n;
+ }
+ else
+ for (dimension_type i = 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.
+ assert(num_pending_rows() == 0);
+ const Generator_System& gs = *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 (is_sorted()) {
+ for (dimension_type i = num_rows(); i != 0 && gs[--i].is_ray_or_point(); )
+ if (gs[i].is_line_or_ray())
+ ++n;
+ }
+ else
+ for (dimension_type i = 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.
+ 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 = num_rows();
+ 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 num_columns 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 {
+ 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 columns).
+ 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.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.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.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(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ Generator_System& x = *this;
+ // `v' is the index of a column corresponding to
+ // a "user" variable (i.e., it cannot be the inhomogeneous term,
+ // nor the epsilon dimension of NNC polyhedra).
+ assert(v > 0 && v <= x.space_dimension());
+ assert(expr.space_dimension() <= x.space_dimension());
+ assert(denominator > 0);
+
+ const dimension_type n_columns = x.num_columns();
+ const dimension_type n_rows = x.num_rows();
+
+ // Compute the numerator of the affine transformation and assign it
+ // to the column of `*this' indexed by `v'.
+ TEMP_INTEGER(numerator);
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Generator& row = x[i];
+ Scalar_Products::assign(numerator, expr, row);
+ std::swap(numerator, row[v]);
+ }
+
+ 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'.
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Generator& row = x[i];
+ for (dimension_type j = n_columns; j-- > 0; )
+ if (j != v)
+ row[j] *= denominator;
+ }
+ }
+
+ // 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 > expr.space_dimension() || expr[v] == 0);
+ if (not_invertible)
+ x.remove_invalid_lines_and_rays();
+
+ // Strong normalization also resets the sortedness flag.
+ x.strong_normalize();
+}
+
+void
+PPL::Generator_System::ascii_dump(std::ostream& s) const {
+ const Generator_System& x = *this;
+ const dimension_type x_num_rows = x.num_rows();
+ const dimension_type x_num_columns = x.num_columns();
+ s << "topology " << (is_necessarily_closed()
+ ? "NECESSARILY_CLOSED"
+ : "NOT_NECESSARILY_CLOSED")
+ << "\n"
+ << x_num_rows << " x " << x_num_columns << ' '
+ << (x.is_sorted() ? "(sorted)" : "(not_sorted)")
+ << "\n"
+ << "index_first_pending " << x.first_pending_row()
+ << "\n";
+ for (dimension_type i = 0; i < x_num_rows; ++i) {
+ const Generator& g = x[i];
+ for (dimension_type j = 0; j < x_num_columns; ++j)
+ s << g[j] << ' ';
+ switch (g.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;
+ }
+ s << "\n";
+ }
+}
+
+PPL_OUTPUT_DEFINITIONS(Generator_System);
+
+bool
+PPL::Generator_System::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "topology")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "NECESSARILY_CLOSED")
+ set_necessarily_closed();
+ else {
+ if (str != "NOT_NECESSARILY_CLOSED")
+ return false;
+ set_not_necessarily_closed();
+ }
+
+ dimension_type nrows;
+ dimension_type ncols;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str))
+ return false;
+ if (!(s >> ncols))
+ return false;
+ resize_no_copy(nrows, ncols);
+
+ if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+ return false;
+ set_sorted(str == "(sorted)");
+ dimension_type index;
+ if (!(s >> str) || str != "index_first_pending")
+ return false;
+ if (!(s >> index))
+ return false;
+ set_index_first_pending_row(index);
+
+ Generator_System& x = *this;
+ for (dimension_type i = 0; i < x.num_rows(); ++i) {
+ for (dimension_type j = 0; j < x.num_columns(); ++j)
+ if (!(s >> x[i][j]))
+ return false;
+
+ if (!(s >> str))
+ return false;
+ if (str == "L")
+ x[i].set_is_line();
+ else
+ x[i].set_is_ray_or_point();
+
+ // Checking for equality of actual and declared types.
+ switch (x[i].type()) {
+ case Generator::LINE:
+ if (str == "L")
+ continue;
+ break;
+ case Generator::RAY:
+ if (str == "R")
+ continue;
+ break;
+ case Generator::POINT:
+ if (str == "P")
+ continue;
+ break;
+ case Generator::CLOSURE_POINT:
+ if (str == "C")
+ continue;
+ break;
+ }
+ // Reaching this point means that the input was illegal.
+ return false;
+ }
+
+ // Checking for well-formedness.
+
+ 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.
+ Generator_System& gs = *this;
+ dimension_type n_rows = gs.num_rows();
+ if (num_pending_rows() == 0) {
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Generator& g = gs[i];
+ if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) {
+ // An invalid line/ray has been found.
+ --n_rows;
+ std::swap(g, gs[n_rows]);
+ gs.set_sorted(false);
+ }
+ }
+ set_index_first_pending_row(n_rows);
+ }
+ else {
+ // If the matrix has some pending rows, we can not
+ // swap the "normal" rows with the pending rows. So
+ // we must put at the end of the "normal" rows
+ // the invalid "normal" rows, put them at the end
+ // of the matrix, find the invalid rows in the pending
+ // part and then erase the invalid rows that now
+ // are in the bottom part of the matrix.
+ assert(num_pending_rows() > 0);
+ dimension_type first_pending = first_pending_row();
+ for (dimension_type i = first_pending; i-- > 0; ) {
+ Generator& g = gs[i];
+ if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) {
+ // An invalid line/ray has been found.
+ --first_pending;
+ std::swap(g, gs[first_pending]);
+ gs.set_sorted(false);
+ }
+ }
+ const dimension_type num_invalid_rows
+ = first_pending_row() - first_pending;
+ set_index_first_pending_row(first_pending);
+ for (dimension_type i = 0; i < num_invalid_rows; ++i)
+ std::swap(gs[n_rows - i], gs[first_pending + i]);
+ n_rows -= num_invalid_rows;
+ for (dimension_type i = n_rows; i-- > first_pending; ) {
+ Generator& g = gs[i];
+ if (g.is_line_or_ray() && g.all_homogeneous_terms_are_zero()) {
+ // An invalid line/ray has been found.
+ --n_rows;
+ std::swap(g, gs[n_rows]);
+ gs.set_sorted(false);
+ }
+ }
+ }
+ gs.erase_to_end(n_rows);
+}
+
+bool
+PPL::Generator_System::OK() const {
+ // A Generator_System must be a valid Linear_System; do not check for
+ // strong normalization, since this will be done when
+ // checking each individual generator.
+ if (!Linear_System::OK(false))
+ return false;
+
+ // Checking each generator in the system.
+ const Generator_System& x = *this;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ if (!x[i].OK())
+ return false;
+
+ // All checks passed.
+ return true;
+}
+
+/*! \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++;
+ 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..6fdb704
--- /dev/null
+++ b/src/Generator_System.defs.hh
@@ -0,0 +1,506 @@
+/* Generator_System class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Generator_System_defs_hh
+#define PPL_Generator_System_defs_hh 1
+
+#include "Generator_System.types.hh"
+#include "Grid_Generator_System.types.hh"
+#include "Linear_Expression.types.hh"
+#include "Linear_System.defs.hh"
+#include "Generator.types.hh"
+#include "Constraint.types.hh"
+#include "Polyhedron.types.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Grid.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
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+void swap(Parma_Polyhedra_Library::Generator_System& x,
+ Parma_Polyhedra_Library::Generator_System& y);
+
+} // namespace std
+
+//! 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 : private Linear_System {
+public:
+ //! Default constructor: builds an empty system of generators.
+ Generator_System();
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Generator_System(const Generator& g);
+
+ //! Ordinary copy-constructor.
+ Generator_System(const Generator_System& gs);
+
+ //! Destructor.
+ ~Generator_System();
+
+ //! Assignment operator.
+ Generator_System& operator=(const Generator_System& y);
+
+ //! 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;
+
+ /*! \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
+ Returns the singleton system containing only
+ Generator::zero_dim_point().
+ */
+ static const Generator_System& zero_dim_univ();
+
+ //! 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 const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Generator,
+ ptrdiff_t,
+ const Generator*,
+ const 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 Generator& operator*() const;
+
+ //! Indirect member selector.
+ const 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 Generator_System;
+
+ //! The const iterator over the Linear_System.
+ Linear_System::const_iterator i;
+
+ //! A const pointer to the Linear_System.
+ const Linear_System* gsp;
+
+ //! Constructor.
+ const_iterator(const Linear_System::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();
+ };
+
+ /*! \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.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p *this is a valid
+ Linear_System and each row in the system is a valid Generator.
+ */
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) 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.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(Generator_System& y);
+
+private:
+ friend class const_iterator;
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+ const Polyhedron& y);
+
+ //! Builds an empty system of generators having the specified topology.
+ explicit Generator_System(Topology topol);
+
+ /*! \brief
+ Builds a system of \p n_rows rays/points on a \p n_columns - 1
+ dimensional space (including the \f$\epsilon\f$ dimension, if
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+ */
+ Generator_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns);
+
+ /*! \brief
+ Adjusts \p *this so that it matches the topology and
+ the number of space dimensions given as parameters
+ (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 topol,
+ dimension_type num_dimensions);
+
+ /*! \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;
+
+ //! Returns the \p k- th generator of the system.
+ Generator& operator[](dimension_type k);
+
+ //! 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
+ Index of the column 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 \p v -th
+ 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(dimension_type 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's 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);
+};
+
+// 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..fc6471b
--- /dev/null
+++ b/src/Generator_System.inlines.hh
@@ -0,0 +1,212 @@
+/* Generator_System class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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()
+ : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g)
+ : Linear_System(g.topology()) {
+ Linear_System::insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+ : Linear_System(gs) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol)
+ : Linear_System(topol) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+ const dimension_type n_rows,
+ const dimension_type n_columns)
+ : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+ Linear_System::operator=(y);
+ return *this;
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+ return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+ return Linear_System::space_dimension();
+}
+
+inline void
+Generator_System::clear() {
+ Linear_System::clear();
+}
+
+inline Generator&
+Generator_System::operator[](const dimension_type k) {
+ return static_cast<Generator&>(Linear_System::operator[](k));
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+ return static_cast<const Generator&>(Linear_System::operator[](k));
+}
+
+inline
+Generator_System::const_iterator::const_iterator()
+ : i(), gsp(0) {
+}
+
+inline
+Generator_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Generator_System::const_iterator&
+Generator_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ gsp = y.gsp;
+ return *this;
+}
+
+inline const Generator&
+Generator_System::const_iterator::operator*() const {
+ return static_cast<const Generator&>(*i);
+}
+
+inline const Generator*
+Generator_System::const_iterator::operator->() const {
+ return static_cast<const Generator*>(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 const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Generator_System::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Generator_System::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Generator_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+ const Generator_System& gsys)
+ : i(iter), gsp(&gsys) {
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+ const_iterator i(Linear_System::begin(), *this);
+ if (!is_necessarily_closed())
+ i.skip_forward();
+ return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+ const const_iterator i(Linear_System::end(), *this);
+ return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+ static const Generator_System zdu(Generator::zero_dim_point());
+ return zdu;
+}
+
+inline void
+Generator_System::swap(Generator_System& y) {
+ Linear_System::swap(y);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+ return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+ return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Generator_System::simplify() {
+ Linear_System::simplify();
+ remove_invalid_lines_and_rays();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Generator_System& x,
+ Parma_Polyhedra_Library::Generator_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#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..0166685
--- /dev/null
+++ b/src/Generator_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Generator_System_types_hh)
diff --git a/src/Grid.defs.hh b/src/Grid.defs.hh
new file mode 100644
index 0000000..c4652b0
--- /dev/null
+++ b/src/Grid.defs.hh
@@ -0,0 +1,2485 @@
+/* Grid class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_defs_hh
+#define PPL_Grid_defs_hh 1
+
+#define STRONG_REDUCTION
+
+#include "Grid.types.hh"
+#include "globals.defs.hh"
+#include "Variable.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.defs.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 <vector>
+#include <iosfwd>
+
+// Dimension kind vector tracing
+#define print_dim_kinds(msg, dim_kinds) \
+ std::cout << msg << "dim_kinds:"; \
+ for (Dimension_Kinds::iterator i = dim_kinds.begin(); i != dim_kinds.end(); ++i) \
+ std::cout << " " << *i; \
+ std::cout << std::endl;
+#if 0
+#define trace_dim_kinds(msg, dim_kinds) print_dim_kinds(msg, dim_kinds)
+#else
+#define trace_dim_kinds(msg, dim_kinds)
+#endif
+
+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
+
+/*! \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.
+
+ 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 the 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.
+ Most operators on grids are provided with two implementations:
+ one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+ also enforces the minimization of the representations,
+ and returns the boolean value <CODE>false</CODE> whenever
+ the resulting grid turns out to be empty.
+
+ A key attributes 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_generator(grid_point(0*x + 0*y));
+ gr.add_generator(grid_line(x));
+ gr.add_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_generator(grid_point(0*x + 0*y));
+ gr.add_generator(grid_point(4*x + 0*y));
+ gr.add_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_generator(grid_point(0*x + 0*y));
+ gr.add_generator(grid_point(4*x + 0*y));
+ gr.add_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 to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ gr.remove_space_dimensions(to_be_removed);
+ \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> to_be_removed1;
+ to_be_removed1.insert(y);
+ gr.remove_space_dimensions(to_be_removed1);
+ set<Variable> to_be_removed2;
+ to_be_removed2.insert(z);
+ gr.remove_space_dimensions(to_be_removed2);
+ \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 to_be_removed2
+ 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:
+ //! Returns the maximum space dimension all kinds of Grid can handle.
+ static dimension_type max_space_dimension();
+
+ //! 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,
+ const 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
+ will be recycled to build the grid.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(Congruence_System& cgs);
+
+ //! 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::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.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(Constraint_System& cs);
+
+ //! Builds a grid, copying a system of generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param const_gs
+ 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& const_gs);
+
+ //! Builds a grid, recycling a system of generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the grid. Its data-structures
+ will be recycled to build 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(Grid_Generator_System& gs);
+
+ //! Builds a grid out of a generic, interval-based bounding box.
+ /*!
+ \param box
+ The bounding box representing the grid to be built. The box can
+ contain only point and universe intervals;
+
+ \param dummy
+ A dummy tag to make this constructor syntactically unique.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p box contains at least one interval with: a
+ topologically open bound, a single bound, or two bounds which have
+ space between them.
+
+ The template class Box must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the bounding box.
+ \code
+ bool is_empty() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the bounding box
+ describes the empty set.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ */
+ template <typename Box>
+ Grid(const Box& box, From_Bounding_Box dummy);
+
+ //! Builds a grid out of a generic, interval-based covering box.
+ /*!
+ The covering box is a set of upper and lower values for each
+ dimension. When a covering box is tiled onto empty space the
+ corners of the tiles form a rectilinear grid.
+
+ A box interval with only one bound fixes the values of all grid
+ points in the dimension associated with the box to the value of
+ the bound. A box interval which has upper and lower bounds of
+ equal value allows all grid points with any value in the dimension
+ associated with the interval. The presence of a universe interval
+ results in the empty grid. The empty box produces the empty grid
+ of the same dimension as the box.
+
+ \param box
+ The covering box representing the grid to be built;
+
+ \param dummy
+ A dummy tag to make this constructor syntactically unique.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p box contains any topologically open bounds.
+
+ The template class Box must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the covering box.
+ \code
+ bool is_empty() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the covering box
+ describes the empty set.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ */
+ template <typename Box>
+ Grid(const Box& box, From_Covering_Box dummy);
+
+ //! Ordinary copy-constructor.
+ Grid(const Grid& y);
+
+ /*! \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;
+
+ //! Returns the system of congruences.
+ const Congruence_System& congruences() const;
+
+ //! Returns the system of congruences in reduced form.
+ const Congruence_System& minimized_congruences() const;
+
+ //! Returns the system of generators.
+ const Grid_Generator_System& generators() const;
+
+ //! Returns the minimized system of generators.
+ const Grid_Generator_System& minimized_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;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is an empty
+ grid.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> 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.
+ */
+ 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;
+
+ //! 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,
+ Grid_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,
+ Grid_Generator& point) 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;
+
+ //! Uses \p *this to shrink a generic, interval-based bounding box.
+ /*!
+ \param box
+ The bounding box to be shrunk.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p box are dimension-incompatible, or if \p
+ box contains any topologically open bounds.
+
+ The template class Box must provide the following methods
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the bounding box.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ \code
+ set_empty()
+ \endcode
+ Causes the box to become empty, i.e., to represent the empty set.
+ \code
+ raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$[n/d, +\infty)\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+ \code
+ lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$(-\infty, n/d]\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+
+ The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+ will be called at most once for each possible value for <CODE>k</CODE>
+ and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+ that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+ is positive, \f$0/1\f$ being the unique representation for zero.
+ The same guarantee is offered for the function
+ <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+ */
+ template <typename Box>
+ void shrink_bounding_box(Box& box) const;
+
+ //! Writes the covering box for \p *this into \p box.
+ /*!
+ The covering box is a set of upper and lower values for each
+ dimension. When the covering box written into \p box is tiled
+ onto empty space the corners of the tiles form the sparsest
+ rectilinear grid that includes \p *this.
+
+ The value of the lower bound of each interval of the resulting \p
+ box are as close as possible to the origin, with positive values
+ taking preference when the lowest positive value equals the lowest
+ negative value.
+
+ If all the points have a single value in a particular dimension of
+ the grid then there is only a lower bound on the interval produced
+ in \p box, and the lower bound denotes the single value for the
+ dimension. If the coordinates of the points in a particular
+ dimension include every value then the upper and lower bounds of
+ the associated interval in \p box are set equal. The empty grid
+ produces the empty \p box. The zero dimension universe grid
+ produces the zero dimension universe box.
+
+ \param box
+ The Box into which the covering box is written.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p box are dimension-incompatible.
+
+ The template class Box must provide the following methods
+ \code
+ Box(dimension_type space_dimension)
+ \endcode
+ Creates a universe box of space_dimension dimensions.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the covering box.
+ \code
+ set_empty()
+ \endcode
+ Causes the box to become empty, i.e., to represent the empty set.
+ \code
+ raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$[n/d, +\infty)\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+ \code
+ lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$(-\infty, n/d]\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+
+ The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+ will be called at most once for each possible value for <CODE>k</CODE>
+ and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+ that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+ is positive, \f$0/1\f$ being the unique representation for zero.
+ The same guarantee is offered for the function
+ <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+ */
+ template <typename Box>
+ void get_covering_box(Box& box) 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);
+
+ //! Adds constraint \p c to \p *this.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void add_congruence(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to the system of congruences of \p
+ *this, reducing the result
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ bool add_congruence_and_minimize(const Congruence& c);
+
+ //! Adds a copy of constraint \p c to \p *this, reducing the result.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ bool add_congruence_and_minimize(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of 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_generator(const Grid_Generator& g);
+
+ /*! \brief
+ Adds a copy of generator \p g to the system of generators of \p
+ *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_generator_and_minimize(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 a copy of each equality constraint in \p cs to \p *this.
+ /*!
+ \param cs
+ The congruences that will be considered for addition 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 Constraint_System& cs);
+
+ //! Adds the congruences in \p cgs to *this.
+ /*!
+ \param cgs
+ The congruence system that will be recycled, adding its
+ congruences to the system of congruences of \p *this.
+
+ \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 the equality constraints in \p cs to \p *this.
+ /*!
+ \param cs
+ The constraint system from which constraints will be considered
+ for addition to the system of congruences of \p *this.
+
+ \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_congruences(Constraint_System& cs);
+
+ /*! \brief
+ Adds a copy of the congruences in \p cgs to the system of
+ congruences of \p *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_congruences_and_minimize(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds a copy of each equality constraint in \p cs to \p *this,
+ reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ Contains the constraints that will be added to the system of
+ congruences of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ bool add_congruences_and_minimize(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the congruences in \p cgs to the system of congruences of \p
+ *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cgs
+ The congruence system that will be recycled, adding its
+ congruences to the system of congruences of \p *this.
+
+ \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.
+ */
+ bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
+
+ //! Adds the equalities in \p cs to \p *this, reducing the result.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraint system that will be recycled, adding its
+ equalities to the system of congruences of \p *this.
+
+ \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.
+ */
+ bool add_recycled_congruences_and_minimize(Constraint_System& cs);
+
+ //! Adds constraint \p c to \p *this.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ //! Adds constraint \p c to \p *this, reducing the result.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ bool add_constraint_and_minimize(const Constraint& c);
+
+ //! Adds copies of the equality constraints in \p cs to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds copies of the equality constraints in \p cs to \p *this,
+ reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ //! Adds the equality constraints in \p cs to \p *this.
+ /*!
+ \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
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_recycled_constraints_and_minimize(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_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 that will be recycled, adding its generators
+ 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.
+
+ \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_generators(Grid_Generator_System& gs);
+
+ /*! \brief
+ Adds a copy of the generators in \p gs to the system of generators
+ of \p *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_generators_and_minimize(const Grid_Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators of \p
+ *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param gs
+ The generator system that will be recycled, adding its generators
+ 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.
+
+ \warning
+ The only assumption that can be made about \p gs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ bool add_recycled_generators_and_minimize(Grid_Generator_System& gs);
+
+ /*! \brief
+ Assigns to \p *this the intersection of \p *this and \p y. The
+ result is not guaranteed to be reduced.
+
+ \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 intersection of \p *this and \p y,
+ reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool intersection_assign_and_minimize(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the join of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void join_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the join of \p *this and \p y, reducing the
+ result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool join_assign_and_minimize(const Grid& y);
+
+ //! Same as join_assign(y).
+ void upper_bound_assign(const Grid& y);
+
+ /*! \brief
+ If the join 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 join_assign_if_exact(const Grid& y);
+
+ //! Same as join_assign_if_exact(y).
+ bool upper_bound_assign_if_exact(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Grid_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 grid_difference_assign(const Grid& y);
+
+ //! Same as grid_difference_assign(y).
+ void difference_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 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 one.
+
+ \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,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = Coefficient_one());
+
+ /*! \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 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 one.
+
+ \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,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = 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{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \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 one.
+
+ \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,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = Coefficient_one());
+
+ /*! \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 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 one.
+
+ \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,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = 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);
+
+ //! 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.
+
+ \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 \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 cs 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
+ 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
+ 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 Grid_Concatenate "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 to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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 Grid_Map_Space_Dimensions "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 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 Grid_Map_Space_Dimensions "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 Grid_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 to_be_folded into \p var.
+ /*!
+ \param to_be_folded
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param var
+ 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 var or with
+ one of the Variable objects contained in \p to_be_folded. Also
+ thrown if \p var is contained in \p to_be_folded.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ \p to_be_folded is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p var is not a member
+ of \p to_be_folded, then the space dimensions corresponding to
+ variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool Parma_Polyhedra_Library::operator==(const Grid& x,
+ const Grid& y);
+
+ friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Grid();
+
+ /*! \brief
+ Swaps \p *this with grid \p y. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ void swap(Grid& y);
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+
+ \return
+ <CODE>true</CODE> if successful, else <CODE>false</CODE>.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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;
+
+ //@} // 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,
+ LINE,
+ GEN_VIRTUAL,
+ 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 from a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid.
+ */
+ void construct(const Congruence_System& cgs);
+
+ //! Builds a grid from a system of generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the grid;
+ */
+ void construct(const Grid_Generator_System& gs);
+
+ //! \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 parameters 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.
+ /*!
+ \return
+ Always <CODE>true</CODE>.
+ */
+ bool 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,
+ char* method_call,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Grid_Generator* point = NULL) const;
+
+ //! \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;
+
+ //@} // 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,
+ const 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,
+ const 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.
+
+ \return
+ The new system divisor, or zero if \p divisor was zero.
+
+ \param sys
+ The generator system to be normalized.
+
+ \param divisor
+ An extra divisor to include in the calculation of the common
+ divisor of \p sys.
+
+ \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 Coefficient
+ normalize_divisors(Grid_Generator_System& sys,
+ Coefficient_traits::const_reference divisor
+ = Coefficient_one(),
+ Grid_Generator* first_point = NULL);
+
+ //! 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.
+ */
+ 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& gs,
+ 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 col of \p row is zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_line_with_line(Grid_Generator& row,
+ Grid_Generator& pivot,
+ dimension_type col);
+
+ //! 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 col of \p row is
+ zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_equality_with_equality(Congruence& row,
+ Congruence& pivot,
+ dimension_type col);
+
+ //! 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 col 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).
+ */
+ // Part of Grid for access to Matrix::rows.
+ template <typename R>
+ static void reduce_pc_with_pc(R& row,
+ R& pivot,
+ dimension_type col,
+ 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 col of \p row
+ is zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_parameter_with_line(Grid_Generator& row,
+ Grid_Generator& pivot,
+ dimension_type col,
+ Grid_Generator_System& sys);
+
+ //! 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 col of \p row is
+ zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_congruence_with_equality(Congruence& row,
+ Congruence& pivot,
+ dimension_type col,
+ Congruence_System& sys);
+
+ //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+ /*!
+ Only consider from index \p start to index \p end of the row at \p
+ pivot_index. Flag \p generators indicates whether \p sys is a
+ congruence or generator system.
+ */
+ template <typename M, typename R>
+ static void reduce_reduced(M& sys, dimension_type dim,
+ dimension_type pivot_index,
+ dimension_type start, dimension_type end,
+ Dimension_Kinds& dim_kinds,
+ bool generators = true);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Matrix::rows and cgs::operator[].
+ static void multiply_grid(const Coefficient& multiplier,
+ Congruence& cg, Congruence_System& dest,
+ const dimension_type num_rows,
+ const dimension_type num_dims);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Grid_Generator::operator[].
+ static void multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+ Grid_Generator_System& dest, const dimension_type num_rows,
+ const dimension_type num_dims);
+
+ /*! \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
+
+ //! \name Exception Throwers
+ //@{
+protected:
+ void throw_runtime_error(const char* method) const;
+ void throw_invalid_argument(const char* method, const char* reason) 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* gr_name,
+ const Grid& gr) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* e_name,
+ const Linear_Expression& e) 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* 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,
+ const Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ // Note: it has to be a static method, because it can be called inside
+ // constructors (before actually constructing the grid object).
+ static void throw_space_dimension_overflow(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;
+ //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid */
+void swap(Parma_Polyhedra_Library::Grid& x,
+ Parma_Polyhedra_Library::Grid& y);
+
+} // namespace std
+
+#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..8a256b2
--- /dev/null
+++ b/src/Grid.inlines.hh
@@ -0,0 +1,264 @@
+/* Grid class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_inlines_hh
+#define PPL_Grid_inlines_hh 1
+
+#include "Grid_Generator.defs.hh"
+#include "Grid_Generator_System.defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Grid::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(Congruence_System::max_space_dimension(),
+ Grid_Generator_System::max_space_dimension()
+ )
+ );
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+ status.set_c_up_to_date();
+}
+
+inline
+Grid::Grid(const Congruence_System& ccgs) {
+ if (ccgs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(ccgs)",
+ "the space dimension of ccgs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(ccgs);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs) {
+ if (cgs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& gs) {
+ if (gs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(gs);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& gs) {
+ if (gs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(gs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+ return space_dim;
+}
+
+inline void
+Grid::upper_bound_assign(const Grid& y) {
+ join_assign(y);
+}
+
+inline bool
+Grid::upper_bound_assign_if_exact(const Grid& y) {
+ return join_assign_if_exact(y);
+}
+
+inline void
+Grid::difference_assign(const Grid& y) {
+ grid_difference_assign(y);
+}
+
+inline void
+Grid::swap(Grid& y) {
+ std::swap(con_sys, y.con_sys);
+ std::swap(gen_sys, y.gen_sys);
+ std::swap(status, y.status);
+ std::swap(space_dim, y.space_dim);
+ std::swap(dim_kinds, y.dim_kinds);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+inline void
+std::swap(Parma_Polyhedra_Library::Grid& x,
+ Parma_Polyhedra_Library::Grid& y) {
+ x.swap(y);
+}
+
+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_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 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,
+ Grid_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,
+ Grid_Generator& point) const {
+ return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+/*! \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() {
+ return;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Grid_inlines_hh)
diff --git a/src/Grid.templates.hh b/src/Grid.templates.hh
new file mode 100644
index 0000000..deb8acf
--- /dev/null
+++ b/src/Grid.templates.hh
@@ -0,0 +1,569 @@
+/* Grid class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_templates_hh
+#define PPL_Grid_templates_hh 1
+
+#include "Interval.defs.hh"
+#include "Grid_Generator.defs.hh"
+#include "Grid_Generator_System.defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Bounding_Box dummy)
+ : con_sys(),
+ gen_sys(NECESSARILY_CLOSED) {
+ used(dummy);
+
+ if (box.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(box, from_bounding_box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension");
+
+ space_dim = box.space_dimension();
+
+ TEMP_INTEGER(l_n);
+ TEMP_INTEGER(l_d);
+
+ // Check that all bounds are closed. This must be done before the
+ // empty check below, in case an open bound makes the grid empty.
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // FIXME: Perhaps introduce box::is_bounded_and_closed.
+ if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+ if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+ }
+
+ if (box.is_empty()) {
+ // Empty grid.
+ set_empty();
+ assert(OK());
+ return;
+ }
+
+ if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ // Initialize the space dimension as indicated by the box.
+ con_sys.increase_space_dimension(space_dim);
+ // Add congruences according to `box'.
+ TEMP_INTEGER(u_n);
+ TEMP_INTEGER(u_d);
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // TODO: Consider producing the system(s) in minimized form.
+ // FIXME: Also create the generator system.
+ if (box.get_lower_bound(k, closed, l_n, l_d)) {
+ if (box.get_upper_bound(k, closed, u_n, u_d))
+ 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 * Variable(k) == l_n);
+ continue;
+ }
+ // The only valid bounded interval is a point interval.
+ throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+ }
+ else if (box.get_upper_bound(k, closed, u_n, u_d))
+ // An interval can only be a point or the universe.
+ throw_invalid_argument("Grid(box, from_covering_box)",
+ "box");
+ // A universe interval allows any value in dimension k.
+ }
+ set_congruences_up_to_date();
+ gen_sys.unset_pending_rows();
+ gen_sys.set_sorted(false);
+ }
+
+ assert(OK());
+}
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Covering_Box dummy)
+ : con_sys(),
+ gen_sys(NECESSARILY_CLOSED) {
+ used(dummy);
+
+ if (box.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(box, from_covering_box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension");
+
+ space_dim = box.space_dimension();
+
+ TEMP_INTEGER(l_n);
+ TEMP_INTEGER(l_d);
+
+ // Check that all bounds are closed. This must be done before the
+ // empty check below, in case an open bound makes the grid empty.
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // FIXME: Perhaps introduce box::is_bounded_and_closed.
+ if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_covering_box)", "box");
+ if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_covering_box)", "box");
+ }
+
+ if (box.is_empty()) {
+ // Empty grid.
+ set_empty();
+ assert(OK());
+ return;
+ }
+
+ if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ // Initialize the space dimension as indicated by the box.
+ con_sys.increase_space_dimension(space_dim);
+ // Add congruences according to `box'.
+ TEMP_INTEGER(u_n);
+ TEMP_INTEGER(u_d);
+ TEMP_INTEGER(d);
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // TODO: Consider producing the system(s) in minimized form.
+ // FIXME: Also create the generator system.
+ if (box.get_lower_bound(k, closed, l_n, l_d)) {
+ if (box.get_upper_bound(k, closed, u_n, u_d)) {
+ if (l_n * u_d == u_n * l_d)
+ // A point interval allows any point along the dimension
+ // k axis.
+ continue;
+ gcd_assign(d, l_d, u_d);
+ // `d' is the gcd of the divisors.
+ l_n *= (u_d / d);
+ d = l_d / d;
+ // `d' is now the smallest integer expression of the size
+ // of l_d relative to u_d. `d * u_d' is the lcm of the
+ // divisors.
+ con_sys.insert((d * u_d * Variable(k) %= l_n) / ((u_n * d) - l_n));
+ }
+ else
+ // An interval bounded only from below produces an
+ // equality.
+ con_sys.insert(l_d * Variable(k) == l_n);
+ }
+ else
+ if (box.get_upper_bound(k, closed, u_n, u_d))
+ // An interval bounded only from above produces an equality.
+ con_sys.insert(u_d * Variable(k) == u_n);
+ else {
+ // Any universe interval produces an empty grid.
+ set_empty();
+ assert(OK());
+ return;
+ }
+ }
+ set_congruences_up_to_date();
+ gen_sys.set_sorted(false);
+ gen_sys.unset_pending_rows();
+ }
+
+ assert(OK());
+}
+
+template <typename Box>
+void
+Grid::shrink_bounding_box(Box& box) const {
+ // Dimension-compatibility check.
+ if (space_dim > box.space_dimension())
+ throw_dimension_incompatible("shrink_bounding_box(box)", "box",
+ box.space_dimension());
+
+ TEMP_INTEGER(l_n);
+ TEMP_INTEGER(l_d);
+
+ // Check that all bounds are closed.
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // FIXME: Perhaps introduce box::is_bounded_and_closed.
+ if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("shrink_bounding_box(box)", "box");
+ if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("shrink_bounding_box(box)", "box");
+ }
+
+ if (marked_empty()) {
+ box.set_empty();
+ return;
+ }
+ if (space_dim == 0)
+ return;
+ if (!generators_are_up_to_date() && !update_generators()) {
+ // Updating found the grid empty.
+ box.set_empty();
+ return;
+ }
+
+ assert(gen_sys.num_generators() > 0);
+
+ dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+ dimension_type num_rows = gen_sys.num_generators();
+
+ // Create a vector to record which dimensions are bounded.
+ std::vector<bool> bounded_interval(num_dims, true);
+
+ const Grid_Generator *first_point = NULL;
+ // Clear the bound flag in `bounded_interval' for all dimensions in
+ // which a line or sequence of points extends away from a single
+ // value in the dimension.
+ for (dimension_type row = 0; row < num_rows; ++row) {
+ Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+ if (gen.is_point()) {
+ if (first_point == NULL) {
+ first_point = &gen_sys[row];
+ continue;
+ }
+ const Grid_Generator& point = *first_point;
+ // Convert the point `gen' to a parameter.
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ gen[dim] -= point[dim];
+ gen.divisor() = point.divisor();
+ }
+ for (dimension_type col = num_dims; col > 0; )
+ if (gen[col--] != 0)
+ bounded_interval[col] = false;
+ }
+
+ // Attempt to set both bounds of each boundable interval to the
+ // value of the associated coefficient in the point.
+ const Grid_Generator& point = *first_point;
+ TEMP_INTEGER(divisor);
+ TEMP_INTEGER(gcd);
+ TEMP_INTEGER(bound);
+ TEMP_INTEGER(reduced_divisor);
+ divisor = point.divisor();
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ if (bounded_interval[dim]) {
+ // Reduce the bound fraction first.
+ gcd_assign(gcd, point[dim+1], divisor);
+ exact_div_assign(bound, point[dim+1], gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ box.raise_lower_bound(dim, true, bound, reduced_divisor);
+ box.lower_upper_bound(dim, true, bound, reduced_divisor);
+ }
+}
+
+template <typename Box>
+void
+Grid::get_covering_box(Box& box) const {
+ // Dimension-compatibility check.
+ if (space_dim > box.space_dimension())
+ throw_dimension_incompatible("get_covering_box(box)", "box",
+ box.space_dimension());
+
+ Box new_box(box.space_dimension());
+
+ if (marked_empty()) {
+ box = new_box;
+ box.set_empty();
+ return;
+ }
+ if (space_dim == 0) {
+ return;
+ }
+ if (!generators_are_up_to_date() && !update_generators()) {
+ // Updating found the grid empty.
+ box = new_box;
+ box.set_empty();
+ return;
+ }
+
+ assert(gen_sys.num_generators() > 0);
+
+ dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+ dimension_type num_rows = gen_sys.num_generators();
+
+ TEMP_INTEGER(divisor);
+ TEMP_INTEGER(gcd);
+ TEMP_INTEGER(bound);
+ TEMP_INTEGER(reduced_divisor);
+
+ if (num_rows > 1) {
+ Row interval_sizes(num_dims, Row::Flags());
+ std::vector<bool> interval_emptiness(num_dims, false);
+
+ // Store in `interval_sizes', for each column (that is, for each
+ // dimension), the GCD of all the values in that column where the
+ // row is of type parameter.
+
+ for (dimension_type dim = num_dims; dim-- > 0; )
+ interval_sizes[dim] = 0;
+ const Grid_Generator *first_point = NULL;
+ for (dimension_type row = 0; row < num_rows; ++row) {
+ Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+ if (gen.is_line()) {
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ if (!interval_emptiness[dim] && gen[dim+1] != 0) {
+ // Empty interval, set both bounds for associated
+ // dimension to zero.
+ new_box.lower_upper_bound(dim, true, 0, 1);
+ new_box.raise_lower_bound(dim, true, 0, 1);
+ interval_emptiness[dim] = true;
+ }
+ continue;
+ }
+ if (gen.is_point()) {
+ if (first_point == NULL) {
+ first_point = &gen_sys[row];
+ continue;
+ }
+ const Grid_Generator& point = *first_point;
+ // Convert the point `gen' to a parameter.
+ for (dimension_type dim = 0; dim <= num_dims; ++dim)
+ gen[dim] -= point[dim];
+ gen.divisor() = point.divisor();
+ }
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ if (!interval_emptiness[dim])
+ gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]);
+ }
+
+ // For each dimension set the lower bound of the interval to the
+ // grid value closest to the origin, and the upper bound to the
+ // addition of the lower bound and the shortest distance in the
+ // given dimension between any two grid points.
+ const Grid_Generator& point = *first_point;
+ divisor = point.divisor();
+ TEMP_INTEGER(lower_bound);
+ for (dimension_type dim = 0; dim < num_dims; ++dim) {
+ if (interval_emptiness[dim])
+ continue;
+
+ lower_bound = point[dim+1];
+
+ // If the interval size is zero then all points have the same
+ // value in this dimension, so set only the lower bound.
+ if (interval_sizes[dim] != 0) {
+ // Make the lower bound as close as possible to the origin,
+ // leaving the sign the same.
+ lower_bound %= interval_sizes[dim];
+ // Check if the lowest value the other side of the origin is
+ // closer to the origin, prefering the lowest positive if they
+ // are equal.
+ if (lower_bound > 0) {
+ if (interval_sizes[dim] - lower_bound < lower_bound)
+ lower_bound -= interval_sizes[dim];
+ }
+ else if (lower_bound < 0
+ && interval_sizes[dim] + lower_bound < - lower_bound)
+ lower_bound += interval_sizes[dim];
+
+ // Reduce the bound fraction first.
+ bound = interval_sizes[dim] + lower_bound;
+ gcd_assign(gcd, bound, divisor);
+ exact_div_assign(bound, bound, gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ new_box.lower_upper_bound(dim, true, bound, reduced_divisor);
+ }
+
+ // Reduce the bound fraction first.
+ gcd_assign(gcd, lower_bound, divisor);
+ exact_div_assign(lower_bound, lower_bound, gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ new_box.raise_lower_bound(dim, true, lower_bound, reduced_divisor);
+ }
+ }
+ else {
+ const Grid_Generator& point = gen_sys[0];
+ divisor = point.divisor();
+ // The covering box of a single point has only lower bounds.
+ for (dimension_type dim = 0; dim < num_dims; ++dim) {
+ // Reduce the bound fraction first.
+ gcd_assign(gcd, point[dim+1], divisor);
+ exact_div_assign(bound, point[dim+1], gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ new_box.raise_lower_bound(dim, true, bound, reduced_divisor);
+ }
+ }
+
+ box = new_box;
+}
+
+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();
+
+ 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.
+
+ // We first compute suitable permutation cycles for the columns of
+ // the `con_sys' and `gen_sys' matrices. We will represent them
+ // with a linear array, using 0 as a terminator for each cycle
+ // (notice that the columns with index 0 of `con_sys' and
+ // `gen_sys' represent the inhomogeneous terms, and thus are
+ // unaffected by the permutation of dimensions).
+ // Cycles of length 1 will be omitted so that, in the worst case,
+ // we will have `space_dim' elements organized in `space_dim/2'
+ // cycles, which means we will have at most `space_dim/2'
+ // terminators.
+ std::vector<dimension_type> cycles;
+ cycles.reserve(space_dim + space_dim/2);
+
+ // 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;
+ dimension_type k;
+ (void) pfunc.maps(j, k);
+ if (k == j)
+ // Cycle of length 1: skip it.
+ goto skip;
+
+ cycles.push_back(j+1);
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+ // End of cycle: mark it.
+ cycles.push_back(0);
+ skip:
+ ;
+ }
+ }
+
+ // If `cycles' is empty then `pfunc' is the identity.
+ if (cycles.empty())
+ return;
+
+ // Permute all that is up-to-date.
+ if (congruences_are_up_to_date()) {
+ con_sys.permute_columns(cycles);
+ clear_congruences_minimized();
+ }
+
+ if (generators_are_up_to_date()) {
+ gen_sys.permute_columns(cycles);
+ clear_generators_minimized();
+ }
+
+ 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 = generators();
+
+ if (old_gensys.num_generators() == 0) {
+ // The grid is empty.
+ Grid new_grid(new_space_dimension, EMPTY);
+ std::swap(*this, new_grid);
+ 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;
+ assert(i != old_gensys_end);
+ Coefficient_traits::const_reference system_divisor = i->divisor();
+ for (Grid_Generator_System::const_iterator i = old_gensys.begin();
+ i != old_gensys_end;
+ ++i) {
+ const Grid_Generator& old_g = *i;
+ Linear_Expression e(0 * Variable(new_space_dimension-1));
+ bool all_zeroes = true;
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ if (old_g.coefficient(Variable(j)) != 0
+ && pfunc_maps[j] != not_a_dimension()) {
+ e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Grid_Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(grid_line(e));
+ break;
+ case Grid_Generator::PARAMETER:
+ if (!all_zeroes)
+ new_gensys.insert(parameter(e, system_divisor));
+ break;
+ case Grid_Generator::POINT:
+ new_gensys.insert(grid_point(e, old_g.divisor()));
+ break;
+ case Grid_Generator::CLOSURE_POINT:
+ default:
+ assert(0);
+ }
+ }
+
+ Grid new_grid(new_gensys);
+ std::swap(*this, new_grid);
+
+ assert(OK(true));
+}
+
+} // 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..a0ce3d6
--- /dev/null
+++ b/src/Grid.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Certificate.cc b/src/Grid_Certificate.cc
new file mode 100644
index 0000000..a03de1c
--- /dev/null
+++ b/src/Grid_Certificate.cc
@@ -0,0 +1,114 @@
+/* Grid_Certificate class implementation
+ (non-inline member functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid_Certificate.defs.hh"
+
+#include "Grid.defs.hh"
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Grid_Certificate::Grid_Certificate(const Grid& cgr)
+ : num_equalities(0), num_proper_congruences(0) {
+ Grid& gr = const_cast<Grid&>(cgr);
+ // As in Polyhedron assume that gr contains at least one point.
+ 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_generators();
+ }
+ else {
+ // Minimize gr congruence system. As in Polyhedron assume
+ // that gr contains at least one point.
+#ifndef NDEBUG
+ Grid::simplify(gr.con_sys, gr.dim_kinds);
+#else
+ bool contains_points = Grid::simplify(gr.con_sys, gr.dim_kinds);
+ used(contains_points); // Quiet compiler warning.
+ assert(contains_points);
+#endif
+ gr.set_congruences_minimized();
+
+ num_proper_congruences = gr.con_sys.num_proper_congruences();
+ num_equalities = gr.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::simplify(gr.gen_sys, gr.dim_kinds);
+ // If gen_sys contained rows before being reduced, it should
+ // contain at least a single point afterwards.
+ assert(gr.gen_sys.num_generators() > 0);
+ gr.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_generators();
+ }
+}
+
+int
+PPL::Grid_Certificate::compare(const Grid_Certificate& y) const {
+ 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 {
+ Grid_Certificate gc(gr);
+ return compare(gc);
+}
+
+bool
+PPL::Grid_Certificate::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // All tests passed.
+ return true;
+}
diff --git a/src/Grid_Certificate.defs.hh b/src/Grid_Certificate.defs.hh
new file mode 100644
index 0000000..7e9e941
--- /dev/null
+++ b/src/Grid_Certificate.defs.hh
@@ -0,0 +1,103 @@
+/* Grid_Certificate class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 <cassert>
+#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 // 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 // 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..419834d
--- /dev/null
+++ b/src/Grid_Certificate.inlines.hh
@@ -0,0 +1,60 @@
+/* Grid_Certificate class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.
+ 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..54c2e15
--- /dev/null
+++ b/src/Grid_Certificate.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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..8dcbc3d
--- /dev/null
+++ b/src/Grid_Generator.cc
@@ -0,0 +1,339 @@
+/* Grid_Generator class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid_Generator.defs.hh"
+#include <iostream>
+#include <sstream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+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) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::parameter(e, d):\n"
+ "d == 0.");
+ // Add 2 to space dimension to allow for parameter divisor column.
+ Linear_Expression ec(e,
+ e.space_dimension() + 2);
+ Generator g(ec, Generator::RAY, NECESSARILY_CLOSED);
+ g[0] = 0;
+ // Using this constructor saves reallocation when creating the
+ // coefficients.
+ Grid_Generator gg(g);
+ gg.divisor() = d;
+
+ // If the divisor is negative, negate it and all the coefficients of
+ // the parameter. This ensures that divisors are always positive.
+ if (d < 0)
+ for (dimension_type i = gg.size(); i-- > 0; )
+ neg_assign(gg[i]);
+
+ return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::grid_point(e, d):\n"
+ "d == 0.");
+ // Add 2 to space dimension to allow for parameter divisor column.
+ Linear_Expression ec(e,
+ e.space_dimension() + 2);
+ Generator g(ec, Generator::POINT, NECESSARILY_CLOSED);
+ g[0] = d;
+ // Using this constructor saves reallocation when creating the
+ // coefficients.
+ Grid_Generator gg(g);
+
+ // If the divisor is negative, negate it and all the coefficients of
+ // the parameter. This ensures that divisors are always positive.
+ if (d < 0)
+ for (dimension_type i = gg.size(); i-- > 0; )
+ neg_assign(gg[i]);
+
+ // Enforce normalization.
+ gg.normalize();
+ return gg;
+}
+
+PPL::Grid_Generator
+PPL::Grid_Generator::line(const Linear_Expression& e) {
+ // 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 2 to space dimension to allow for parameter divisor column.
+ Linear_Expression ec(e,
+ e.space_dimension() + 2);
+ Generator g(ec, Generator::LINE, NECESSARILY_CLOSED);
+ g[0] = 0;
+ // Using this constructor saves reallocation when creating the
+ // coefficients.
+ Grid_Generator gg(g);
+
+ // Enforce normalization.
+ gg.strong_normalize();
+ return gg;
+}
+
+void
+PPL::Grid_Generator::coefficient_swap(Grid_Generator& y) {
+ // Swap one coefficient at a time into *this. Doing this instead of
+ // swapping the entire row ensures that the row keeps the same
+ // capacity.
+ if (y.is_line())
+ set_is_line();
+ else
+ set_is_ray_or_point();
+ assert(size() > 0);
+ assert(y.size() > 0);
+ dimension_type sz = size() - 1;
+ dimension_type y_sz = y.size() - 1;
+ // Swap parameter divisors.
+ std::swap(operator[](sz), y[y_sz]);
+ for (dimension_type j = (sz > y_sz ? y_sz : sz); j-- > 0; )
+ std::swap(operator[](j), y[j]);
+}
+
+bool
+PPL::Grid_Generator::is_equivalent_to(const Grid_Generator& y) const {
+ const Grid_Generator& x = *this;
+ 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 tem(*this);
+ Grid_Generator tem_y(y);
+ dimension_type& last = x_space_dim;
+ ++last;
+ if (x_type == POINT || x_type == LINE) {
+ tem[last] = 0;
+ tem_y[last] = 0;
+ }
+ // Normalize the copies, including the divisor column.
+ tem.Row::normalize();
+ tem_y.Row::normalize();
+ // Check for equality.
+ while (last-- > 0)
+ if (tem[last] != tem_y[last])
+ return false;
+ return true;
+}
+
+bool
+PPL::Grid_Generator::is_equal_to(const Grid_Generator& y) const {
+ if (type() != y.type())
+ return false;
+ for (dimension_type col = (is_parameter() ? size() : size() - 1);
+ col-- > 0; )
+ if (Generator::operator[](col) != y.Generator::operator[](col))
+ return false;
+ return true;
+}
+
+bool
+PPL::Grid_Generator::all_homogeneous_terms_are_zero() const {
+ // Start at size() - 1 to avoid the extra grid generator column.
+ for (dimension_type i = size() - 1; --i > 0; )
+ if (operator[](i) != 0)
+ return false;
+ return true;
+}
+
+void
+PPL::Grid_Generator::scale_to_divisor(Coefficient_traits::const_reference d) {
+ if (is_parameter_or_point()) {
+ if (d == 0)
+ throw std::invalid_argument("PPL::Grid_Generator::scale_to_divisor(d):\n"
+ "d == 0.");
+
+ TEMP_INTEGER(factor);
+ factor = d / divisor();
+ divisor() = d;
+ assert(factor > 0);
+ if (factor > 1)
+ for (dimension_type col = size() - 2; col >= 1; --col)
+ Generator::operator[](col) *= factor;
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Grid_Generator& g) {
+ bool need_divisor = false;
+ bool extra_parentheses = false;
+ const int num_variables = g.space_dimension();
+ Grid_Generator::Type t = g.type();
+ switch (t) {
+ case Grid_Generator::LINE:
+ s << "l(";
+ break;
+ case Grid_Generator::PARAMETER:
+ s << "r(";
+ if (g[num_variables + 1] == 1)
+ break;
+ goto any_point;
+ case Grid_Generator::POINT:
+ s << "p(";
+ if (g[0] > 1) {
+ any_point:
+ need_divisor = true;
+ int num_non_zero_coefficients = 0;
+ for (int v = 0; v < num_variables; ++v)
+ if (g[v+1] != 0)
+ if (++num_non_zero_coefficients > 1) {
+ extra_parentheses = true;
+ s << "(";
+ break;
+ }
+ }
+ break;
+ }
+
+ bool first = true;
+ for (int v = 0; v < num_variables; ++v) {
+ Coefficient gv = g[v+1];
+ if (gv != 0) {
+ if (!first) {
+ if (gv > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(gv);
+ }
+ }
+ else
+ first = false;
+ if (gv == -1)
+ s << "-";
+ else if (gv != 1)
+ s << gv << "*";
+ s << PPL::Variable(v);
+ }
+ }
+ if (first)
+ // A generator in the origin.
+ s << 0;
+ if (extra_parentheses)
+ s << ")";
+ if (need_divisor)
+ s << "/" << g.divisor();
+ 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 Generator::POINT:
+ n = "POINT";
+ break;
+ }
+ s << n;
+ return s;
+}
+
+bool
+PPL::Grid_Generator::OK() const {
+ if (!is_necessarily_closed()) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator Generator should be necessarily closed."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // Topology consistency check.
+ if (size() < 1) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator has fewer coefficients than the minimum "
+ << "allowed:" << std::endl
+ << "size is " << size() << ", minimum is 1." << std::endl;
+#endif
+ return false;
+ }
+
+ switch (type()) {
+ case Grid_Generator::LINE:
+ if (operator[](0) != 0) {
+#ifndef NDEBUG
+ std::cerr << "Inhomogeneous terms of lines must be zero!"
+ << std::endl;
+#endif
+ return false;
+ }
+ break;
+
+ case Grid_Generator::PARAMETER:
+ if (operator[](0) != 0) {
+#ifndef NDEBUG
+ std::cerr << "Inhomogeneous terms of parameters must be zero!"
+ << std::endl;
+#endif
+ return false;
+ }
+ // Fall through.
+
+ case Grid_Generator::POINT:
+ if (divisor() <= 0) {
+#ifndef NDEBUG
+ std::cerr << "Points and parameters must have positive divisors!"
+ << std::endl;
+#endif
+ return false;
+ }
+ break;
+
+ }
+
+ // All tests passed.
+ return true;
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator);
diff --git a/src/Grid_Generator.defs.hh b/src/Grid_Generator.defs.hh
new file mode 100644
index 0000000..33dc032
--- /dev/null
+++ b/src/Grid_Generator.defs.hh
@@ -0,0 +1,493 @@
+/* Grid_Generator class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_defs_hh
+#define PPL_Grid_Generator_defs_hh 1
+
+#include "Grid_Generator.types.hh"
+#include "Grid_Generator_System.defs.hh"
+#include "Generator.defs.hh"
+#include "Grid.types.hh"
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+void swap(Parma_Polyhedra_Library::Grid_Generator& x,
+ Parma_Polyhedra_Library::Grid_Generator& y);
+
+} // namespace std
+
+//! A line, parameter or point.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid_Generator is one of the following:
+
+ - a 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 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 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>line</CODE>, <CODE>parameter</CODE> or <CODE>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 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 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 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 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 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 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 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 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 << "Point g1: " << g1 << endl;
+ Linear_Expression e;
+ for (int i = g1.space_dimension() - 1; i >= 0; i--)
+ 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 point." << endl;
+ \endcode
+ Therefore, for the point
+ \code
+ Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+ \endcode
+ we would obtain the following output:
+ \code
+ Point g1: p((2*A - B + 3*C)/2)
+ Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+ \endcode
+ When working with 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 : private Generator {
+public:
+ // FIXME: Add wrappers of any other public Generator methods.
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! The generator type.
+ enum Type {
+ /*! The generator is a line. */
+ LINE,
+ /*! The generator is a parameter. */
+ PARAMETER,
+ /*! The generator is a 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 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 line(const Linear_Expression& e);
+
+ //! Returns the parameter at \p 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());
+
+ //! 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 point(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one());
+
+ //! Assignment operator.
+ Grid_Generator& operator=(const Grid_Generator& g);
+
+ //! Assignment operator.
+ Grid_Generator& operator=(const Generator& g);
+
+ //! Returns the divisor of \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ Coefficient_traits::const_reference divisor() 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 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 exactly equal to \p y.
+ 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;
+
+ /*! \brief
+ Scales \p *this to be represented with a divisor of \p d (if
+ \*this is a parameter or point).
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ void scale_to_divisor(Coefficient_traits::const_reference d);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void swap(Grid_Generator& y);
+
+ /*! \brief
+ Swaps \p *this with \p y, leaving \p *this with the original
+ capacity.
+
+ All up to and including the last element of the smaller of \p
+ *this and \p y are swapped. The parameter divisor element of \p y
+ is swapped with the divisor element of \p *this.
+ */
+ void coefficient_swap(Grid_Generator& y);
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+private:
+ /*! \brief
+ Constructs from polyhedron generator \p g, stealing the underlying
+ data structures from \p g.
+
+ The last column in \p g becomes the parameter divisor column of
+ the new Grid_Generator.
+ */
+ explicit Grid_Generator(Generator g);
+
+ //! Returns the actual size of \p this.
+ dimension_type size() const;
+
+ //! Negates the elements from index \p start to index \p end.
+ void negate(dimension_type start, dimension_type end);
+
+ //! Returns the divisor of \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ Coefficient& divisor();
+
+ //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+ void set_is_parameter_or_point();
+
+ /*! \brief
+ Strong normalization: ensures that different Grid_Generator
+ objects represent different hyperplanes or hyperspaces.
+
+ Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+
+ This is simply a wrapper around the Generator::strong_normalize,
+ which means applying it to a parameter may change the parameter.
+ */
+ void strong_normalize();
+
+ //! 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;
+
+ /*! \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);
+ // FIXME: The following friend declaration is for operator[] and
+ // divisor() access in Grid::conversion and Grid::simplify.
+ friend class Grid;
+
+ friend class Grid_Generator_System;
+ friend class Grid_Generator_System::const_iterator;
+ friend class Congruence_System;
+ friend class Scalar_Products;
+ friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Shorthand for Grid_Generator
+ Grid_Generator::line(const Linear_Expression& e).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator grid_line(const Linear_Expression& e);
+
+/*! \brief
+ Shorthand for Grid_Generator
+ Grid_Generator::parameter(const Linear_Expression& e,
+ Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+ Shorthand for Grid_Generator
+ Grid_Generator::point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+//! 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..24de1d9
--- /dev/null
+++ b/src/Grid_Generator.inlines.hh
@@ -0,0 +1,218 @@
+/* Grid Generator class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_inlines_hh
+#define PPL_Grid_Generator_inlines_hh 1
+
+#include "Grid_Generator.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Generator::Grid_Generator(Generator g)
+ : Generator(Generator::point()) {
+ Generator::swap(g);
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+ return Generator::space_dimension() - 1;
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+ switch (Generator::type()) {
+ case Generator::POINT:
+ return POINT;
+ case Generator::RAY:
+ return PARAMETER;
+ case Generator::LINE:
+ return LINE;
+ case Generator::CLOSURE_POINT:
+ default:
+ assert(false);
+ return POINT;
+ }
+}
+
+inline bool
+Grid_Generator::is_line() const {
+ return Generator::is_line();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+ return is_ray();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+ return is_line_or_ray();
+}
+
+inline bool
+Grid_Generator::is_point() const {
+ return Generator::is_point();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+ Generator::set_is_line();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+ Generator::set_is_ray_or_point();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+ Generator::operator=(g);
+ return *this;
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Generator& g) {
+ Generator::operator=(g);
+ return *this;
+}
+
+inline void
+Grid_Generator::negate(dimension_type start, dimension_type end) {
+ while (start <= end)
+ neg_assign(operator[](start++));
+}
+
+inline Coefficient&
+Grid_Generator::divisor() {
+ if (is_line())
+ throw_invalid_argument("divisor()", "*this is a line");
+ if (is_line_or_parameter())
+ return Generator::operator[](size() - 1);
+ return Generator::operator[](0);
+}
+
+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 Generator::operator[](size() - 1);
+ return Generator::operator[](0);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+ return Generator::total_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+ return Generator::external_memory_in_bytes();
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+ Generator::strong_normalize();
+}
+
+inline dimension_type
+Grid_Generator::size() const {
+ return Generator::size();
+}
+
+inline void
+Grid_Generator::swap(Grid_Generator& y) {
+ Generator::swap(y);
+}
+
+inline void
+Grid_Generator::ascii_dump(std::ostream& s) const {
+ Generator::ascii_dump(s);
+}
+
+inline bool
+Grid_Generator::ascii_load(std::istream& s) {
+ return Generator::ascii_load(s);
+}
+
+inline Coefficient&
+Grid_Generator::operator[](dimension_type k) {
+ return Generator::operator[](k);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::operator[](dimension_type k) const {
+ return Generator::operator[](k);
+}
+
+/*! \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) {
+ return Grid_Generator::line(e);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ return Grid_Generator::parameter(e, d);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ return Grid_Generator::point(e, d);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator& x,
+ Parma_Polyhedra_Library::Grid_Generator& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#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..62d396c
--- /dev/null
+++ b/src/Grid_Generator.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Generator_System.cc b/src/Grid_Generator_System.cc
new file mode 100644
index 0000000..0db91da
--- /dev/null
+++ b/src/Grid_Generator_System.cc
@@ -0,0 +1,429 @@
+/* Grid_Generator_System class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid_Generator_System.defs.hh"
+#include "Grid_Generator_System.inlines.hh"
+#include "Scalar_Products.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid_Generator_System::recycling_insert(Grid_Generator_System& gs) {
+ const dimension_type old_num_rows = num_rows();
+ const dimension_type gs_num_rows = gs.num_rows();
+ const dimension_type old_num_cols = num_columns();
+ const dimension_type gs_num_cols = gs.num_columns();
+ if (old_num_cols >= gs_num_cols)
+ add_zero_rows(gs_num_rows,
+ Linear_Row::Flags(NECESSARILY_CLOSED,
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ else {
+ add_zero_rows_and_columns(gs_num_rows,
+ gs_num_cols - old_num_cols,
+ Linear_Row::Flags(NECESSARILY_CLOSED,
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ // Swap the parameter divisor column into the new last column.
+ swap_columns(old_num_cols - 1, num_columns() - 1);
+ }
+ set_index_first_pending_row(old_num_rows + gs_num_rows);
+ // Swap one coefficient at a time into the newly added rows, instead
+ // of swapping each entire row. This ensures that the added rows
+ // have the same capacities as the existing rows.
+ for (dimension_type i = gs_num_rows; i-- > 0; )
+ operator[](old_num_rows + i).coefficient_swap(gs[i]);
+}
+
+void
+PPL::Grid_Generator_System::recycling_insert(Grid_Generator& g) {
+ dimension_type old_num_rows = num_rows();
+ const dimension_type old_num_cols = num_columns();
+ const dimension_type g_num_cols = g.size();
+ if (old_num_cols >= g_num_cols)
+ add_zero_rows(1,
+ Linear_Row::Flags(NECESSARILY_CLOSED,
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ else {
+ add_zero_rows_and_columns(1,
+ g_num_cols - old_num_cols,
+ Linear_Row::Flags(NECESSARILY_CLOSED,
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ // Swap the parameter divisor column into the new last column.
+ swap_columns(old_num_cols - 1, num_columns() - 1);
+ }
+ set_index_first_pending_row(old_num_rows + 1);
+ // Swap one coefficient at a time into the newly added rows, instead
+ // of swapping each entire row. This ensures that the added rows
+ // have the same capacities as the existing rows.
+ operator[](old_num_rows).coefficient_swap(g);
+}
+
+void
+PPL::Grid_Generator_System::insert(const Grid_Generator& g) {
+ dimension_type g_space_dim = g.space_dimension();
+
+ if (g.is_parameter())
+ if (g.all_homogeneous_terms_are_zero()) {
+ dimension_type initial_space_dim = space_dimension();
+ if (initial_space_dim < g_space_dim) {
+ // Adjust the space dimension.
+ add_zero_columns(g_space_dim - initial_space_dim);
+ // Swap the parameter divisor column into the new last column.
+ swap_columns(g_space_dim + 1, initial_space_dim + 1);
+ assert(OK());
+ }
+ return;
+ }
+
+ {
+ // This block is a substitute for Generator_System::insert, in
+ // which the single call to Linear_System::insert has been
+ // inlined.
+
+ // We are sure that the matrix has no pending rows
+ // and that the new row is not a pending generator.
+ assert(num_pending_rows() == 0);
+
+ // TODO: Consider whether, if possible, it would be better to wrap
+ // an NNC Generator, storing the generator divisor in the
+ // epsilon column.
+
+ // This is a modified copy of Linear_System::insert. It is here
+ // to force Grid_Generator::OK to be used (to work around the
+ // normalization assertions in Linear_System::OK) and so that the
+ // parameter divisor column can be moved during the insert.
+
+ // The added row must be strongly normalized and have the same
+ // topology as the system.
+ assert(topology() == g.topology());
+ // This method is only used when the system has no pending rows.
+ assert(num_pending_rows() == 0);
+
+ const dimension_type old_num_rows = num_rows();
+ const dimension_type old_num_columns = num_columns();
+ const dimension_type g_size = g.size();
+
+ // Resize the system, if necessary.
+ assert(is_necessarily_closed());
+ if (g_size > old_num_columns) {
+ add_zero_columns(g_size - old_num_columns);
+ if (old_num_rows > 0)
+ // Swap the existing parameter divisor column into the new
+ // last column.
+ swap_columns(old_num_columns - 1, g_size - 1);
+ Matrix::add_row(g);
+ }
+ else if (g_size < old_num_columns)
+ if (old_num_rows == 0)
+ Matrix::add_row(Linear_Row(g, old_num_columns, row_capacity));
+ else {
+ // Create a resized copy of the row (and move the parameter
+ // divisor coefficient to its last position).
+ Linear_Row tmp_row(g, old_num_columns, row_capacity);
+ std::swap(tmp_row[g_size - 1], tmp_row[old_num_columns - 1]);
+ Matrix::add_row(tmp_row);
+ }
+ else
+ // Here r_size == old_num_columns.
+ Matrix::add_row(g);
+
+ } // Generator_System::insert(g) substitute.
+
+ set_index_first_pending_row(num_rows());
+ set_sorted(false);
+
+ assert(OK());
+}
+
+void
+PPL::Grid_Generator_System
+::affine_image(dimension_type 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;
+ // `v' is the index of a column corresponding to a "user" variable
+ // (i.e., it cannot be the inhomogeneous term).
+ assert(v > 0 && v <= x.space_dimension());
+ assert(expr.space_dimension() <= x.space_dimension());
+ assert(denominator > 0);
+
+ const dimension_type n_columns = x.num_columns();
+ const dimension_type n_rows = x.num_rows();
+
+ // Compute the numerator of the affine transformation and assign it
+ // to the column of `*this' indexed by `v'.
+ TEMP_INTEGER(numerator);
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Grid_Generator& row = x[i];
+ Scalar_Products::assign(numerator, expr, row);
+ std::swap(numerator, row[v]);
+ }
+
+ 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'.
+ for (dimension_type i = n_rows; i-- > 0; ) {
+ Grid_Generator& row = x[i];
+ for (dimension_type j = n_columns; j-- > 0; )
+ if (j != v)
+ row[j] *= denominator;
+ }
+
+ // 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 > expr.space_dimension() || expr[v] == 0);
+ if (not_invertible)
+ x.remove_invalid_lines_and_rays();
+}
+
+PPL_OUTPUT_DEFINITIONS(Grid_Generator_System);
+
+bool
+PPL::Grid_Generator_System::ascii_load(std::istream& s) {
+ // This is a copy of Generator_System::ascii_load, to force
+ // Grid_Generator_System::OK to be called, in order to work around
+ // the assertions in Linear_System::OK.
+
+ // FIXME: Gridify this. Add an ascii_dump to match.
+
+ std::string str;
+ if (!(s >> str) || str != "topology")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "NECESSARILY_CLOSED")
+ set_necessarily_closed();
+ else {
+ if (str != "NOT_NECESSARILY_CLOSED")
+ return false;
+ set_not_necessarily_closed();
+ }
+
+ dimension_type nrows;
+ dimension_type ncols;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str))
+ return false;
+ if (!(s >> ncols))
+ return false;
+ resize_no_copy(nrows, ncols);
+
+ if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+ return false;
+ set_sorted(str == "(sorted)");
+ dimension_type index;
+ if (!(s >> str) || str != "index_first_pending")
+ return false;
+ if (!(s >> index))
+ return false;
+ set_index_first_pending_row(index);
+
+ Grid_Generator_System& x = *this;
+ for (dimension_type i = 0; i < x.num_rows(); ++i) {
+ for (dimension_type j = 0; j < x.num_columns(); ++j)
+ if (!(s >> const_cast<Coefficient&>(x[i][j])))
+ return false;
+
+ if (!(s >> str))
+ return false;
+ if (str == "L")
+ x[i].set_is_line();
+ else
+ x[i].set_is_ray_or_point();
+
+ // Checking for equality of actual and declared types.
+ switch (x[i].type()) {
+ case Grid_Generator::LINE:
+ if (str == "L")
+ continue;
+ break;
+ case Grid_Generator::PARAMETER:
+ if (str == "R")
+ continue;
+ break;
+ case Grid_Generator::POINT:
+ if (str == "P")
+ continue;
+ break;
+ }
+ // Reaching this point means that the input was illegal.
+ return false;
+ }
+
+ // Checking for well-formedness.
+
+ assert(OK());
+ return true;
+}
+
+bool
+PPL::Grid_Generator_System::OK() const {
+ if (topology() == NOT_NECESSARILY_CLOSED) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator_System is NOT_NECESSARILY_CLOSED"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ if (is_sorted()) {
+#ifndef NDEBUG
+ std::cerr << "Grid_Generator_System is marked as sorted."
+ << std::endl;
+#endif
+ return false;
+ }
+
+ // A Generator_System and hence a Grid_Generator_System must be a
+ // valid Linear_System; do not check for strong normalization, since
+ // this will be done when checking each individual generator.
+ if (!Linear_System::OK(false))
+ return false;
+
+ // Checking each generator in the system.
+ const Grid_Generator_System& x = *this;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ if (!x[i].OK())
+ return false;
+
+ // All checks passed.
+ return true;
+}
+
+/*! \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++;
+ if (i == gs_end)
+ return s;
+ s << ", ";
+ }
+}
+
+void
+PPL::Grid_Generator_System
+::add_universe_rows_and_columns(dimension_type dims) {
+ assert(num_columns() > 0);
+ dimension_type col = num_columns() - 1;
+ add_zero_rows_and_columns(dims, dims,
+ Linear_Row::Flags(NECESSARILY_CLOSED,
+ Linear_Row::LINE_OR_EQUALITY));
+ unset_pending_rows();
+ // Swap the parameter divisor column into the new last column.
+ swap_columns(col, col + dims);
+ // Set the diagonal element of each added rows.
+ dimension_type rows = num_rows();
+ for (dimension_type row = rows - dims; row < rows; ++row, ++col)
+ const_cast<Coefficient&>(operator[](row)[col]) = 1;
+}
+
+void
+PPL::Grid_Generator_System
+::remove_space_dimensions(const Variables_Set& to_be_removed) {
+ // 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 (to_be_removed.empty())
+ return;
+
+ // Dimension-compatibility check: the variable having maximum space
+ // dimension is the one occurring last in the set.
+ const dimension_type
+ min_space_dim = to_be_removed.rbegin()->space_dimension();
+ if (space_dimension() < min_space_dim) {
+ std::ostringstream s;
+ s << "PPL::Grid_Generator_System::remove_space_dimensions(vs):\n"
+ << "this->space_dimension() == " << space_dimension()
+ << ", required space dimension == " << min_space_dim << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // For each variable to be removed, replace the corresponding column
+ // by shifting left the columns to the right that will be kept.
+ Variables_Set::const_iterator tbr = to_be_removed.begin();
+ Variables_Set::const_iterator tbr_end = to_be_removed.end();
+ dimension_type dst_col = tbr->space_dimension();
+ dimension_type src_col = dst_col + 1;
+ for (++tbr; tbr != tbr_end; ++tbr) {
+ dimension_type tbr_col = tbr->space_dimension();
+ // Move all columns in between to the left.
+ while (src_col < tbr_col)
+ // FIXME: consider whether Linear_System must have a swap_columns()
+ // method. If the answer is "no", remove this Matrix:: qualification.
+ Matrix::swap_columns(dst_col++, src_col++);
+ ++src_col;
+ }
+ // Move any remaining columns.
+ const dimension_type num_cols = num_columns();
+ while (src_col < num_cols)
+ // FIXME: consider whether Linear_System must have a swap_columns()
+ // method. If the answer is "no", remove this Matrix:: qualification.
+ Matrix::swap_columns(dst_col++, src_col++);
+
+ // The number of remaining columns is `dst_col'.
+ Matrix::remove_trailing_columns(num_cols - dst_col);
+
+
+
+ remove_invalid_lines_and_rays();
+}
+
+void
+PPL::Grid_Generator_System
+::remove_higher_space_dimensions(dimension_type new_dimension) {
+ dimension_type space_dim = space_dimension();
+ // Dimension-compatibility check.
+ if (new_dimension > space_dim) {
+ std::ostringstream s;
+ s << "PPL::Grid_Generator_System::remove_higher_space_dimensions(n):\n"
+ << "this->space_dimension() == " << space_dim
+ << ", required space dimension == " << new_dimension << ".";
+ throw std::invalid_argument(s.str());
+ }
+
+ // The removal of no dimensions from any system is a no-op. Note
+ // that this case also captures the only legal removal of dimensions
+ // from a system in a 0-dim space.
+ if (new_dimension == space_dim)
+ return;
+
+ // Swap the parameter divisor column into the column that will
+ // become the last column.
+ swap_columns(new_dimension + 1, space_dim + 1);
+ Matrix::remove_trailing_columns(space_dim - new_dimension);
+ remove_invalid_lines_and_rays();
+ assert(OK());
+}
diff --git a/src/Grid_Generator_System.defs.hh b/src/Grid_Generator_System.defs.hh
new file mode 100644
index 0000000..7496fd6
--- /dev/null
+++ b/src/Grid_Generator_System.defs.hh
@@ -0,0 +1,497 @@
+/* Grid_Generator_System class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_defs_hh
+#define PPL_Grid_Generator_System_defs_hh 1
+
+#include "Grid_Generator_System.types.hh"
+#include "Generator_System.defs.hh"
+#include "Grid_Generator.types.hh"
+#include "Variable.defs.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
+
+//! 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
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+void swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+ Parma_Polyhedra_Library::Grid_Generator_System& y);
+
+} // namespace std
+
+
+//! 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
+ : private Generator_System {
+public:
+ // FIXME: Add wrappers of any other public Generator_System methods.
+
+ //! Default constructor: builds an empty system of generators.
+ Grid_Generator_System();
+
+ //! Ordinary copy-constructor.
+ Grid_Generator_System(const Grid_Generator_System& gs);
+
+ //! Builds an empty system of generators of dimension \p dim.
+ explicit Grid_Generator_System(dimension_type dim);
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Grid_Generator_System(const Grid_Generator& g);
+
+ //! 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 recycling_insert(Grid_Generator& g);
+
+ /*! \brief
+ Inserts into \p *this the generators in \p gs, increasing the
+ number of space dimensions if needed.
+ */
+ void recycling_insert(Grid_Generator_System& gs);
+
+ //! 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& gs = gr.generators();
+ for (Grid_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 = gr.generators();
+ copy(gs.begin(), gs.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&>,
+ private Generator_System::const_iterator {
+ 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;
+
+ //! Copy-constructor from Generator_System::const_iterator.
+ const_iterator(const Generator_System::const_iterator& y);
+ };
+
+ /*! \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;
+
+ //! Swaps \p *this with \p y.
+ void swap(Grid_Generator_System& y);
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Assigns to a given variable an affine expression.
+ /*!
+ \param v
+ Index of the column 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 each element of \p v -th
+ 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(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Returns the number of generators in the system.
+ dimension_type num_generators() 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;
+
+ //! Returns the \p k- th generator of the system.
+ Grid_Generator& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k- th generator of the system.
+ const Grid_Generator& operator[](dimension_type k) const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) 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.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p *this is a valid
+ Linear_System and each row in the system is a valid Grid_Generator.
+ */
+ bool OK() const;
+
+ /*! \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({A \atop 0}{0 \atop B}\bigr)\f$
+ where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the
+ form \f$\bigl({1 \atop 0}{0 \atop 1}\bigr)\f$. The matrix is
+ expanded avoiding reallocation whenever possible.
+ */
+ void add_universe_rows_and_columns(dimension_type dims);
+
+ //! Removes all the specified dimensions from the generator system.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the highest space dimension of the variables in \p
+ to_be_removed is higher than the space dimension of \p *this.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \brief
+ Removes the higher dimensions of the system so that the resulting
+ system will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if the \p new_dimension is higher than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+private:
+ friend bool operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y);
+ // FIXME: The following friend declaration grants Grid::conversion
+ // access to Matrix (for the Grid::reduce_reduced call) and
+ // Matrix::resize_no_copy, and the following methods.
+ friend class Grid;
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! 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);
+
+ //! Resizes the system without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized system;
+
+ \param new_n_columns
+ The number of columns of the resized system.
+
+ The system is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original system is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows,
+ dimension_type new_n_columns);
+
+ /*! \brief
+ Returns the number of columns of the matrix (i.e., the size of the
+ rows).
+ */
+ dimension_type num_columns() const;
+
+ /*! \brief
+ Erases from the matrix all the rows but those having an index less
+ than \p first_to_erase.
+ */
+ void erase_to_end(dimension_type first_to_erase);
+
+ //! Permutes the columns of the matrix.
+ /*
+ \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 non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the matrix has 6
+ 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.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+};
+
+// 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..729ed84
--- /dev/null
+++ b/src/Grid_Generator_System.inlines.hh
@@ -0,0 +1,268 @@
+/* Grid_Generator_System class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Generator_System_inlines_hh
+#define PPL_Grid_Generator_System_inlines_hh 1
+
+#include "Grid_Generator.defs.hh"
+#include "Generator_System.inlines.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Generator_System::Grid_Generator_System()
+ : Generator_System(NECESSARILY_CLOSED) {
+ adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1);
+ set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+ : Generator_System(gs) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim)
+ : Generator_System(NECESSARILY_CLOSED) {
+ adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1);
+ set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g)
+ : Generator_System(g) {
+ set_sorted(false);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+ // Grid generators use an extra column for the parameter divisor.
+ return Generator_System::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+ assert(Generator_System::space_dimension() > 0);
+ // Grid generators use an extra column for the parameter divisor.
+ return Generator_System::space_dimension() - 1;
+}
+
+inline void
+Grid_Generator_System::clear() {
+ Generator_System::clear();
+ // For grid generators, two extra columns are needed.
+ add_zero_columns(2);
+ set_sorted(false);
+ unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::swap(Grid_Generator_System& y) {
+ Generator_System::swap(y);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+ return Generator_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+ return Generator_System::total_memory_in_bytes();
+}
+
+inline dimension_type
+Grid_Generator_System::num_generators() const {
+ return Generator_System::num_rows();
+}
+
+inline dimension_type
+Grid_Generator_System::num_parameters() const {
+ return Generator_System::num_rays();
+}
+
+inline dimension_type
+Grid_Generator_System::num_lines() const {
+ return Generator_System::num_lines();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+ : Generator_System::const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+ : Generator_System::const_iterator(y) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+ return static_cast<Grid_Generator_System::const_iterator&>
+ (Generator_System::const_iterator::operator=(y));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+ return static_cast<const Grid_Generator&>
+ (Generator_System::const_iterator::operator*());
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+ return static_cast<const Grid_Generator*>
+ (Generator_System::const_iterator::operator->());
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+ return static_cast<Grid_Generator_System::const_iterator&>
+ (Generator_System::const_iterator::operator++());
+}
+
+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 Generator_System::const_iterator::operator==(y);
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+ return Generator_System::const_iterator::operator!=(y);
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+ return static_cast<Grid_Generator_System::const_iterator>
+ (Generator_System::begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+ return static_cast<Grid_Generator_System::const_iterator>
+ (Generator_System::end());
+}
+
+inline
+Grid_Generator_System
+::const_iterator::const_iterator(const Generator_System::const_iterator& y)
+ : Generator_System::const_iterator::const_iterator(y) {
+}
+
+inline bool
+Grid_Generator_System::has_points() const {
+ return Generator_System::has_points();
+}
+
+inline Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) {
+ return static_cast<Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+ return static_cast<const Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline void
+Grid_Generator_System::ascii_dump(std::ostream& s) const {
+ return Generator_System::ascii_dump(s);
+}
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+ Generator_System::set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+ Generator_System::unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+ Generator_System::set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System::resize_no_copy(const dimension_type new_n_rows,
+ const dimension_type new_n_columns) {
+ Generator_System::resize_no_copy(new_n_rows, new_n_columns);
+}
+
+inline dimension_type
+Grid_Generator_System::num_columns() const {
+ return Generator_System::num_columns();
+}
+
+inline void
+Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
+ return Generator_System::erase_to_end(first_to_erase);
+}
+
+inline void
+Grid_Generator_System
+::permute_columns(const std::vector<dimension_type>& cycles) {
+ return Generator_System::permute_columns(cycles);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System y) const {
+ return operator==(static_cast<const Generator_System&>(*this),
+ static_cast<const Generator_System&>(y));
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y) {
+ return x.is_equal_to(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+ Parma_Polyhedra_Library::Grid_Generator_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#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..b0ced3b
--- /dev/null
+++ b/src/Grid_Generator_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Status.cc b/src/Grid_Status.cc
new file mode 100644
index 0000000..de09253
--- /dev/null
+++ b/src/Grid_Status.cc
@@ -0,0 +1,245 @@
+/* Grid::Status class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include <iostream>
+#include <string>
+#include <cassert>
+
+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) {
+ 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 for well-formedness.
+ 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..c87ae6a
--- /dev/null
+++ b/src/Grid_Status.idefs.hh
@@ -0,0 +1,167 @@
+/* Grid::Status class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Grid_Status_defs_hh
+#define PPL_Grid_Status_defs_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 \ref
+ ascii_dump) 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_defs_hh)
diff --git a/src/Grid_Status.inlines.hh b/src/Grid_Status.inlines.hh
new file mode 100644
index 0000000..9ee87f9
--- /dev/null
+++ b/src/Grid_Status.inlines.hh
@@ -0,0 +1,216 @@
+/* Grid::Status class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+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..2d9d2c4
--- /dev/null
+++ b/src/Grid_chdims.cc
@@ -0,0 +1,444 @@
+/* Grid class implementation
+ (non-inline operators that may change the dimension of the vector space).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include <cassert>
+
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// Used for add_space_dimensions_and_embed.
+inline void
+PPL::Grid::add_space_dimensions(Congruence_System& cgs,
+ Grid_Generator_System& gs,
+ const dimension_type dims) {
+ assert(cgs.num_columns() - 1 == gs.space_dimension() + 1);
+ assert(dims > 0);
+
+ dimension_type tem = cgs.num_columns() - 1;
+ cgs.add_zero_columns(dims);
+ // Move the moduli.
+ cgs.swap_columns(tem, tem + dims);
+
+ if (congruences_are_minimized() || generators_are_minimized())
+ dim_kinds.resize(tem + dims, CON_VIRTUAL /* a.k.a. LINE */);
+
+ gs.add_universe_rows_and_columns(dims);
+}
+
+// Used for add_space_dimensions_and_project.
+inline void
+PPL::Grid::add_space_dimensions(Grid_Generator_System& gs,
+ Congruence_System& cgs,
+ const dimension_type dims) {
+ assert(cgs.num_columns() - 1 == gs.space_dimension() + 1);
+ assert(dims > 0);
+
+ cgs.add_unit_rows_and_columns(dims);
+
+ // Add `dims' zero columns onto gs.
+ gs.insert(parameter(0*Variable(space_dim + dims - 1)));
+
+ normalize_divisors(gs);
+
+ dim_kinds.resize(cgs.num_columns() - 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.
+ if (m > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow("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.
+ assert(status.test_zero_dim_univ());
+ // Swap *this with a newly created `m'-dimensional universe grid.
+ Grid gr(m, UNIVERSE);
+ 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.add_zero_columns(m);
+ dimension_type size = con_sys.num_columns() - 1;
+ // Move the moduli.
+ con_sys.swap_columns(size - m, size);
+ if (congruences_are_minimized())
+ dim_kinds.resize(size, CON_VIRTUAL);
+ }
+ else {
+ // Only generators are up-to-date, so modify only them.
+ 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.
+ 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.
+ if (m > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow("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) {
+ assert(status.test_zero_dim_univ());
+ // Swap *this with a newly created `n'-dimensional universe grid.
+ Grid gr(m, UNIVERSE);
+ 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_columns(m);
+ if (congruences_are_minimized())
+ dim_kinds.resize(con_sys.num_columns() - 1, EQUALITY);
+ }
+ else {
+ // Only generators are up-to-date so modify only them.
+ assert(generators_are_up_to_date());
+
+ // Add m zero columns onto gs.
+ gen_sys.insert(parameter(0*Variable(space_dim + m - 1)));
+
+ 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.
+ 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.
+ if (y.space_dim > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow("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;
+ }
+
+ 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.
+ assert(OK());
+}
+
+void
+PPL::Grid::remove_space_dimensions(const Variables_Set& to_be_removed) {
+ // 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 (to_be_removed.empty()) {
+ assert(OK());
+ return;
+ }
+
+ // Dimension-compatibility check: the variable having maximum space
+ // dimension is the one occurring last in the set.
+ const dimension_type
+ min_space_dim = to_be_removed.rbegin()->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 - to_be_removed.size();
+
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Update the space dimension.
+ space_dim = new_space_dim;
+ set_empty();
+ 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;
+ }
+
+ // FIXME: Can this operate on the congruence system if only the
+ // congruence system is up to date?
+
+ gen_sys.remove_space_dimensions(to_be_removed);
+
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+
+ // Update the space dimension.
+ space_dim = new_space_dim;
+
+ assert(OK(true));
+}
+
+void
+PPL::Grid::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 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) {
+ assert(OK());
+ return;
+ }
+
+ if (marked_empty()
+ || (!generators_are_up_to_date() && !update_generators())) {
+ // Removing dimensions from the empty grid just updates the space
+ // dimension.
+ space_dim = new_dimension;
+ set_empty();
+ 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;
+ }
+
+ gen_sys.remove_higher_space_dimensions(new_dimension);
+
+#if 0
+ // FIXME: Perhaps add something like remove_rows_and_columns(dims)
+ // to Grid_Generator_System for this.
+ if (generators_are_minimized()) {
+ gen_sys.erase_to_end(new_dimension + 1);
+ dim_kinds.erase(dim_kinds.begin() + new_dimension + 1, dim_kinds.end());
+ }
+#else
+ clear_generators_minimized();
+#endif
+
+ clear_congruences_up_to_date();
+
+ // Update the space dimension.
+ space_dim = new_dimension;
+
+ assert(OK(true));
+}
+
+void
+PPL::Grid::expand_space_dimension(Variable var, dimension_type m) {
+ // FIXME: this implementation is _really_ an executable specification.
+
+ // `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.
+ if (m > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow("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.
+ dimension_type old_dim = space_dim;
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ const dimension_type src_d = var.id();
+ 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;
+
+ // Only consider congruences that constrain `var'.
+ if (cg.coefficient(var) == 0)
+ continue;
+
+ // Each relevant congruence results in `m' new congruences.
+ for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+ Linear_Expression e;
+ for (dimension_type j = old_dim; j-- > 0; )
+ e +=
+ cg.coefficient(Variable(j))
+ * (j == src_d ? Variable(dst_d) : Variable(j));
+ new_congruences.insert_verbatim((e + cg.inhomogeneous_term() %= 0)
+ / cg.modulus());
+ }
+ }
+ add_congruences(new_congruences);
+ assert(OK());
+}
+
+void
+PPL::Grid::fold_space_dimensions(const Variables_Set& to_be_folded,
+ Variable var) {
+ // FIXME: this implementation is _really_ an executable specification.
+
+ // `var' should be one of the dimensions of the grid.
+ if (var.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
+
+ // Folding only has effect if dimensions are given.
+ if (to_be_folded.empty())
+ return;
+
+ // All variables in `to_be_folded' must be dimensions of the grid.
+ if (to_be_folded.rbegin()->space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
+ "*tbf.rbegin()",
+ *to_be_folded.rbegin());
+
+ // Moreover, `var' must not occur in `to_be_folded'.
+ if (to_be_folded.find(var) != to_be_folded.end())
+ throw_invalid_argument("fold_space_dimensions(tbf, v)",
+ "v should not occur in tbf");
+
+ for (Variables_Set::const_iterator i = to_be_folded.begin(),
+ tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+ Grid copy = *this;
+ copy.affine_image(var, Linear_Expression(*i));
+ join_assign(copy);
+ }
+ remove_space_dimensions(to_be_folded);
+ assert(OK());
+}
diff --git a/src/Grid_conversion.cc b/src/Grid_conversion.cc
new file mode 100644
index 0000000..6137362
--- /dev/null
+++ b/src/Grid_conversion.cc
@@ -0,0 +1,559 @@
+/* Grid class implementation: conversion().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+
+#define TRACE(x)
+//#define TRACE(x) x
+
+TRACE(using std::endl);
+TRACE(using std::cerr);
+
+// 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) {
+ dimension_type num_cols = sys.num_columns() - 1;
+ dimension_type row = sys.num_rows();
+
+ // Check for easy square failure case.
+ if (row > num_cols)
+ return false;
+
+ // Check triangularity.
+ for (dimension_type dim = 0; dim < num_cols; ++dim) {
+ if (dim_kinds[dim] == CON_VIRTUAL)
+ continue;
+ const Congruence& cg = sys[--row];
+ // Check diagonal.
+ if (cg[dim] <= 0)
+ return false;
+ // Check elements following diagonal.
+ dimension_type col = dim;
+ while (++col < num_cols)
+ if (cg[col] != 0)
+ return false;
+ }
+
+ // Check squareness.
+ return row == 0;
+}
+
+// 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_cols = sys.space_dimension() + 1;
+ dimension_type row = sys.num_generators();
+
+ // Check for easy square fail case.
+ if (row > num_cols)
+ return false;
+
+ // Check triangularity.
+ while (num_cols > 0) {
+ --num_cols;
+ if (dim_kinds[num_cols] == GEN_VIRTUAL)
+ continue;
+ const Grid_Generator& gen = sys[--row];
+ // Check diagonal.
+ if (gen[num_cols] <= 0)
+ return false;
+ // Check elements preceding diagonal.
+ dimension_type col = num_cols;
+ while (col-- > 0)
+ if (gen[col] != 0)
+ return false;
+ }
+
+ // Check for squareness.
+ return num_cols == row;
+}
+
+inline void
+Grid::multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+ Grid_Generator_System& dest, const dimension_type num_rows,
+ const dimension_type num_dims) {
+ if (multiplier == 1)
+ return;
+
+ if (gen.is_line())
+ // Multiply every element of the line.
+ for (dimension_type column = 0; column < num_dims; ++column)
+ gen[column] *= multiplier;
+ else {
+ assert(gen.is_parameter_or_point());
+ // Multiply every element of every parameter.
+ for (dimension_type index = 0; index < num_rows; ++index) {
+ Grid_Generator& generator = dest[index];
+ if (generator.is_parameter_or_point())
+ for (dimension_type column = 0; column < num_dims; ++column)
+ generator[column] *= multiplier;
+ }
+ }
+}
+
+inline void
+Grid::multiply_grid(const Coefficient& multiplier, Congruence& cg,
+ Congruence_System& dest, const dimension_type num_rows,
+ const dimension_type num_dims) {
+ if (multiplier == 1)
+ return;
+
+ if (cg.is_proper_congruence())
+ // Multiply every element of every congruence.
+ for (dimension_type index = 0; index < num_rows; ++index) {
+ Congruence& congruence = dest[index];
+ if (congruence.is_proper_congruence())
+ for (dimension_type column = 0; column < num_dims; ++column)
+ congruence[column] *= multiplier;
+ }
+ else {
+ assert(cg.is_equality());
+ // Multiply every element of the equality.
+ for (dimension_type column = 0; column < num_dims; ++column)
+ cg[column] *= multiplier;
+ }
+}
+
+// TODO: Rename the next two methods to convert and this file
+// 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) {
+ TRACE(cerr << "============= convert gs to cgs" << endl);
+ TRACE(cerr << "source:" << endl);
+ TRACE(source.ascii_dump(cerr));
+ TRACE(cerr << "dest:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+ trace_dim_kinds("gs to cgs ", dim_kinds);
+
+ // Quite similar to the congruence to generator version below.
+ // Changes here may be needed there too.
+
+ assert(upper_triangular(source, dim_kinds));
+
+ // Initialise matrix row number counters and compute the LCM of the
+ // diagonal entries of the parameters in `source'.
+ //
+ // The top-down order of the parameter system rows corresponds to
+ // the left-right order of the dimensions.
+ dimension_type source_num_rows = 0;
+ // The congruence system rows have a bottom-up ordering.
+ dimension_type dest_num_rows = 0;
+ TEMP_INTEGER(diagonal_lcm);
+ diagonal_lcm = 1;
+ const dimension_type dims = source.space_dimension() + 1;
+ for (dimension_type dim = 0; dim < dims; ++dim)
+ if (dim_kinds[dim] == GEN_VIRTUAL)
+ // Virtual generators map to equalities.
+ ++dest_num_rows;
+ else {
+ if (dim_kinds[dim] == PARAMETER) {
+ // Dimension `dim' has a parameter 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][dim]);
+ // Parameters map to proper congruences.
+ ++dest_num_rows;
+ }
+ // Lines map to virtual congruences.
+ ++source_num_rows;
+ }
+ TRACE(cerr << "diagonal_lcm: " << diagonal_lcm << endl);
+ TRACE(cerr << "source_num_rows: " << source_num_rows << endl);
+ TRACE(cerr << "dest_num_rows: " << dest_num_rows << endl);
+
+ // `source' must be regular.
+ if (diagonal_lcm == 0)
+ throw std::runtime_error("PPL internal error: Grid::conversion:"
+ " source matrix is singular.");
+
+ dest.resize_no_copy(dest_num_rows, dims + 1 /* moduli */);
+
+ // In `dest' initialize row types and elements, including setting
+ // the diagonal elements to the inverse ratio of the `source'
+ // diagonal elements.
+ dimension_type source_index = 0, dest_index = dest_num_rows - 1;
+ for (dimension_type dim = 0; dim < dims; ++dim) {
+ TRACE(cerr << "init dim " << dim << endl);
+ if (dim_kinds[dim] == LINE) {
+ TRACE(cerr << " line" << endl);
+ ++source_index;
+ }
+ else {
+ Congruence& cg = dest[dest_index];
+ for (dimension_type j = 0; j < dim; j++)
+ cg[j] = 0;
+ for (dimension_type j = dim + 1; j < dims; j++)
+ cg[j] = 0;
+
+ if (dim_kinds[dim] == GEN_VIRTUAL) {
+ TRACE(cerr << " gen_virtual" << endl);
+ cg[dims] = 0; // An equality.
+ cg[dim] = 1;
+ }
+ else {
+ assert(dim_kinds[dim] == PARAMETER);
+ TRACE(cerr << " parameter" << endl);
+ cg[dims] = 1; // A proper congruence.
+ cg[dim] = diagonal_lcm / source[source_index][dim];
+ ++source_index;
+ }
+ --dest_index;
+ }
+ }
+
+ assert(lower_triangular(dest, dim_kinds));
+
+ TRACE(cerr << "dest after init:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+
+ // 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;
+ dest_index = 0;
+
+ for (dimension_type dim = dims; dim-- > 0; ) {
+ TRACE(cerr << "dim: " << dim << endl);
+
+ if (dim_kinds[dim] != GEN_VIRTUAL) {
+ --source_index;
+ TEMP_INTEGER(source_dim);
+ source_dim = source[source_index][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; ) {
+ TRACE(cerr << " row " << row << endl);
+ TRACE(dest.ascii_dump(cerr));
+
+ Congruence& cg = dest[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.
+ TEMP_INTEGER(multiplier);
+ gcd_assign(multiplier, cg[dim], source_dim);
+ multiplier = source_dim / multiplier;
+ multiply_grid(multiplier, cg, dest, dest_num_rows, dims);
+
+ cg[dim] /= source_dim;
+ }
+ TRACE(cerr << "dest after dividing grid:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+ }
+
+ // 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 tem_source_index = source_index;
+ if (dim_kinds[dim] != LINE)
+ ++dest_index;
+ for (dimension_type dim_prec = dim; dim_prec-- > 0; ) {
+ TRACE(cerr << " dim_prec: " << dim_prec);
+ TRACE(cerr << " dest_index: " << dest_index);
+ TRACE(cerr << " tem_source_index: " << tem_source_index << endl);
+ if (dim_kinds[dim_prec] != GEN_VIRTUAL) {
+ --tem_source_index;
+ TEMP_INTEGER(source_dim);
+ source_dim = source[tem_source_index][dim];
+ TRACE(cerr << " rows:" << endl);
+ // In order to compute the transpose of the inverse of
+ // `source', subtract source[tem_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[tem_source_index][dim]
+ // times the entry `dim' from the entry at `dim_prec'.
+ for (dimension_type row = dest_index; row-- > 0; ) {
+ assert(row < dest_num_rows);
+ TRACE(cerr << " " << row << endl);
+ Congruence& cg = dest[row];
+ cg[dim_prec] -= source_dim * cg[dim];
+ }
+ }
+ }
+
+ TRACE(cerr << "dest after processing preceding rows:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+ }
+ // Set the modulus in every congruence.
+ Coefficient_traits::const_reference modulus = dest[dest_num_rows - 1][0];
+ for (dimension_type row = 0; row < dest_num_rows; ++row) {
+ Congruence& cg = dest[row];
+ if (cg[dims] > 0)
+ // `cg' is a proper congruence.
+ cg[dims] = modulus;
+ }
+ TRACE(cerr << "dest after setting moduli:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+
+ assert(lower_triangular(dest, dim_kinds));
+
+#ifdef STRONG_REDUCTION
+ 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, Congruence>
+ (dest, dim, i++, 0, dim, dim_kinds, false);
+ TRACE(cerr << "dest after strong reduction:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+#endif
+
+ trace_dim_kinds("gs to cgs end ", dim_kinds);
+
+ TRACE(cerr << "------------------- gs to cgs conversion done." << endl);
+}
+
+void
+Grid::conversion(Congruence_System& source, Grid_Generator_System& dest,
+ Dimension_Kinds& dim_kinds) {
+ TRACE(cerr << "============= convert cgs to gs" << endl);
+ TRACE(cerr << "source:" << endl);
+ TRACE(source.ascii_dump(cerr));
+ TRACE(cerr << "dest:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+ trace_dim_kinds("cgs to gs ", dim_kinds);
+
+ // Quite similar to the generator to congruence version above.
+ // Changes here may be needed there too.
+
+ assert(lower_triangular(source, dim_kinds));
+
+ // Initialise matrix row number counters and compute the LCM of the
+ // diagonal entries of the proper congruences in `source'.
+ dimension_type source_num_rows = 0, dest_num_rows = 0;
+ TEMP_INTEGER(diagonal_lcm);
+ diagonal_lcm = 1;
+ dimension_type dims = source.num_columns() - 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][dim]);
+ // Proper congruences map to parameters.
+ ++dest_num_rows;
+ }
+ // Equalities map to virtual generators.
+ ++source_num_rows;
+ }
+ TRACE(cerr << "diagonal_lcm: " << diagonal_lcm << endl);
+ TRACE(cerr << "source_num_rows: " << source_num_rows << endl);
+ TRACE(cerr << "dest_num_rows: " << dest_num_rows << endl);
+
+ // `source' must be regular.
+ if (diagonal_lcm == 0)
+ throw std::runtime_error("PPL internal error: Grid::conversion:"
+ " source matrix is singular.");
+
+ dest.set_index_first_pending_row(dest_num_rows);
+ dest.resize_no_copy(dest_num_rows, dims + 1 /* parameter divisor */);
+
+ // 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 = 0;
+ // The generator system has a bottom-up ordering.
+ dimension_type dest_index = dest_num_rows - 1;
+ for (dimension_type dim = dims; dim-- > 0; ) {
+ TRACE(cerr << "init dim " << dim << endl);
+ if (dim_kinds[dim] == EQUALITY) {
+ TRACE(cerr << " equality" << endl);
+ ++source_index;
+ }
+ else {
+ Grid_Generator& g = dest[dest_index];
+ for (dimension_type j = 0; j < dim; ++j)
+ g[j] = 0;
+ for (dimension_type j = dim + 1; j < dims; ++j)
+ g[j] = 0;
+
+ if (dim_kinds[dim] == CON_VIRTUAL) {
+ TRACE(cerr << " con_virtual" << endl);
+ g.set_is_line();
+ g[dim] = 1;
+ }
+ else {
+ assert(dim_kinds[dim] == PROPER_CONGRUENCE);
+ TRACE(cerr << " proper_congruence" << endl);
+ g.set_is_parameter_or_point();
+ g[dim] = diagonal_lcm / source[source_index][dim];
+ ++source_index;
+ }
+ --dest_index;
+ }
+ }
+
+ assert(upper_triangular(dest, dim_kinds));
+
+ TRACE(cerr << "dest after init:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+
+ // 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;
+ dest_index = 0;
+
+ for (dimension_type dim = 0; dim < dims; ++dim) {
+ TRACE(cerr << "dim: " << dim << endl);
+
+ if (dim_kinds[dim] != CON_VIRTUAL) {
+ --source_index;
+ TEMP_INTEGER(source_dim);
+ source_dim = source[source_index][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; ) {
+ TRACE(cerr << " row " << row << endl);
+ TRACE(dest.ascii_dump(cerr));
+
+ Grid_Generator& g = dest[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.
+ TEMP_INTEGER(red_source_dim);
+ gcd_assign(red_source_dim, g[dim], source_dim);
+ red_source_dim = source_dim / red_source_dim;
+ multiply_grid(red_source_dim, g, dest, dest_num_rows,
+ dims + 1 /* parameter divisor */);
+
+ g[dim] /= source_dim;
+ }
+ TRACE(cerr << "dest after dividing grid:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+ }
+
+ // 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 tem_source_index = source_index;
+ if (dim_kinds[dim] != EQUALITY)
+ ++dest_index;
+ for (dimension_type dim_fol = dim + 1; dim_fol < dims; ++dim_fol) {
+ TRACE(cerr << " dim_fol: " << dim_fol);
+ TRACE(cerr << " dest_index: " << dest_index);
+ TRACE(cerr << " tem_source_index: " << tem_source_index << endl);
+ if (dim_kinds[dim_fol] != CON_VIRTUAL) {
+ --tem_source_index;
+ TEMP_INTEGER(source_dim);
+ source_dim = source[tem_source_index][dim];
+ TRACE(cerr << " rows:" << endl);
+ // In order to compute the transpose of the inverse of
+ // `source', subtract source[tem_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[tem_source_index][dim]
+ // times the entry `dim' from the entry at `dim_fol'.
+ for (dimension_type row = dest_index; row-- > 0; ) {
+ assert(row < dest_num_rows);
+ TRACE(cerr << " " << row << endl);
+ Grid_Generator& g = dest[row];
+ g[dim_fol] -= source_dim * g[dim];
+ }
+ }
+ }
+ TRACE(cerr << "dest after processing preceding rows:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+ }
+
+ assert(upper_triangular(dest, dim_kinds));
+
+#ifdef STRONG_REDUCTION
+ 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, Grid_Generator>
+ (dest, dim, i++, dim, dims - 1, dim_kinds);
+ TRACE(cerr << "dest after strong reduction:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+#endif
+
+ // Ensure that the parameter divisors are the same as the divisor of
+ // the point.
+ Coefficient_traits::const_reference system_divisor = dest[0][0];
+ for (dimension_type row = 1, dim = 1; dim < dims; ++dim)
+ switch (dim_kinds[dim]) {
+ case PARAMETER:
+ dest[row].divisor() = system_divisor;
+ case LINE:
+ ++row;
+ case GEN_VIRTUAL:
+ break;
+ }
+ TRACE(cerr << "dest after updating param divisors:" << endl);
+ TRACE(dest.ascii_dump(cerr));
+
+ trace_dim_kinds("cgs to gs end ", dim_kinds);
+
+ TRACE(cerr << "------------------- cgs to gs conversion done." << endl);
+}
+
+#undef TRACE
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_nonpublic.cc b/src/Grid_nonpublic.cc
new file mode 100644
index 0000000..66a8a7e
--- /dev/null
+++ b/src/Grid_nonpublic.cc
@@ -0,0 +1,612 @@
+/* Grid class implementation
+ (non-inline private or protected functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include "Grid_Generator.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::construct(const Congruence_System& ccgs) {
+ // Protecting against space dimension overflow is up to the caller.
+ assert(ccgs.space_dimension() <= max_space_dimension());
+
+ // TODO: this implementation is just an executable specification.
+ Congruence_System cgs = ccgs;
+
+ // Set the space dimension.
+ space_dim = cgs.space_dimension();
+
+ if (space_dim > 0) {
+ // Stealing the rows from `cgs'.
+ std::swap(con_sys, cgs);
+ con_sys.normalize_moduli();
+ set_congruences_up_to_date();
+ }
+ else {
+ // Here `space_dim == 0'.
+ if (cgs.num_columns() > 1)
+ // See if an inconsistent congruence has been passed.
+ for (dimension_type i = cgs.num_rows(); i-- > 0; )
+ if (cgs[i].is_trivial_false()) {
+ // Inconsistent congruence found: the grid is empty.
+ // FIXME: Initialize con_sys to the correct dimension in the
+ // caller constructors, and copy the necessary parts
+ // of set_empty into here.
+ set_empty();
+ assert(OK());
+ return;
+ }
+ set_zero_dim_univ();
+ }
+
+ assert(OK());
+}
+
+void
+PPL::Grid::construct(const Grid_Generator_System& const_gs) {
+ // Protecting against space dimension overflow is up to the caller.
+ assert(const_gs.space_dimension() <= max_space_dimension());
+
+ // TODO: this implementation is just an executable specification.
+ Grid_Generator_System gs = const_gs;
+
+ // Set the space dimension.
+ space_dim = gs.space_dimension();
+
+ // An empty set of generators defines the empty grid.
+ if (gs.num_generators() == 0) {
+ // FIXME: Initialize gen_sys to the correct dimension in the
+ // caller constructors, and copy the necessary parts of
+ // set_empty into here.
+ set_empty();
+ return;
+ }
+
+ // Non-empty valid generator systems have a supporting point, at least.
+ if (!gs.has_points())
+ throw_invalid_generators("Grid(const_gs)", "gs");
+
+ if (space_dim > 0) {
+ // Steal the rows from `gs'.
+ std::swap(gen_sys, gs);
+ normalize_divisors(gen_sys);
+
+ // Generators are now up-to-date.
+ set_generators_up_to_date();
+ }
+ else
+ set_zero_dim_univ();
+
+ assert(OK());
+}
+
+PPL::Grid::Three_Valued_Boolean
+PPL::Grid::quick_equivalence_test(const Grid& y) const {
+ // Private method: the caller must ensure the following.
+ assert(space_dim == y.space_dim);
+ 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; ...
+ 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_generators() != y.gen_sys.num_generators())
+ 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.
+ assert(space_dim == y.space_dim);
+ 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;
+ y.congruences_are_up_to_date() || y.update_congruences();
+#else
+ if (!x.generators_are_minimized() && !x.minimize())
+ // Minimizing found `x' empty.
+ return true;
+ y.congruences_are_minimized() || y.minimize();
+#endif
+
+ assert(x.OK());
+ assert(y.OK());
+
+ const Grid_Generator_System& gs = x.gen_sys;
+ const Congruence_System& cgs = y.con_sys;
+
+ dimension_type num_rows = gs.num_generators();
+ 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;
+
+ // The generators are up to date.
+ for (dimension_type i = gen_sys.num_generators(); 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::max_min(const Linear_Expression& expr,
+ char* method_call,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Grid_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)
+ *point = Grid_Generator::point();
+ return true;
+ }
+ 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.
+ TEMP_INTEGER(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) {
+ *point = gen;
+ point->strong_normalize();
+ }
+ 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_Generator::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.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.increase_space_dimension(space_dim);
+ const_cast<Congruence_System&>(con_sys).swap(cgs);
+}
+
+bool
+PPL::Grid::update_congruences() const {
+ // The caller must ensure that the generators are up to date.
+ assert(space_dim > 0);
+ assert(!marked_empty());
+ assert(gen_sys.num_generators() > 0);
+ 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 afterwards.
+ assert(gen_sys.num_generators() > 0);
+
+ // 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();
+ return true;
+}
+
+bool
+PPL::Grid::update_generators() const {
+ assert(space_dim > 0);
+ assert(!marked_empty());
+ 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);
+ 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();
+ assert(OK());
+ return ret;
+ }
+ }
+ else {
+ assert(generators_are_up_to_date());
+ update_congruences();
+ }
+ assert(OK());
+ return true;
+}
+
+void
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+ Grid_Generator_System& gen_sys) {
+ dimension_type row = 0;
+ dimension_type num_rows = gen_sys.num_generators();
+ // Find first point in gen_sys.
+ while (gen_sys[row].is_line_or_parameter())
+ if (++row == num_rows)
+ // All rows are lines or parameters; generators should always
+ // contain a point.
+ throw std::runtime_error("PPL::Grid::normalize_divisors(sys, gen_sys).");
+ Grid_Generator& first_point = gen_sys[row];
+ Coefficient_traits::const_reference gen_sys_divisor = first_point.divisor();
+ Coefficient divisor = normalize_divisors(sys, gen_sys_divisor);
+ if (divisor != gen_sys_divisor)
+ // The divisors of the points in gen_sys are always the same, so
+ // the new divisor will be the LCM of this value and `divisor',
+ // hence the third argument.
+ normalize_divisors(gen_sys, divisor, &first_point);
+}
+
+PPL::Coefficient
+PPL::Grid::normalize_divisors(Grid_Generator_System& sys,
+ Coefficient_traits::const_reference divisor,
+ Grid_Generator* first_point) {
+ assert(divisor >= 0);
+ if (sys.space_dimension() > 0 && divisor > 0) {
+ TEMP_INTEGER(lcm);
+ lcm = divisor;
+
+ dimension_type row = 0;
+ dimension_type num_rows = sys.num_generators();
+
+ if (first_point)
+ lcm_assign(lcm, lcm, (*first_point).divisor());
+ else {
+ // Move to the first point or parameter.
+ while (sys[row].is_line())
+ if (++row == num_rows)
+ // All rows are lines.
+ return divisor;
+
+ // Calculate the LCM of `divisor' and the divisor of every
+ // point or parameter.
+ while (row < num_rows) {
+ Grid_Generator& g = sys[row];
+ if (g.is_parameter_or_point())
+ lcm_assign(lcm, lcm, g.divisor());
+ ++row;
+ }
+ }
+
+ // Represent every point and every parameter using the LCM as the
+ // divisor.
+ for (dimension_type row = 0; row < num_rows; ++row)
+ sys[row].scale_to_divisor(lcm);
+
+ return lcm;
+ }
+ return divisor;
+}
+
+void
+PPL::Grid::throw_runtime_error(const char* method) const {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << "." << std::endl;
+ throw std::runtime_error(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_argument(const char* method,
+ const char* reason) const {
+ 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* e_name,
+ const Linear_Expression& e) const {
+ throw_dimension_incompatible(method, e_name, e.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* 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_space_dimension_overflow(const char* method,
+ const char* reason) {
+ std::ostringstream s;
+ s << "PPL::Grid::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::length_error(s.str());
+}
+
+void
+PPL::Grid::throw_invalid_generator(const char* method,
+ const char* g_name) const {
+ 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) const {
+ 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..7afe635
--- /dev/null
+++ b/src/Grid_public.cc
@@ -0,0 +1,2218 @@
+/* Grid class implementation (non-inline public functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+#include "Topology.hh"
+#include "Scalar_Products.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Grid::Grid(dimension_type num_dimensions,
+ const Degenerate_Element kind)
+ : con_sys(),
+ gen_sys(num_dimensions > max_space_dimension()
+ ? (throw_space_dimension_overflow("Grid(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ 0)
+ : num_dimensions) {
+
+ 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.increase_space_dimension(space_dim);
+ const_cast<Congruence_System&>(con_sys).swap(cgs);
+
+ assert(OK());
+ return;
+ }
+
+ if (num_dimensions > 0) {
+ con_sys.increase_space_dimension(num_dimensions);
+
+ // Initialise both systems to universe representations.
+
+ set_congruences_minimized();
+ set_generators_minimized();
+ dim_kinds.resize(num_dimensions + 1);
+
+ // 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.increase_space_dimension(space_dim);
+ cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization.
+ con_sys.swap(cgs);
+
+ dim_kinds[0] = PROPER_CONGRUENCE /* a.k.a. PARAMETER */;
+
+ // Trivially true point.
+ gen_sys.insert(grid_point(0*(Variable(0))));
+
+ // A line for each dimension.
+ dimension_type dim = 0;
+ while (dim < num_dimensions) {
+ gen_sys.insert(grid_line(Variable(dim++)));
+ dim_kinds[dim] = CON_VIRTUAL /* a.k.a. LINE */;
+ }
+ }
+ else
+ set_zero_dim_univ();
+
+ assert(OK());
+}
+
+PPL::Grid::Grid(const Grid& y)
+ : 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.increase_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& ccs) {
+ if (ccs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(ccs)",
+ "the space dimension of ccs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ Congruence_System cgs;
+ cgs.insert(0*Variable(ccs.space_dimension() - 1) %= 1);
+ for (Constraint_System::const_iterator i = ccs.begin(),
+ ccs_end = ccs.end(); i != ccs_end; ++i)
+ if (i->is_equality())
+ cgs.insert(*i);
+ construct(cgs);
+}
+
+PPL::Grid::Grid(Constraint_System& cs) {
+ if (cs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ // FIXME: Adapt and use cs instead of using a copy.
+ Congruence_System cgs;
+ cgs.insert(0*Variable(cs.space_dimension() - 1) %= 1);
+ 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);
+}
+
+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;
+
+ // FIXME: Use the minimized congruence system, or the generator
+ // system in any form.
+
+ const Congruence_System& cgs = minimized_congruences();
+ dimension_type d = space_dim;
+ for (dimension_type i = cgs.num_rows(); i-- > 0; )
+ if (cgs[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.
+ assert(con_sys.num_columns() == 2 && con_sys.num_rows() == 0);
+ return con_sys;
+ }
+
+ congruences_are_up_to_date() || update_congruences();
+
+ return con_sys;
+}
+
+const PPL::Congruence_System&
+PPL::Grid::minimized_congruences() const {
+ if (space_dim == 0) {
+ if (!marked_empty()) {
+ // Ensure the congruences are minimal by extending a zero dim
+ // universe congruence system to the appropriate dimension and
+ // then storing it in `con_sys'.
+ Congruence_System cgs(Congruence::zero_dim_integrality());
+ cgs.increase_space_dimension(space_dim);
+ cgs[0][0] = 1; // Recover minimal form after cgs(zdi) normalization.
+ const_cast<Congruence_System&>(con_sys).swap(cgs);
+ }
+ return con_sys;
+ }
+ 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::generators() const {
+ if (space_dim == 0) {
+ assert(gen_sys.space_dimension() == 0
+ && gen_sys.num_generators() == (marked_empty() ? 0 : 1));
+ return gen_sys;
+ }
+
+ if (marked_empty()) {
+ assert(gen_sys.num_generators() == 0);
+ 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_generators() const {
+ if (space_dim == 0) {
+ assert(gen_sys.space_dimension() == 0
+ && gen_sys.num_generators() == (marked_empty() ? 0 : 1));
+ return gen_sys;
+ }
+
+ if (marked_empty()) {
+ assert(gen_sys.num_generators() == 0);
+ 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::is_included()
+ && Poly_Con_Relation::is_disjoint();
+
+ if (space_dim == 0)
+ // FIXME: Confirm that the relation with the false cg is correct.
+ // Does the false congruence define the empty grid? If so,
+ // is the empty grid disjoint from the universe grid?
+ if (cg.inhomogeneous_term() == 0)
+ return Poly_Con_Relation::is_included();
+ else if (cg.is_equality())
+ return Poly_Con_Relation::is_disjoint();
+ else if (cg.inhomogeneous_term() % cg.modulus() == 0)
+ return Poly_Con_Relation::is_included();
+ else
+ // cg is false.
+ return Poly_Con_Relation::is_disjoint();
+
+ if (!generators_are_up_to_date() && !update_generators())
+ // Updating found the grid empty.
+ return 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 seperate spaces.
+
+ // There is always a point.
+
+ // Scalar product of the congruence and the first point that
+ // satisfies the congruence.
+ TEMP_INTEGER(point_sp);
+ point_sp = 0;
+
+ TEMP_INTEGER(modulus);
+ modulus = cg.modulus();
+
+ TEMP_INTEGER(div);
+ div = 0;
+
+ bool known_to_intersect = false;
+
+ for (Grid_Generator_System::const_iterator g = gen_sys.begin(),
+ gen_sys_end = gen_sys.end(); g != gen_sys_end; ++g) {
+ TEMP_INTEGER(sp);
+ Scalar_Products::assign(sp, cg, *g);
+
+ switch (g->type()) {
+
+ case Grid_Generator::POINT:
+ if (cg.is_proper_congruence())
+ sp %= modulus;
+ 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 %= (modulus * 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)
+ // 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)
+ // Every generator satisfied the cg.
+ return Poly_Con_Relation::is_included();
+
+ 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();
+
+ congruences_are_up_to_date() || update_congruences();
+
+ return
+ con_sys.satisfies_all_congruences(g)
+ ? Poly_Gen_Relation::subsumes()
+ : Poly_Gen_Relation::nothing();
+}
+
+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_trivial_true();
+ }
+ else {
+ update_congruences();
+ return con_sys.num_rows() == 1 && con_sys[0].is_trivial_true();
+ }
+
+ // Test con_sys's inclusion in a universe generator system.
+
+ // The zero dimension cases are handled above.
+ Variable var(space_dim - 1);
+ for (dimension_type i = space_dim; i-- > 0; )
+ if (!con_sys.satisfies_all_congruences(grid_line(Variable(i) + var)))
+ return false;
+ assert(con_sys.satisfies_all_congruences(grid_point(0*var)));
+ 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_generators() > 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_generators(); 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())
+ return true;
+
+ if (generators_are_minimized()) {
+ line_search:
+ // Search for lines in the minimized generator system.
+ for (dimension_type row = gen_sys.num_generators(); row-- > 1; )
+ if (gen_sys[row].is_line())
+ return false;
+ return true;
+ }
+
+ if (congruences_are_minimized())
+ return con_sys.has_a_free_dimension();
+
+ Grid& gr = const_cast<Grid&>(*this);
+ if (generators_are_up_to_date()) {
+ // Minimize the generator system.
+ gr.simplify(gr.gen_sys, gr.dim_kinds);
+ gr.set_generators_minimized();
+
+ goto line_search;
+ }
+
+ // Generators are out of date.
+
+ // Minimize the congruence system to find out whether it is empty.
+ if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
+ // The congruence system reduced to the empty grid.
+ gr.set_empty();
+ return true;
+ }
+ gr.set_congruences_minimized();
+
+ return gr.con_sys.has_a_free_dimension();
+}
+
+bool
+PPL::Grid::is_topologically_closed() const {
+ // Any empty or zero-dimensional grid is closed.
+ if (marked_empty() || space_dim == 0)
+ return true;
+
+ if (generators_are_minimized()) {
+ param_search:
+ // Search for a parameter in the minimized generator system.
+ for (dimension_type row = gen_sys.num_generators(); row-- > 1; )
+ if (gen_sys[row].is_parameter())
+ return false;
+ return true;
+ }
+
+ if (congruences_are_minimized()) {
+ proper_cg_search:
+ // Search for a proper congruence following the integrality
+ // congruence, in the minimized congruence system.
+ for (dimension_type row = con_sys.num_rows() - 1; row-- > 0; )
+ if (con_sys[row].is_proper_congruence())
+ return false;
+ return true;
+ }
+
+ Grid& gr = const_cast<Grid&>(*this);
+ if (generators_are_up_to_date()) {
+ gr.simplify(gr.gen_sys, gr.dim_kinds);
+ gr.set_generators_minimized();
+ goto param_search;
+ }
+
+ // Minimize the congruence system.
+ if (gr.simplify(gr.con_sys, gr.dim_kinds)) {
+ // The congruence system reduced to the empty grid.
+ gr.set_empty();
+ return true;
+ }
+ gr.set_congruences_minimized();
+ goto proper_cg_search;
+}
+
+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.num_rows() == 0)
+ if (gen_sys.num_generators() == 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;
+ }
+
+ {
+ // This block is to limit the scope of num_columns, at least for
+ // GCC < 3.4.
+
+ // 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.num_columns() != num_columns + 1 /* moduli */) {
+#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() + 1 != num_columns) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (gen_sys and space_dim)"
+ << endl;
+#endif
+ goto fail;
+ }
+
+ // Check if the system of generators is well-formed.
+ if (!gen_sys.OK()) {
+#ifndef NDEBUG
+ cerr << "gen_sys OK failed." << endl;
+#endif
+ goto fail;
+ }
+ // Check each generator in the system.
+ for (dimension_type i = gen_sys.num_generators(); i-- > 0; ) {
+ const Grid_Generator& g = gen_sys[i];
+
+ if (g.size() < 1) {
+#ifndef NDEBUG
+ cerr << "Parameter should have coefficients." << endl;
+#endif
+ goto fail;
+ }
+ }
+
+ // A non-empty system of generators describing a grid is valid iff
+ // it contains a point.
+ if (gen_sys.num_generators() > 0 && !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 = 0, row = 0;
+ dim < space_dim + 1;
+ ++dim, assert(row <= dim)) {
+ if (dim_kinds[dim] == GEN_VIRTUAL
+ || (gen_sys[row++].is_parameter_or_point()
+ && dim_kinds[dim] == PARAMETER)
+ || (assert(gen_sys[row-1].is_line()), dim_kinds[dim] == LINE))
+ continue;
+#ifndef NDEBUG
+ cerr << "Kinds in dim_kinds should match those in gen_sys."
+ << endl;
+#endif
+ goto fail;
+ }
+
+ // A reduced generator system must be the same as a temporary
+ // reduced copy.
+ Dimension_Kinds dk = dim_kinds;
+ // `gs' is minimized and marked_empty returned false, so `gs'
+ // should contain rows.
+ assert(gs.num_generators() > 0);
+ simplify(gs, dk);
+ // gs contained rows before being reduced, so it should
+ // contain at least a single point afterwards.
+ assert(gs.num_generators() > 0);
+ for (dimension_type row = 0; row < gen_sys.num_generators(); ++row) {
+ 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())
+ } // scope block
+
+ if (congruences_are_up_to_date()) {
+ // Check if the system of congruences is well-formed.
+ if (!con_sys.OK()) {
+#ifndef NDEBUG
+ cerr << "con_sys OK failed." << endl;
+#endif
+ goto fail;
+ }
+
+ Grid tem_gr = *this;
+ Congruence_System cs_copy = tem_gr.con_sys;
+
+ // Clear the generators in tem_gr.
+ Grid_Generator_System gs(space_dim);
+ std::swap(tem_gr.gen_sys, gs);
+ tem_gr.clear_generators_up_to_date();
+
+ if (!tem_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.num_columns() - 1 /* modulus */) {
+#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 = 0, row = con_sys.num_rows() - 1;
+ dim < space_dim + 1;
+ ++dim) {
+ if (dim_kinds[dim] == CON_VIRTUAL
+ || (con_sys[row--].is_proper_congruence()
+ && dim_kinds[dim] == PROPER_CONGRUENCE)
+ || (assert(con_sys[row+1].is_equality()),
+ 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_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);
+
+ // Adding a new congruence to an empty grid results in an empty
+ // grid.
+ if (marked_empty())
+ return;
+
+ // Dealing with a zero-dimensional space grid first.
+ if (space_dim == 0) {
+ if (!cg.is_trivial_true())
+ set_empty();
+ return;
+ }
+
+ 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.
+ assert(OK());
+}
+
+void
+PPL::Grid::add_congruence(const Constraint& c) {
+ // TODO: this is just an executable specification.
+ if (c.is_equality()) {
+ Congruence_System cgs(c);
+ add_recycled_congruences(cgs);
+ }
+}
+
+bool
+PPL::Grid::add_congruence_and_minimize(const Congruence& cg) {
+ // TODO: this is just an executable specification.
+ Congruence_System cgs(cg);
+ return add_recycled_congruences_and_minimize(cgs);
+}
+
+bool
+PPL::Grid::add_congruence_and_minimize(const Constraint& c) {
+ // TODO: this is just an executable specification.
+ if (c.is_equality()) {
+ Congruence_System cgs(c);
+ return add_recycled_congruences_and_minimize(cgs);
+ }
+ return minimize();
+}
+
+void
+PPL::Grid::add_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_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_generator(g)", "g");
+ set_zero_dim_univ();
+ }
+ 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_generator(g)", "g");
+ gen_sys.insert(g);
+ clear_empty();
+ }
+ else {
+ 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();
+ assert(OK());
+}
+
+bool
+PPL::Grid::add_generator_and_minimize(const Grid_Generator& g) {
+ // TODO: this is just an executable specification.
+ Grid_Generator_System gs(g);
+ return add_recycled_generators_and_minimize(gs);
+}
+
+void
+PPL::Grid::add_recycled_congruences(Congruence_System& cgs) {
+ // Dimension-compatibility check: the dimension of `cgs' can not be
+ // greater than space_dim.
+ 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.num_rows() == 0)
+ 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 is empty.
+ if (status.test_zero_dim_univ())
+ set_empty();
+ return;
+ }
+
+ if (marked_empty()) {
+ assert(OK());
+ return;
+ }
+
+ // The congruences are required.
+ congruences_are_up_to_date() || update_congruences();
+
+ // Swap (instead of copying) the coefficients of `cgs' (which is
+ // writable).
+ con_sys.recycling_insert(cgs);
+
+ // 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.
+ assert(OK());
+}
+
+void
+PPL::Grid::add_recycled_congruences(Constraint_System& cs) {
+ // TODO: this is just an executable specification.
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("add_recycled_congruences(cs)", "cs", cs);
+ Congruence_System cgs(cs);
+ add_recycled_congruences(cgs);
+}
+
+void
+PPL::Grid::add_congruences(const Congruence_System& cgs) {
+ // TODO: this is just an executable specification.
+ // The dimension of `cgs' must be at most `space_dim'.
+ if (space_dim < cgs.space_dimension())
+ throw_dimension_incompatible("add_congruences(cgs)", "cgs", cgs);
+ Congruence_System cgs_copy = cgs;
+ add_recycled_congruences(cgs_copy);
+}
+
+void
+PPL::Grid::add_congruences(const Constraint_System& cs) {
+ // TODO: this is just an executable specification.
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("add_congruences(cs)", "cs", cs);
+ Congruence_System cgs(cs);
+ add_recycled_congruences(cgs);
+}
+
+bool
+PPL::Grid::add_recycled_congruences_and_minimize(Congruence_System& cgs) {
+ // Dimension-compatibility check: the dimension of `cgs' can not be
+ // greater than space_dim.
+ const dimension_type cgs_space_dim = cgs.space_dimension();
+ if (space_dim < cgs_space_dim)
+ throw_dimension_incompatible("add_recycled_congruences_and_minimize(cgs)",
+ "cgs", cgs);
+
+ // Adding no congruences: just minimize.
+ if (cgs.num_rows() == 0)
+ return minimize();
+
+ // Dealing with zero-dimensional space grids first.
+ 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())
+ return true;
+ // There is a congruence, it must be false, the grid is empty.
+ if (status.test_zero_dim_univ())
+ set_empty();
+ return false;
+ }
+
+ if (marked_empty())
+ return false;
+
+ congruences_are_up_to_date() || update_congruences();
+
+ con_sys.recycling_insert(cgs);
+
+ clear_congruences_minimized();
+
+#ifndef NDEBUG
+ bool ret = update_generators();
+ assert(OK());
+ return ret;
+#else
+ return update_generators();
+#endif
+}
+
+bool
+PPL::Grid::add_recycled_congruences_and_minimize(Constraint_System& cs) {
+ // TODO: this is just an executable specification.
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("add_recycled_congruences_and_minimize(cs)",
+ "cs", cs);
+ Congruence_System cgs(cs);
+ return add_recycled_congruences_and_minimize(cgs);
+}
+
+bool
+PPL::Grid::add_congruences_and_minimize(const Congruence_System& cgs) {
+ // TODO: this is just an executable specification.
+ Congruence_System cgs_copy = cgs;
+ return add_recycled_congruences_and_minimize(cgs_copy);
+}
+
+bool
+PPL::Grid::add_congruences_and_minimize(const Constraint_System& cs) {
+ // TODO: this is just an executable specification.
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("add_congruences_and_minimize(cs)", "cs", cs);
+ Congruence_System cgs(cs);
+ return add_recycled_congruences_and_minimize(cgs);
+}
+
+void
+PPL::Grid::add_constraint(const Constraint& c) {
+ // The dimension of `c' must be at most `space_dim'.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("add_constraint(c)", "c", c);
+ if (c.is_equality()) {
+ Congruence cg(c);
+ add_congruence(cg);
+ }
+}
+
+bool
+PPL::Grid::add_constraint_and_minimize(const Constraint& c) {
+ // The dimension of `c' must be at most `space_dim'.
+ if (space_dim < c.space_dimension())
+ throw_dimension_incompatible("add_constraint_and_minimize(c)", "c", c);
+ if (c.is_equality()) {
+ Congruence cg(c);
+ return add_congruence_and_minimize(cg);
+ }
+ return minimize();
+}
+
+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);
+ Congruence_System cgs(cs);
+ add_recycled_congruences(cgs);
+}
+
+bool
+PPL::Grid::add_constraints_and_minimize(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_and_minimize(cs)",
+ "cs", cs);
+ Congruence_System cgs(cs);
+ return add_recycled_congruences_and_minimize(cgs);
+}
+
+void
+PPL::Grid::add_recycled_constraints(Constraint_System& cs) {
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("add_recycled_constraints(cs)",
+ "cs", cs);
+ Congruence_System cgs(cs);
+ add_recycled_congruences(cgs);
+}
+
+bool
+PPL::Grid::add_recycled_constraints_and_minimize(Constraint_System& cs) {
+ // The dimension of `cs' must be at most `space_dim'.
+ if (space_dim < cs.space_dimension())
+ throw_dimension_incompatible("add_recycled_constraints_and_minimize(cs)",
+ "cs", cs);
+ Congruence_System cgs(cs);
+ return add_recycled_congruences_and_minimize(cgs);
+}
+
+void
+PPL::Grid::add_recycled_generators(Grid_Generator_System& 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 leaves the grid the same.
+ if (gs.num_generators() == 0)
+ return;
+
+ // Adding valid generators to a zero-dimensional grid transforms it
+ // to the zero-dimensional universe grid.
+ if (space_dim == 0) {
+ if (marked_empty())
+ if (gs.has_points())
+ set_zero_dim_univ();
+ else
+ throw_invalid_generators("add_recycled_generators(gs)", "gs");
+ assert(OK(true));
+ return;
+ }
+
+ if (!marked_empty()
+ && (generators_are_up_to_date() || update_generators())) {
+ // The grid contains at least one point.
+
+ normalize_divisors(gs, gen_sys);
+
+ gen_sys.recycling_insert(gs);
+
+ // Congruences are out of date and generators are not minimized.
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+
+ assert(OK(true));
+ return;
+ }
+
+ // The grid is empty.
+
+ // `gs' must contain at least one point.
+ if (!gs.has_points())
+ throw_invalid_generators("add_recycled_generators(gs)", "gs");
+
+ // Adjust `gs' to the right dimension.
+ gs.insert(parameter(0*Variable(space_dim-1)));
+
+ std::swap(gen_sys, gs);
+
+ normalize_divisors(gen_sys);
+
+ // The grid is no longer empty and generators are up-to-date.
+ set_generators_up_to_date();
+ clear_empty();
+
+ assert(OK());
+}
+
+void
+PPL::Grid::add_generators(const Grid_Generator_System& gs) {
+ // TODO: this is just an executable specification.
+ Grid_Generator_System gs_copy = gs;
+ add_recycled_generators(gs_copy);
+}
+
+bool
+PPL::Grid::add_recycled_generators_and_minimize(Grid_Generator_System& gs) {
+ // Dimension-compatibility check: the dimension of `gs' must be less
+ // than or equal to that of space_dim.
+ const dimension_type gs_space_dim = gs.space_dimension();
+ if (space_dim < gs_space_dim)
+ throw_dimension_incompatible("add_recycled_generators_and_minimize(gs)",
+ "gs", gs);
+
+ // Adding no generators is equivalent to just requiring reduction.
+ if (gs.num_generators() == 0)
+ return minimize();
+
+ // Adding valid generators to a zero-dimensional grid produces the
+ // zero-dimensional universe grid.
+ if (space_dim == 0) {
+ if (marked_empty())
+ if (gs.has_points())
+ set_zero_dim_univ();
+ else
+ throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
+ "gs");
+ assert(OK(true));
+ return true;
+ }
+
+ // Adjust `gs' to the right dimension.
+ gs.insert(parameter(0*Variable(space_dim-1)));
+
+ if (!marked_empty()
+ && (generators_are_up_to_date() || update_generators())) {
+ // The grid contains at least one point.
+ normalize_divisors(gs, gen_sys);
+
+ for (dimension_type row = 0; row < gs.num_generators(); ++row)
+ gen_sys.recycling_insert(gs[row]);
+ }
+ else {
+ // The grid is empty: check if `gs' contains a point.
+ if (!gs.has_points())
+ throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
+ "gs");
+ std::swap(gen_sys, gs);
+ normalize_divisors(gen_sys);
+ clear_empty();
+ }
+ clear_generators_minimized();
+ update_congruences();
+
+ assert(OK(true));
+ return true;
+}
+
+bool
+PPL::Grid::add_generators_and_minimize(const Grid_Generator_System& gs) {
+ // TODO: this is just an executable specification.
+ Grid_Generator_System gs_copy = gs;
+ return add_recycled_generators_and_minimize(gs_copy);
+}
+
+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.
+ x.congruences_are_up_to_date() || x.update_congruences();
+ y.congruences_are_up_to_date() || y.update_congruences();
+
+ if (y.con_sys.num_rows() > 0 ) {
+ 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();
+ }
+
+ // `y' should still contain a point.
+ assert(x.OK() && y.OK(true));
+}
+
+bool
+PPL::Grid::intersection_assign_and_minimize(const Grid& y) {
+ intersection_assign(y);
+ return minimize();
+}
+
+void
+PPL::Grid::join_assign(const Grid& y) {
+ Grid& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("join_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.recycling_insert(gs);
+ // 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.
+ assert(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Grid::join_assign_and_minimize(const Grid& y) {
+ join_assign(y);
+ return minimize();
+}
+
+bool
+PPL::Grid::join_assign_if_exact(const Grid& y) {
+ Grid& x = *this;
+
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("join_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)) {
+ join_assign(y);
+ return true;
+ }
+
+ Grid x_copy = x;
+ x_copy.join_assign(y);
+ x_copy.grid_difference_assign(y);
+ if (x_copy.is_included_in(x)) {
+ join_assign(y);
+ return true;
+ }
+
+ return false;
+}
+
+void
+PPL::Grid::grid_difference_assign(const Grid& y) {
+ Grid& x = *this;
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("poly_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 = Linear_Expression(cg);
+ // Congruence cg is ((e %= 0) / m).
+ Coefficient_traits::const_reference 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((2*e %= m) / (2*m));
+ new_grid.join_assign(z);
+ continue;
+ }
+ }
+ return;
+ }
+
+ *this = new_grid;
+
+ assert(OK());
+}
+
+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;
+
+ if (var_space_dim <= expr_space_dim && expr[var_space_dim] != 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_space_dim, expr, denominator);
+ else
+ gen_sys.affine_image(var_space_dim, -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_space_dim] > 0) {
+ inverse = -expr;
+ inverse[var_space_dim] = denominator;
+ con_sys.affine_preimage(var_space_dim, inverse, expr[var_space_dim]);
+ }
+ 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[var_space_dim] = denominator;
+ neg_assign(inverse[var_space_dim]);
+ con_sys.affine_preimage(var_space_dim, inverse, -expr[var_space_dim]);
+ }
+ 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_space_dim, expr, denominator);
+ else
+ gen_sys.affine_image(var_space_dim, -expr, -denominator);
+
+ clear_congruences_up_to_date();
+ clear_generators_minimized();
+ // Strong normalization in gs::affine_image may have modified
+ // divisors.
+ normalize_divisors(gen_sys);
+ }
+ }
+ 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 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 (var_space_dim <= expr_space_dim && expr[var_space_dim] != 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_space_dim, expr, denominator);
+ else
+ con_sys.affine_preimage(var_space_dim, -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_space_dim] > 0) {
+ inverse = -expr;
+ inverse[var_space_dim] = denominator;
+ gen_sys.affine_image(var_space_dim, inverse, expr[var_space_dim]);
+ }
+ 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[var_space_dim] = denominator;
+ neg_assign(inverse[var_space_dim]);
+ gen_sys.affine_image(var_space_dim, inverse, -expr[var_space_dim]);
+ }
+ 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_space_dim, expr, denominator);
+ else
+ con_sys.affine_preimage(var_space_dim, -expr, -denominator);
+
+ clear_generators_up_to_date();
+ clear_congruences_minimized();
+ }
+ assert(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Variable var,
+ 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)", "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 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)",
+ "v", var);
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ affine_image(var, expr, denominator);
+
+ if (modulus == 0)
+ return;
+
+ // Modulate dimension `var' according to `modulus'.
+
+ 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();
+
+ assert(OK());
+}
+
+void PPL::Grid::
+generalized_affine_preimage(const Variable var,
+ 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, 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, 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, e, d, m)",
+ "v", var);
+
+ // 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.
+ Coefficient_traits::const_reference var_coefficient = expr.coefficient(var);
+ if (var_space_dim <= expr_space_dim && var_coefficient != 0) {
+ Linear_Expression inverse_expr
+ = expr - (denominator + var_coefficient) * var;
+ Coefficient inverse_denominator = - var_coefficient;
+ if (modulus < 0)
+ generalized_affine_image(var, inverse_expr, inverse_denominator,
+ - modulus);
+ else
+ generalized_affine_image(var, 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.
+ if (modulus < 0)
+ add_congruence((denominator*var %= expr) / denominator /= - modulus);
+ else
+ add_congruence((denominator*var %= expr) / denominator /= modulus);
+
+ // If the resulting grid is empty, its preimage is empty too.
+ // Note: DO check for emptyness here, as we will later add a line.
+ if (is_empty())
+ return;
+ add_generator(grid_line(var));
+ assert(OK());
+}
+
+void
+PPL::Grid::
+generalized_affine_image(const Linear_Expression& lhs,
+ 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)",
+ "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)",
+ "e2", rhs);
+
+ // Any image of an empty grid is empty.
+ if (marked_empty())
+ return;
+
+ TEMP_INTEGER(mod);
+ if (modulus < 0)
+ mod = -modulus;
+ else
+ mod = modulus;
+
+ // Compute the actual space dimension of `lhs',
+ // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+ do {
+ if (lhs_space_dim == 0) {
+ // All variables have zero coefficients, so `lhs' is a constant.
+ add_congruence((lhs %= rhs) / mod);
+ return;
+ }
+ }
+ while (lhs.coefficient(Variable(--lhs_space_dim)) == 0);
+
+ // Gather in `new_lines' the collections of all the lines having the
+ // direction of variables occurring in `lhs'. While at it, check
+ // whether there exists a variable occurring in both `lhs' and
+ // `rhs'.
+ Grid_Generator_System new_lines;
+ bool lhs_vars_intersect_rhs_vars = false;
+ for (dimension_type i = lhs_space_dim + 1; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0) {
+ new_lines.insert(Grid_Generator::line(Variable(i)));
+ if (rhs.coefficient(Variable(i)) != 0)
+ lhs_vars_intersect_rhs_vars = true;
+ }
+
+ if (lhs_vars_intersect_rhs_vars) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, add an additional dimension.
+ const Variable new_var = Variable(space_dim);
+ add_space_dimensions_and_embed(1);
+
+ // Constrain the new dimension to be equal to the right hand side.
+ // TODO: Use add_congruence_and_minimize() when it has been updated.
+ Congruence_System new_cgs1(new_var == rhs);
+ if (add_recycled_congruences_and_minimize(new_cgs1)) {
+ // The grid still contains points.
+
+ // Cylindrificate on all the variables occurring in the left
+ // hand side expression.
+
+ // Ajust `new_lines' to the right dimension.
+ new_lines.insert(parameter(0*Variable(space_dim-1)));
+ // Add the lines to `gen_sys'.
+ gen_sys.recycling_insert(new_lines);
+ 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 `mod'.
+ // TODO: Use add_congruence() when it has been updated.
+ Congruence_System new_cgs2((lhs %= new_var) / mod);
+ 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;
+
+ // Cylindrificate on all the variables occurring in the left hand
+ // side expression.
+ add_recycled_generators(new_lines);
+
+ // Constrain the left hand side expression so that it is congruent to
+ // the right hand side expression modulo `mod'.
+ add_congruence((lhs %= rhs) / mod);
+ }
+
+ assert(OK());
+}
+
+void PPL::Grid::
+generalized_affine_preimage(const Linear_Expression& lhs,
+ 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, 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, e2, m)",
+ "e2", rhs);
+
+ // Any preimage of an empty polyhedron is empty.
+ if (marked_empty())
+ return;
+
+ TEMP_INTEGER(mod);
+ if (modulus < 0)
+ mod = -modulus;
+ else
+ mod = modulus;
+
+ // Compute the actual space dimension of `lhs',
+ // i.e., the highest dimension having a non-zero coefficient in `lhs'.
+ do {
+ 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((lhs %= rhs) / mod);
+ return;
+ }
+ }
+ while (lhs.coefficient(Variable(--lhs_space_dim)) == 0);
+
+ // 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'.
+ Grid_Generator_System new_lines;
+ bool lhs_vars_intersect_rhs_vars = false;
+ for (dimension_type i = lhs_space_dim + 1; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0) {
+ new_lines.insert(Grid_Generator::line(Variable(i)));
+ if (rhs.coefficient(Variable(i)) != 0)
+ lhs_vars_intersect_rhs_vars = true;
+ }
+
+ if (lhs_vars_intersect_rhs_vars) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, add an additional dimension.
+ const Variable new_var = Variable(space_dim);
+ add_space_dimensions_and_embed(1);
+
+ // Constrain the new dimension to be equal to `lhs'
+ // TODO: Use add_congruence_and_minimize() when it has been updated.
+ Congruence_System new_cgs1(new_var == lhs);
+ if (add_recycled_congruences_and_minimize(new_cgs1)) {
+ // The grid still contains points.
+
+ // Cylindrificate on all the variables occurring in the left
+ // hand side
+
+ // Ajust `new_lines' to the right dimension.
+ new_lines.insert(parameter(0*Variable(space_dim-1)));
+ // Add the lines to `gen_sys'.
+ gen_sys.recycling_insert(new_lines);
+ 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 `mod'.
+ // TODO: Use add_congruence() when it has been updated.
+ Congruence_System new_cgs2((rhs %= new_var) / mod);
+ 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((lhs %= rhs) / mod);
+
+ // Any image of an empty grid is empty.
+ if (is_empty())
+ return;
+
+ // FIXME: Confirm that it is OK for this to follow the
+ // add_congruence, whereas in the branch above (and in
+ // affine_image, and in Polyhedron) it comes first.
+ // Cylindrificate on all the variables occurring in `lhs'.
+ add_recycled_generators(new_lines);
+ }
+ 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;
+ dimension_type gs_num_rows = gs.num_generators();
+
+ normalize_divisors(gs, gen_sys);
+
+ for (dimension_type i = gs_num_rows; i-- > 0; ) {
+ Grid_Generator& g = gs[i];
+ if (g.is_point()) {
+ // Transform the point into a parameter.
+ TEMP_INTEGER(div);
+ div = g.divisor();
+ g.divisor() = 0;
+ g.divisor() = div;
+ }
+ }
+
+ 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.recycling_insert(gs);
+
+ x.clear_congruences_up_to_date();
+ x.clear_generators_minimized();
+
+ assert(x.OK(true) && y.OK(true));
+}
+
+/*! \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;
+ return !z.intersection_assign_and_minimize(y);
+}
+
+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) {
+ if (str == "(up-to-date)")
+ set_congruences_up_to_date();
+ else if (str != "(not_up-to-date)")
+ return false;
+ }
+ else
+ return false;
+
+ if (!con_sys.ascii_load(s))
+ return false;
+
+ if (!(s >> str) || str != "gen_sys")
+ return false;
+
+ if (s >> str) {
+ if (str == "(up-to-date)")
+ set_generators_up_to_date();
+ else if (str != "(not_up-to-date)")
+ return false;
+ }
+ else
+ 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 for well-formedness.
+ 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();
+}
+
+/*! \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..66a2cbe
--- /dev/null
+++ b/src/Grid_simplify.cc
@@ -0,0 +1,660 @@
+/* Grid class implementation: simplify().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include <cassert>
+
+#include "Grid.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+#define TRACE(x)
+//#define TRACE(x) x
+
+TRACE(using std::endl);
+TRACE(using std::cerr);
+
+#ifdef STRONG_REDUCTION
+template <typename M, typename R>
+void
+Grid::reduce_reduced(M& sys, dimension_type dim, dimension_type pivot_index,
+ dimension_type start, dimension_type end,
+ Dimension_Kinds& dim_kinds, bool generators) {
+ R& pivot = sys[pivot_index];
+
+ TEMP_INTEGER(pivot_dim);
+ pivot_dim = pivot[dim];
+
+ if (pivot_dim == 0)
+ return;
+
+ TEMP_INTEGER(pivot_dim_half);
+ pivot_dim_half = (pivot_dim + 1) / 2;
+ Dimension_Kind row_kind = dim_kinds[dim];
+ Dimension_Kind line_or_equality, virtual_kind;
+ int jump;
+ if (generators) {
+ line_or_equality = LINE;
+ virtual_kind = GEN_VIRTUAL;
+ jump = -1;
+ } else {
+ line_or_equality = EQUALITY;
+ virtual_kind = CON_VIRTUAL;
+ jump = 1;
+ }
+
+ for (dimension_type row_index = pivot_index, kinds_index = dim + jump;
+ row_index-- > 0;
+ kinds_index += jump) {
+ // Move over any virtual rows.
+ while (dim_kinds[kinds_index] == virtual_kind)
+ kinds_index += jump;
+
+ if (row_kind == line_or_equality
+ || (row_kind == PARAMETER // a.k.a. CONGRUENCE
+ && dim_kinds[kinds_index] == PARAMETER)) {
+ R& row = sys[row_index];
+
+ TEMP_INTEGER(row_dim);
+ row_dim = row[dim];
+ // num_rows_to_subtract may be positive or negative.
+ TEMP_INTEGER(num_rows_to_subtract);
+ 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 strong reduction -5 < row_dim <= 5.
+ Coefficient& row_dim_rem = row_dim;
+ row_dim_rem %= pivot_dim;
+ if (row_dim_rem < 0) {
+ if (row_dim_rem <= -pivot_dim_half)
+ --num_rows_to_subtract;
+ }
+ else if (row_dim_rem > 0 && row_dim_rem > 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)
+ for (dimension_type col = start; col <= end; ++col)
+ row[col] -= num_rows_to_subtract * pivot[col];
+ }
+ }
+}
+#endif // STRONG_REDUCTION
+
+inline void
+Grid::reduce_line_with_line(Grid_Generator& row, Grid_Generator& pivot,
+ dimension_type column) {
+ TRACE(cerr << "reduce_line_with_line" << endl);
+
+ TEMP_INTEGER(gcd);
+ gcd_assign(gcd, pivot[column], row[column]);
+ // Store the reduced ratio between pivot[column] and row[column].
+ TEMP_INTEGER(red_pivot_col);
+ TEMP_INTEGER(red_row_col);
+ red_pivot_col = pivot[column] / gcd;
+ red_row_col = row[column] / gcd;
+ // Multiply row, then subtract from it a multiple of pivot such that
+ // the result in row[column] is zero.
+ row[column] = 0;
+ for (dimension_type col = pivot.size() - 2 /* parameter divisor, index */;
+ col > column;
+ --col)
+ row[col] = (red_pivot_col * row[col]) - (red_row_col * pivot[col]);
+}
+
+inline void
+Grid::reduce_equality_with_equality(Congruence& row, Congruence& pivot,
+ dimension_type column) {
+ TRACE(cerr << "reduce_equality_with_equality" << endl);
+ // Assume two equalities.
+ assert(row.modulus() == 0 && pivot.modulus() == 0);
+
+ TEMP_INTEGER(gcd);
+ gcd_assign(gcd, pivot[column], row[column]);
+ // Store the reduced ratio between pivot[column] and row[column].
+ TEMP_INTEGER(red_pivot_col);
+ TEMP_INTEGER(red_row_col);
+ red_pivot_col = pivot[column] / gcd;
+ red_row_col = row[column] / gcd;
+ // Multiply row, then subtract from it a multiple of pivot such that
+ // the result in row[column] is zero.
+ row[column] = 0;
+ for (dimension_type col = 0; col < column; ++col)
+ row[col] = (red_pivot_col * row[col]) - (red_row_col * pivot[col]);
+}
+
+template <typename R>
+void
+Grid::reduce_pc_with_pc(R& row, R& pivot,
+ dimension_type column,
+ dimension_type start,
+ dimension_type end) {
+ TEMP_INTEGER(gcd);
+ TEMP_INTEGER(s);
+ TEMP_INTEGER(t);
+ gcdext_assign(gcd, pivot[column], row[column], s, t);
+ // Now pivot[column] * s + row[column] * t == gcd.
+ TRACE(cerr << " gcd " << gcd << ", s " << s << ", t " << t << endl);
+
+ // Store the reduced ratio between pivot[column] and row[column].
+ TEMP_INTEGER(red_pivot_col);
+ TEMP_INTEGER(red_row_col);
+ red_pivot_col = pivot[column] / gcd;
+ red_row_col = row[column] / gcd;
+ TRACE(cerr << " red_pivot_col " << red_pivot_col
+ << ", red_row_col " << red_row_col << endl);
+
+ // Multiply row, then subtract from it a multiple of pivot such that
+ // the result in row[column] is zero. Afterwards, 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.
+ assert(pivot.size() > 0);
+ assert(row.size() > 0);
+ pivot[column] = gcd;
+ row[column] = 0;
+ for (dimension_type col = start; col < end; ++col) {
+ TEMP_INTEGER(pivot_col);
+ TEMP_INTEGER(row_col);
+ pivot_col = pivot[col];
+ row_col = row[col];
+ pivot[col] = (s * pivot_col) + (t * row_col);
+ row[col] = (red_pivot_col * row_col) - (red_row_col * pivot_col);
+ }
+}
+
+void
+Grid::reduce_parameter_with_line(Grid_Generator& row,
+ Grid_Generator& pivot,
+ dimension_type column,
+ Grid_Generator_System& sys) {
+ // Very similar to reduce_congruence_with_equality below. Any
+ // change here may be needed there too.
+ TRACE(cerr << "reduce_parameter_with_line" << endl);
+
+ dimension_type num_cols = sys.num_columns() - 1 /* parameter divisor */;
+
+ // If the elements at column in row and pivot are the same, then
+ // just subtract pivot from row.
+ if (row[column] == pivot[column]) {
+ for (dimension_type col = 0; col < num_cols; ++col)
+ row[col] -= pivot[col];
+ return;
+ }
+
+ TEMP_INTEGER(gcd);
+ gcd_assign(gcd, pivot[column], row[column]);
+ // Store the reduced ratio between pivot[column] and row[column].
+ TEMP_INTEGER(red_pivot_col);
+ TEMP_INTEGER(red_row_col);
+ red_pivot_col = pivot[column] / gcd;
+ red_row_col = row[column] / gcd;
+
+ // 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.
+#ifdef STRONG_REDUCTION
+ // 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 (red_pivot_col < 0) {
+ neg_assign(red_pivot_col);
+ neg_assign(red_row_col);
+ }
+#endif
+ for (dimension_type index = 0; index < sys.num_generators(); ++index) {
+ Grid_Generator& row = sys[index];
+ if (row.is_parameter_or_point())
+ for (dimension_type col = 0; col < num_cols; ++col)
+ row[col] *= red_pivot_col;
+ }
+ // Subtract from row a multiple of pivot such that the result in
+ // row[column] is zero.
+ row[column] = 0;
+ for (dimension_type col = num_cols - 1; col > column; --col)
+ row[col] -= red_row_col * pivot[col];
+}
+
+void
+Grid::reduce_congruence_with_equality(Congruence& row,
+ Congruence& pivot,
+ dimension_type column,
+ Congruence_System& sys) {
+ // Very similar to reduce_parameter_with_line above. Any change
+ // here may be needed there too.
+ TRACE(cerr << "reduce_congruence_with_equality" << endl);
+ assert(row.modulus() > 0 && pivot.modulus() == 0);
+
+ dimension_type num_cols = sys.num_columns();
+
+ // If the elements at `column' in row and pivot are the same, then
+ // just subtract `pivot' from `row'.
+ if (row[column] == pivot[column]) {
+ for (dimension_type col = 0; col < num_cols; ++col)
+ row[col] -= pivot[col];
+ return;
+ }
+
+ TEMP_INTEGER(gcd);
+ gcd_assign(gcd, pivot[column], row[column]);
+ TEMP_INTEGER(red_pivot_col);
+ TEMP_INTEGER(red_row_a);
+ red_pivot_col = pivot[column] / gcd;
+ red_row_a = row[column] / gcd;
+ // Ensure that `red_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 (red_pivot_col < 0) {
+ neg_assign(red_pivot_col);
+ neg_assign(red_row_a);
+ }
+ // Multiply `row', including the modulus, by red_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 = 0; index < sys.num_rows(); ++index) {
+ Congruence& row = sys[index];
+ if (row.is_proper_congruence())
+ for (dimension_type col = 0; col < num_cols; ++col)
+ row[col] *= red_pivot_col;
+ }
+ --num_cols; // Modulus.
+ row[column] = 0;
+ // Subtract from row a multiple of pivot such that the result in
+ // row[column] is zero.
+ for (dimension_type col = 0; col < column; ++col)
+ row[col] -= red_row_a * pivot[col];
+}
+
+#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) {
+ R& row = system[first++];
+ for (dimension_type col = 0; col < row_size; ++col)
+ if (row[col] != 0)
+ return false;
+ }
+ return true;
+}
+#endif
+
+void
+Grid::simplify(Grid_Generator_System& sys, Dimension_Kinds& dim_kinds) {
+ TRACE(cerr << "==== simplify (reduce) gs:" << endl);
+ TRACE(cerr << "sys:" << endl);
+ TRACE(sys.ascii_dump(cerr));
+ assert(sys.num_generators() > 0);
+ assert(sys.num_columns() > 0); // For reduce_pc_with_pc.
+
+ // Changes here may also be required in the congruence version
+ // below.
+
+ dimension_type num_cols = sys.num_columns() - 1 /* parameter divisor */;
+
+ if (dim_kinds.size() != num_cols)
+ dim_kinds.resize(num_cols);
+
+ dimension_type num_rows = sys.num_generators();
+ TRACE(cerr << " num_rows " << num_rows << endl);
+
+ // 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_cols; ++dim) {
+ TRACE(cerr << "dim " << dim << endl);
+ trace_dim_kinds(" ", dim_kinds);
+
+ // Consider the pivot and following rows.
+ dimension_type row_index = pivot_index;
+ TRACE(cerr << " row_index " << row_index << endl);
+
+ // Move down over rows which have zero in column `dim'.
+ while (row_index < num_rows && sys[row_index][dim] == 0) {
+ TRACE(cerr << " .");
+ ++row_index;
+ }
+ TRACE(cerr << endl);
+
+ if (row_index == num_rows) {
+ // Element in column `dim' is zero in all rows from the pivot.
+ TRACE(cerr << " Marking virtual row" << endl);
+ dim_kinds[dim] = GEN_VIRTUAL;
+ }
+ else {
+ if (row_index != pivot_index)
+ std::swap(sys[row_index], sys[pivot_index]);
+ Grid_Generator& pivot = sys[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.
+ TRACE(cerr << " Reducing all following rows" << endl);
+ while (row_index < num_rows - 1) {
+ ++row_index;
+ TRACE(cerr << " row_index " << row_index << endl);
+
+ Grid_Generator& row = sys[row_index];
+
+ if (row[dim] == 0)
+ continue;
+
+ if (row.is_line())
+ if (pivot_is_line)
+ reduce_line_with_line(row, pivot, dim);
+ else {
+ assert(pivot.is_parameter_or_point());
+ std::swap(row, pivot);
+ pivot_is_line = true;
+ reduce_parameter_with_line(row, pivot, dim, sys);
+ }
+ else {
+ assert(row.is_parameter_or_point());
+ if (pivot_is_line)
+ reduce_parameter_with_line(row, pivot, dim, sys);
+ else {
+ assert(pivot.is_parameter_or_point());
+ reduce_pc_with_pc(row, pivot, dim, dim + 1, num_cols);
+ }
+ }
+ }
+
+ if (pivot_is_line)
+ dim_kinds[dim] = LINE;
+ else {
+ assert(pivot.is_parameter_or_point());
+ dim_kinds[dim] = PARAMETER;
+ }
+
+#ifdef STRONG_REDUCTION
+ // Ensure a positive follows the leading zeros.
+ if (pivot[dim] < 0)
+ pivot.negate(dim, num_cols - 1);
+ TRACE(cerr << " rr pivot_index " << pivot_index << endl);
+ TRACE(sys.ascii_dump(cerr));
+ // Factor this row out of the preceding rows.
+ reduce_reduced<Grid_Generator_System, Grid_Generator>
+ (sys, dim, pivot_index, dim, num_cols - 1, dim_kinds);
+#endif
+
+ ++pivot_index;
+ }
+ TRACE(sys.ascii_dump(cerr));
+ }
+ trace_dim_kinds("gs simpl end ", dim_kinds);
+
+ // Clip any zero rows from the end of the matrix.
+ if (num_rows > pivot_index) {
+ TRACE(cerr << "clipping trailing" << endl);
+#ifndef NDEBUG
+ bool ret = rows_are_zero<Grid_Generator_System,Grid_Generator>
+ (sys,
+ pivot_index, // index of first
+ sys.num_generators() - 1, // index of last
+ sys.num_columns() - 1); // row size
+ assert(ret == true);
+#endif
+ sys.erase_to_end(pivot_index);
+ }
+
+ sys.unset_pending_rows();
+
+ // Ensure that the parameter divisors are the same as the system
+ // divisor.
+ TRACE(cerr << "updating param divisors" << endl);
+ Coefficient_traits::const_reference system_divisor = sys[0][0];
+ for (dimension_type row = 1, dim = 1, num_cols = sys.num_columns() - 1;
+ dim < num_cols;
+ ++dim)
+ switch (dim_kinds[dim]) {
+ case PARAMETER:
+ sys[row].divisor() = system_divisor;
+ case LINE:
+ ++row;
+ case GEN_VIRTUAL:
+ break;
+ }
+
+ assert(sys.OK());
+
+ TRACE(cerr << "---- simplify (reduce) gs done." << endl);
+}
+
+bool
+Grid::simplify(Congruence_System& sys, Dimension_Kinds& dim_kinds) {
+ TRACE(cerr << "======== simplify (reduce) cgs:" << endl);
+ TRACE(cerr << "sys:" << endl);
+ TRACE(sys.ascii_dump(cerr));
+ assert(sys.num_columns() > 2);
+
+ // Changes here may also be required in the generator version above.
+
+ // TODO: Consider normalizing the moduli only when congruences are
+ // added to con_sys.
+ sys.normalize_moduli();
+
+ dimension_type num_cols = sys.num_columns() - 1 /* modulus */;
+
+ if (dim_kinds.size() != num_cols)
+ dim_kinds.resize(num_cols);
+
+ dimension_type num_rows = sys.num_rows();
+ TRACE(cerr << " num_rows " << num_rows << endl);
+
+ // 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_cols; dim-- > 0; ) {
+ TRACE(cerr << "dim " << dim << endl);
+ trace_dim_kinds(" ", dim_kinds);
+
+ // Consider the pivot and following rows.
+ dimension_type row_index = pivot_index;
+ TRACE(cerr << " row_index " << row_index << endl);
+
+ // Move down over rows which have zero in column `dim'.
+ while (row_index < num_rows && sys[row_index][dim] == 0) {
+ TRACE(cerr << " .");
+ ++row_index;
+ }
+ TRACE(cerr << endl);
+
+ if (row_index == num_rows) {
+ // Element in column `dim' is zero in all rows from the pivot,
+ // or `sys' is empty of rows.
+ TRACE(cerr << " Marking virtual row" << endl);
+ dim_kinds[dim] = CON_VIRTUAL;
+ }
+ else {
+ // row_index != num_rows
+ if (row_index != pivot_index)
+ std::swap(sys[row_index], sys[pivot_index]);
+ Congruence& pivot = sys[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.
+ TRACE(cerr << " Reducing all following rows" << endl);
+ while (row_index < num_rows - 1) {
+ ++row_index;
+ TRACE(cerr << " row_index " << row_index << endl);
+
+ Congruence& row = sys[row_index];
+
+ if (row[dim] == 0)
+ continue;
+
+ if (row.is_equality())
+ if (pivot_is_equality)
+ reduce_equality_with_equality(row, pivot, dim);
+ else {
+ assert(pivot.is_proper_congruence());
+ std::swap(row, pivot);
+ pivot_is_equality = true;
+ reduce_congruence_with_equality(row, pivot, dim, sys);
+ }
+ else {
+ assert(row.is_proper_congruence());
+ if (pivot_is_equality)
+ reduce_congruence_with_equality(row, pivot, dim, sys);
+ else {
+ assert(pivot.is_proper_congruence());
+ reduce_pc_with_pc(row, pivot, dim, 0, dim);
+ }
+ }
+ }
+
+ if (pivot_is_equality)
+ dim_kinds[dim] = EQUALITY;
+ else {
+ assert(pivot.is_proper_congruence());
+ dim_kinds[dim] = PROPER_CONGRUENCE;
+ }
+
+#ifdef STRONG_REDUCTION
+ // Ensure a positive follows the leading zeros.
+ if (pivot[dim] < 0)
+ pivot.negate(0, dim);
+ // Factor this row out of the preceding ones.
+ reduce_reduced<Congruence_System, Congruence>
+ (sys, dim, pivot_index, 0, dim, dim_kinds, false);
+#endif
+ ++pivot_index;
+ }
+ TRACE(sys.ascii_dump(cerr));
+ } // end for (dimension_type dim = num_cols; dim-- > 0; )
+
+ dimension_type& reduced_num_rows = pivot_index; // For clearer naming.
+
+ // Clip any zero rows from the end of the matrix.
+ if (num_rows > 1 && num_rows > reduced_num_rows) {
+ TRACE(cerr << "clipping trailing" << endl);
+#ifndef NDEBUG
+ bool ret = rows_are_zero<Congruence_System,Congruence>
+ (sys,
+ reduced_num_rows, // index of first
+ num_rows - 1, // index of last
+ num_cols); // row size
+ assert(ret == true);
+#endif
+ // Don't erase the last row as this will be changed to the integrality row.
+ // FIXME Simplify and improve code if possible.
+ if (reduced_num_rows > 0)
+ sys.erase_to_end(reduced_num_rows);
+ else
+ sys.erase_to_end(1);
+ }
+
+ assert(sys.num_rows() == reduced_num_rows
+ || (sys.num_rows() == 1 && reduced_num_rows == 0));
+
+ if (reduced_num_rows > 0) {
+ // If the last row is false then make it the equality 1 = 0, and
+ // make it the only row.
+ Congruence& last_row = sys[reduced_num_rows - 1];
+ if (dim_kinds[0] == PROPER_CONGRUENCE) {
+ if (last_row.inhomogeneous_term() % last_row.modulus() != 0) {
+ // The last row is a false proper congruence.
+ last_row.set_is_equality();
+ dim_kinds[0] = EQUALITY;
+ goto return_empty;
+ }
+ }
+ else if (dim_kinds[0] == 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.
+ return_empty:
+ last_row[0] = 1;
+ dim_kinds.resize(1);
+ std::swap(sys.rows[0], sys.rows.back());
+ sys.erase_to_end(1);
+
+ trace_dim_kinds("cgs simpl end ", dim_kinds);
+ assert(sys.OK());
+ TRACE(cerr << "---- simplify (reduce) cgs done (empty)." << endl);
+ return true;
+ }
+ }
+ else if (num_rows > 0) {
+ assert(sys.num_rows() == 1);
+ // All columns up to the modulus column must have been zero, set
+ // up the integrality congruence.
+ dim_kinds[0] = PROPER_CONGRUENCE;
+ sys[0][num_cols] = 1;
+ reduced_num_rows = 1;
+ }
+
+ // Ensure that the last row is the integrality congruence.
+ dimension_type mod_index = num_cols;
+ if (dim_kinds[0] == CON_VIRTUAL) {
+ // The last row is virtual, append the integrality congruence.
+ dim_kinds[0] = PROPER_CONGRUENCE;
+ sys.add_zero_rows(1, Linear_Row::Flags(NECESSARILY_CLOSED,
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ Congruence& new_last_row = sys[reduced_num_rows];
+ new_last_row[mod_index] = 1;
+ // Try use an existing modulus.
+ dimension_type row_index = reduced_num_rows;
+ while (row_index-- > 0) {
+ Congruence& row = sys[row_index];
+ if (row[mod_index] > 0) {
+ new_last_row[mod_index] = row[mod_index];
+ break;
+ }
+ }
+ new_last_row[0] = new_last_row[mod_index];
+#ifdef STRONG_REDUCTION
+ ++reduced_num_rows;
+#endif
+ }
+ else {
+ Congruence& last_row = sys[reduced_num_rows - 1];
+ last_row[0] = last_row[mod_index];
+ }
+
+#ifdef STRONG_REDUCTION
+ // Factor the modified integrality congruence out of the other rows.
+ reduce_reduced<Congruence_System, Congruence>
+ (sys, 0, reduced_num_rows - 1, 0, 0, dim_kinds, false);
+#endif
+
+ trace_dim_kinds("cgs simpl end ", dim_kinds);
+ assert(sys.OK());
+ TRACE(cerr << "---- simplify (reduce) cgs done." << endl);
+ return false;
+}
+
+#undef TRACE
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/Grid_widenings.cc b/src/Grid_widenings.cc
new file mode 100644
index 0000000..4635c42
--- /dev/null
+++ b/src/Grid_widenings.cc
@@ -0,0 +1,226 @@
+/* Grid class implementation
+ (non-inline widening-related member functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Grid.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Grid::select_wider_congruences(const Grid& y,
+ Congruence_System& cgs_selected) const {
+ // Private method: the caller must ensure the following conditions
+ // (beside the inclusion `y <= x').
+ assert(space_dim == y.space_dim);
+ assert(!marked_empty());
+ assert(!y.marked_empty());
+ assert(congruences_are_minimized());
+ 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) {
+ 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(dim, y_cg))
+ // The leading diagonal entries are equal.
+ cgs_selected.insert(cg);
+ ++x_row;
+ ++y_row;
+ }
+ break;
+ case EQUALITY:
+ cgs_selected.insert(con_sys[x_row]);
+ ++x_row;
+ ++y_row;
+ break;
+ case CON_VIRTUAL:
+ y.dim_kinds[dim] == CON_VIRTUAL || ++y_row;
+ break;
+ }
+ }
+}
+
+void
+PPL::Grid::widening_assign(const Grid& const_y, unsigned* tp) {
+ Grid& x = *this;
+ Grid& y = const_cast<Grid&>(const_y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("widening_assign(y)", "y", y);
+
+ // As noted in definitions.dox, stable behaviour is only garaunteed
+ // if y is contained in or equal to x.
+#ifndef NDEBUG
+ {
+ // Assume y is contained in or equal to x.
+ const Grid x_copy = x;
+ const Grid y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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.
+ if (y.congruences_are_up_to_date()) {
+ if (!y.congruences_are_minimized()) {
+ if (simplify(y.con_sys, y.dim_kinds)) {
+ // `y' is empty.
+ y.set_empty();
+ return;
+ }
+ y.set_congruences_minimized();
+ }
+ }
+ else
+ y.update_congruences();
+
+ if (con_sys.num_equalities() < y.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(y, 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 && *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.
+ std::swap(x, result);
+
+ assert(x.OK(true));
+}
+
+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);
+
+ 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;
+ }
+
+#ifndef NDEBUG
+ {
+ // Assume that y is contained in or equal to x.
+ const Grid x_copy = x;
+ const Grid y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ 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_congruences(new_cgs);
+ }
+ else
+ // There are tokens, so widening will leave the grid the same.
+ x.widening_assign(y, tp);
+
+ assert(OK());
+}
diff --git a/src/H79_Certificate.cc b/src/H79_Certificate.cc
new file mode 100644
index 0000000..c8841d2
--- /dev/null
+++ b/src/H79_Certificate.cc
@@ -0,0 +1,119 @@
+/* H79_Certificate class implementation
+ (non-inline member functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "H79_Certificate.defs.hh"
+
+#include "Polyhedron.defs.hh"
+#include <cassert>
+#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.
+ 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.
+ 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.
+ 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..650f8e3
--- /dev/null
+++ b/src/H79_Certificate.defs.hh
@@ -0,0 +1,97 @@
+/* H79_Certificate class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 <cassert>
+#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..5d951f7
--- /dev/null
+++ b/src/H79_Certificate.inlines.hh
@@ -0,0 +1,70 @@
+/* H79_Certificate class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..d7ea746
--- /dev/null
+++ b/src/H79_Certificate.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Init.cc b/src/Init.cc
new file mode 100644
index 0000000..bbbc410
--- /dev/null
+++ b/src/Init.cc
@@ -0,0 +1,71 @@
+/* Init class implementation (non-inline functions and static variables).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Init.defs.hh"
+#include "Variable.defs.hh"
+#include "fpu.defs.hh"
+#include "checked.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+unsigned int PPL::Init::count = 0;
+
+PPL::fpu_rounding_direction_type PPL::Init::old_rounding_direction;
+
+extern "C" void
+set_GMP_memory_allocation_functions(void)
+#if CXX_SUPPORTS_ATTRIBUTE_WEAK
+ __attribute__((weak));
+
+void
+set_GMP_memory_allocation_functions(void) {
+}
+#else
+ ;
+#endif
+
+PPL::Init::Init() {
+ // Only when the first Init object is constructed...
+ if (count++ == 0) {
+ // ... the GMP memory allocation functions are set, ...
+ set_GMP_memory_allocation_functions();
+ // ... and the default output function for Variable objects is set.
+ Variable::set_output_function(Variable::default_output_function);
+#if PPL_CAN_CONTROL_FPU
+ old_rounding_direction = fpu_get_rounding_direction();
+ fpu_set_rounding_direction(ROUND_DIRECT);
+#endif
+ // FIXME: is 3200 a magic number?
+ set_rational_sqrt_precision_parameter(3200);
+ }
+}
+
+PPL::Init::~Init() {
+ // Only when the last Init object is destroyed...
+ if (--count == 0) {
+#if PPL_CAN_CONTROL_FPU
+ fpu_set_rounding_direction(old_rounding_direction);
+#endif
+ }
+}
diff --git a/src/Init.defs.hh b/src/Init.defs.hh
new file mode 100644
index 0000000..16b3fb5
--- /dev/null
+++ b/src/Init.defs.hh
@@ -0,0 +1,57 @@
+/* Init class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Init_defs_hh
+#define PPL_Init_defs_hh 1
+
+#include "Init.types.hh"
+#include "fpu.types.hh"
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Init {
+private:
+ //! Count the number of objects created.
+ static unsigned int count;
+ static fpu_rounding_direction_type old_rounding_direction;
+
+public:
+ //! Initializes the PPL.
+ Init();
+
+ //! Finalizes the PPL.
+ ~Init();
+};
+
+#endif // !defined(PPL_Init_defs_hh)
diff --git a/src/Init.types.hh b/src/Init.types.hh
new file mode 100644
index 0000000..e44df35
--- /dev/null
+++ b/src/Init.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Interval.cc b/src/Interval.cc
new file mode 100644
index 0000000..73e4e1c
--- /dev/null
+++ b/src/Interval.cc
@@ -0,0 +1,55 @@
+/* Non-inline functions for the Interval class and its constituents.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Interval.defs.hh"
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+bool
+PPL::LBoundary::OK() const {
+ if (flag != POS && flag != ZERO) {
+#ifndef NDEBUG
+ std::cerr << "Invalid flag in LBoundary: " << flag << std::endl;
+#endif
+ return false;
+ }
+ return true;
+}
+
+bool
+PPL::UBoundary::OK() const {
+ if (flag != NEG && flag != ZERO) {
+#ifndef NDEBUG
+ std::cerr << "Invalid flag in UBoundary: " << flag << std::endl;
+#endif
+ return false;
+ }
+ return true;
+}
+
+bool
+PPL::Interval::OK() const {
+ return lower.OK() && upper.OK();
+}
diff --git a/src/Interval.defs.hh b/src/Interval.defs.hh
new file mode 100644
index 0000000..952e693
--- /dev/null
+++ b/src/Interval.defs.hh
@@ -0,0 +1,204 @@
+/* Declarations for the Interval class and its constituents.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_defs_hh
+#define PPL_Interval_defs_hh 1
+
+#include "Interval.types.hh"
+#include "Coefficient.defs.hh"
+#include "Checked_Number.defs.hh"
+#include <gmpxx.h>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+typedef Checked_Number<mpq_class, Extended_Number_Policy> ERational;
+
+}
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is less than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator<(const Boundary& x, const Boundary& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is greater than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator>(const Boundary& x, const Boundary& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An extended rational bound of an interval.
+/*! \ingroup PPL_CXX_interface
+ An object of class Boundary represents either an upper or a lower
+ bound of an interval over the set of extended rational numbers.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Boundary {
+protected:
+ //! Kinds of bounds.
+ enum Flag {
+ //! An open upper bound.
+ NEG = -1,
+ //! A closed (lower or upper) bound.
+ ZERO = 0,
+ //! An open lower bound.
+ POS = 1
+ };
+
+ //! The extended rational value of the bound.
+ ERational value;
+ //! The kind of the bound.
+ Flag flag;
+
+ //! Builds a bound of kind \p f and having value \p v.
+ Boundary(const ERational& v, Flag f);
+
+ friend bool
+ Parma_Polyhedra_Library::operator<(const Boundary& x, const Boundary& y);
+ friend bool
+ Parma_Polyhedra_Library::operator>(const Boundary& x, const Boundary& y);
+
+public:
+ //! Returns <CODE>true</CODE> if and only if \p *this is a closed bound.
+ bool is_closed() const;
+
+ //! Returns a const reference to the value of the bound.
+ const ERational& bound() const;
+
+ //! Returns a reference to the value of the bound.
+ ERational& bound();
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The lower bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::LBoundary : public Boundary {
+public:
+ //! Kinds of lower bounds.
+ enum Open_Closed {
+ //! An open lower bound.
+ OPEN = Boundary::POS,
+ //! A closed lower bound.
+ CLOSED = Boundary::ZERO
+ };
+
+ //! Builds a lower bound of kind \p f and having value \p v.
+ LBoundary(const ERational& v, Open_Closed f);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The upper bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::UBoundary : public Boundary {
+public:
+ //! Kinds of upper bounds.
+ enum Open_Closed {
+ //! An open upper bound.
+ OPEN = Boundary::NEG,
+ //! A closed upper bound.
+ CLOSED = Boundary::ZERO
+ };
+
+ //! Builds an upper bound of kind \p f and having value \p v.
+ UBoundary(const ERational& v, Open_Closed f);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A interval over the set of rational numbers.
+/*! \ingroup PPL_CXX_interface
+ An object of class Interval represents a closed/half-closed/open
+ interval over the set of rational numbers \f$\Qset\f$.
+
+ Note that, even though the implementation is capable to represent
+ any interval on the set of <EM>extended</EM> rational numbers,
+ the available public methods only allows for the construction
+ and manipulation of intervals over \f$\Qset\f$.
+ Namely, it is not possible to create a non-empty interval having
+ a <EM>closed</EM> bound whose value is \f$-\infty\f$ or \f$+\infty\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Interval {
+public:
+ //! Constructs the universe interval \f$(-\infty, +\infty) = \Qset\f$.
+ Interval();
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+ bool is_empty() const;
+
+ //! Returns a const reference to the interval's lower bound.
+ const LBoundary& lower_bound() const;
+
+ //! Returns a reference to the interval's lower bound.
+ LBoundary& lower_bound();
+
+ //! Returns a const reference to the interval's upper bound.
+ const UBoundary& upper_bound() const;
+
+ //! Returns a reference to the interval's upper bound.
+ UBoundary& upper_bound();
+
+ /*! \brief
+ Raises the interval's lower bound, if \p new_lower is higher
+ than the current one.
+ */
+ void raise_lower_bound(LBoundary new_lower);
+
+ /*! \brief
+ Lowers the interval's upper bound, if \p new_upper is lower
+ than the current one.
+ */
+ void lower_upper_bound(UBoundary new_upper);
+
+ //! Turns \p *this into the empty interval.
+ void set_empty();
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! The interval's lower bound.
+ LBoundary lower;
+
+ //! The interval's upper bound.
+ UBoundary upper;
+};
+
+#include "Interval.inlines.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..d93c3ac
--- /dev/null
+++ b/src/Interval.inlines.hh
@@ -0,0 +1,127 @@
+/* Inline functions for the Interval class and its constituents.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Interval_inlines_hh
+#define PPL_Interval_inlines_hh 1
+
+#include <cassert>
+#include "Checked_Number.defs.hh"
+#include "checked_mpz.inlines.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Boundary::Boundary(const ERational& v, Flag f)
+ : value(v), flag(f) {
+}
+
+inline bool
+Boundary::is_closed() const {
+ return flag == ZERO;
+}
+
+inline const ERational&
+Boundary::bound() const {
+ return value;
+}
+
+inline ERational&
+Boundary::bound() {
+ return value;
+}
+
+inline
+LBoundary::LBoundary(const ERational& v, Open_Closed f)
+ : Boundary(v, f == CLOSED ? ZERO : POS) {
+}
+
+inline
+UBoundary::UBoundary(const ERational& v, Open_Closed f)
+ : Boundary(v, f == CLOSED ? ZERO : NEG) {
+}
+
+/*! \relates Boundary */
+inline bool
+operator<(const Boundary& x, const Boundary& y) {
+ return x.value < y.value ||
+ (x.value == y.value && x.flag < y.flag);
+}
+
+/*! \relates Boundary */
+inline bool
+operator>(const Boundary& x, const Boundary& y) {
+ return y < x;
+}
+
+inline
+Interval::Interval()
+ : lower(ERational(MINUS_INFINITY), LBoundary::OPEN),
+ upper(ERational(PLUS_INFINITY), UBoundary::OPEN) {
+}
+
+inline bool
+Interval::is_empty() const {
+ return lower > upper;
+}
+
+inline const LBoundary&
+Interval::lower_bound() const {
+ return lower;
+}
+
+inline LBoundary&
+Interval::lower_bound() {
+ return lower;
+}
+
+inline const UBoundary&
+Interval::upper_bound() const {
+ return upper;
+}
+
+inline UBoundary&
+Interval::upper_bound() {
+ return upper;
+}
+
+inline void
+Interval::raise_lower_bound(LBoundary new_lower) {
+ if (new_lower > lower)
+ lower = new_lower;
+}
+
+inline void
+Interval::lower_upper_bound(UBoundary new_upper) {
+ if (new_upper < upper)
+ upper = new_upper;
+}
+
+inline void
+Interval::set_empty() {
+ lower = LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN);
+ upper = UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN);
+ assert(is_empty());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_inlines_hh)
diff --git a/src/Interval.types.hh b/src/Interval.types.hh
new file mode 100644
index 0000000..0195f98
--- /dev/null
+++ b/src/Interval.types.hh
@@ -0,0 +1,24 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 {
+
+class Boundary;
+class LBoundary;
+class UBoundary;
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Interval_types_hh)
diff --git a/src/LP_Problem.cc b/src/LP_Problem.cc
new file mode 100644
index 0000000..1576ffb
--- /dev/null
+++ b/src/LP_Problem.cc
@@ -0,0 +1,1035 @@
+/* LP_Problem class implementation: non-inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "LP_Problem.defs.hh"
+#include "globals.types.hh"
+#include "globals.defs.hh"
+#include "Row.defs.hh"
+#include "Matrix.defs.hh"
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Constraint_System.inlines.hh"
+#include "Generator.defs.hh"
+#include <stdexcept>
+#include <sstream>
+#include <map>
+#include <deque>
+#include <set>
+#include <algorithm>
+
+#ifndef PPL_NOISY_SIMPLEX
+#define PPL_NOISY_SIMPLEX 0
+#endif
+
+#ifdef PPL_NOISY_SIMPLEX
+#include <iostream>
+#endif
+
+#ifndef PPL_SIMPLEX_ENABLE_STEEPEST_EDGE
+#define PPL_SIMPLEX_ENABLE_STEEPEST_EDGE 1
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#if PPL_NOISY_SIMPLEX
+namespace {
+
+unsigned long num_iterations = 0;
+
+} // namespace
+#endif // PPL_NOISY_SIMPLEX
+
+PPL::dimension_type
+PPL::LP_Problem::steepest_edge() const {
+ const dimension_type tableau_num_rows = tableau.num_rows();
+ assert(tableau_num_rows == base.size());
+ // The square of the lcm of all the coefficients of variables in base.
+ TEMP_INTEGER(squared_lcm_basis);
+ // The normalization factor for each coefficient in the tableau.
+ std::vector<Coefficient> norm_factor(tableau_num_rows);
+ {
+ // Compute the lcm of all the coefficients of variables in base.
+ TEMP_INTEGER(lcm_basis);
+ lcm_basis = 1;
+ for (dimension_type i = tableau_num_rows; i-- > 0; )
+ lcm_assign(lcm_basis, lcm_basis, tableau[i][base[i]]);
+ // Compute normalization factors.
+ for (dimension_type i = tableau_num_rows; i-- > 0; )
+ exact_div_assign(norm_factor[i], lcm_basis, tableau[i][base[i]]);
+ // Compute the square of `lcm_basis', exploiting the fact that
+ // `lcm_basis' will no longer be needed.
+ lcm_basis *= lcm_basis;
+ std::swap(squared_lcm_basis, lcm_basis);
+ }
+
+ // Defined here to avoid repeated (de-)allocations.
+ TEMP_INTEGER(challenger_num);
+ TEMP_INTEGER(scalar_value);
+ TEMP_INTEGER(challenger_den);
+ TEMP_INTEGER(challenger_value);
+ TEMP_INTEGER(current_value);
+
+ TEMP_INTEGER(current_num);
+ TEMP_INTEGER(current_den);
+ dimension_type entering_index = 0;
+ const int cost_sign = sgn(working_cost[working_cost.size() - 1]);
+ for (dimension_type j = tableau.num_columns() - 1; j-- > 1; ) {
+ const Coefficient& cost_j = working_cost[j];
+ if (sgn(cost_j) == cost_sign) {
+ // We can't compute the (exact) square root of abs(\Delta x_j).
+ // The workaround is to compute the square of `cost[j]'.
+ challenger_num = 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_den = squared_lcm_basis;
+ for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+ const Coefficient& tableau_ij = tableau[i][j];
+ // Note: this test speeds up the GMP computation.
+ if (tableau_ij != 0) {
+ scalar_value = tableau_ij * norm_factor[i];
+ add_mul_assign(challenger_den, scalar_value, scalar_value);
+ }
+ }
+ // Initialization during the first loop.
+ if (entering_index == 0) {
+ std::swap(current_num, challenger_num);
+ std::swap(current_den, challenger_den);
+ entering_index = j;
+ continue;
+ }
+ challenger_value = challenger_num * current_den;
+ current_value = current_num * challenger_den;
+ // Update the values, if the challeger wins.
+ if (challenger_value > current_value) {
+ std::swap(current_num, challenger_num);
+ std::swap(current_den, challenger_den);
+ entering_index = j;
+ }
+ }
+ }
+ return entering_index;
+}
+
+// See pag. 47 of Papadimitriou.
+
+PPL::dimension_type
+PPL::LP_Problem::get_entering_var_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[cost_sign_index]);
+ assert(cost_sign != 0);
+ for (dimension_type i = 1; i < cost_sign_index; ++i)
+ if (sgn(working_cost[i]) == cost_sign)
+ return i;
+ // No variable has to enter the base:
+ // the cost function was optimized.
+ return 0;
+}
+
+void
+PPL::LP_Problem::linear_combine(Row& x,
+ const Row& y,
+ const dimension_type k) {
+ assert(x.size() == y.size());
+ 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.
+ TEMP_INTEGER(normalized_x_k);
+ TEMP_INTEGER(normalized_y_k);
+ normalize2(x[k], y[k], normalized_x_k, normalized_y_k);
+ for (dimension_type i = x.size(); i-- > 0; )
+ if (i != k) {
+ Coefficient& x_i = x[i];
+ x_i *= normalized_y_k;
+ // Note: the test speeds up the GMP computation.
+ const Coefficient& y_i = y[i];
+ if (y_i != 0)
+ sub_mul_assign(x_i, y_i, normalized_x_k);
+ }
+ x[k] = 0;
+ x.normalize();
+}
+
+// See pag 42-43 of Papadimitriou.
+
+void
+PPL::LP_Problem::swap_base(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[entering_var_index] != 0)
+ linear_combine(tableau_i, tableau_out, entering_var_index);
+ }
+ // Linearly combine the cost function.
+ if (working_cost[entering_var_index] != 0)
+ linear_combine(working_cost, tableau_out, entering_var_index);
+ // Adjust the base.
+ base[exiting_base_index] = entering_var_index;
+}
+
+// See pag. 47 + 50 of Papadimitriou.
+
+PPL::dimension_type
+PPL::LP_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[entering_var_index]);
+ if (num_sign != 0 && num_sign == sgn(t_i[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.
+ TEMP_INTEGER(lcm);
+ TEMP_INTEGER(current_min);
+ TEMP_INTEGER(challenger);
+ for (dimension_type i = exiting_base_index + 1; i < tableau_num_rows; ++i) {
+ const Row& t_i = tableau[i];
+ const Coefficient& t_ie = t_i[entering_var_index];
+ const Coefficient& t_ib = t_i[base[i]];
+ const int t_ie_sign = sgn(t_ie);
+ if (t_ie_sign != 0 && t_ie_sign == sgn(t_ib)) {
+ const Row& t_e = tableau[exiting_base_index];
+ const Coefficient& t_ee = t_e[entering_var_index];
+ lcm_assign(lcm, t_ee, t_ie);
+ exact_div_assign(current_min, lcm, t_ee);
+ current_min *= t_e[0];
+ current_min = abs(current_min);
+ exact_div_assign(challenger, lcm, t_ie);
+ challenger *= t_i[0];
+ challenger = abs(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;
+ }
+ }
+ return exiting_base_index;
+}
+
+// See pag 49 of Papadimitriou.
+
+bool
+PPL::LP_Problem::compute_simplex() {
+ 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
+#if PPL_SIMPLEX_ENABLE_STEEPEST_EDGE
+ = steepest_edge();
+#else
+ = get_entering_var_index();
+#endif
+ // 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;
+
+ // We have not reached the optimality or unbounded condition:
+ // compute the new base and the corresponding vertex of the
+ // feasible region.
+ swap_base(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
+ }
+}
+
+// See pag 28 Papadimitriou.
+
+void
+PPL::LP_Problem::prepare_first_phase() {
+ // We negate the row if tableau[i][0] <= 0 to get the inhomogeneous term > 0.
+ // This simplifies the insertion of the slack variables: the value of the
+ // slack variable of every constraint will be 1.
+ const dimension_type tableau_old_n_cols = tableau.num_columns();
+ for (dimension_type i = tableau.num_rows(); i-- > 0 ; ) {
+ Row& tableau_i = tableau[i];
+ if (tableau_i[0] > 0)
+ for (dimension_type j = tableau_old_n_cols; j-- > 0; )
+ neg_assign(tableau_i[j]);
+ }
+
+ // Add the columns for all the slack variables, plus an additional
+ // column for the sign of the cost function, provided we are not going
+ // to exceed the maximum number of allowed columns.
+ if (tableau.max_num_columns() - tableau_old_n_cols <= tableau.num_rows())
+ throw std::length_error("PPL::LP_Problem:\nthe maximum size of an "
+ "internal data structure has been exceeded "
+ "while solving the LP_Problem.");
+ tableau.add_zero_columns(tableau.num_rows() + 1);
+ // Set the working cost function with the right size.
+ working_cost = Row(tableau.num_columns(), Row::Flags());
+
+ // Modify the tableau and the new cost function by adding
+ // the slack variables (which enter the base).
+ // As for the cost function, all the slack variables should have
+ // coefficient -1.
+ for (dimension_type i = 0; i < tableau.num_rows(); ++i) {
+ const dimension_type j = tableau_old_n_cols + i;
+ tableau[i][j] = 1;
+ working_cost[j] = -1;
+ base[i] = j;
+ }
+
+ // 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[last_obj_index] = 1;
+
+ // Express the problem in terms of the variables in base.
+ for (dimension_type i = tableau.num_rows(); i-- > 0; )
+ linear_combine(working_cost, tableau[i], base[i]);
+}
+
+// See pag 55-56 Papadimitriou.
+
+void
+PPL::LP_Problem::erase_slacks() {
+ const dimension_type tableau_last_index = tableau.num_columns() - 1;
+ dimension_type tableau_n_rows = tableau.num_rows();
+ const dimension_type first_slack_index = tableau_last_index - tableau_n_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 (base[i] >= first_slack_index) {
+ // Search for a non-zero element to enter the base.
+ Row& tableau_i = tableau[i];
+ bool redundant = true;
+ for (dimension_type j = first_slack_index; j-- > 1; )
+ if (tableau_i[j] != 0) {
+ swap_base(j, 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.swap(tableau[tableau_n_rows]);
+ base[i] = base[tableau_n_rows];
+ --i;
+ }
+ tableau.erase_to_end(tableau_n_rows);
+ base.pop_back();
+ }
+ }
+
+ // Step 2: Adjust data structures so as to enter phase 2 of the simplex.
+
+ // Compute the dimensions of the new tableau.
+ const dimension_type new_tableau_n_cols = first_slack_index + 1;
+ const dimension_type new_tableau_last_index = first_slack_index;
+
+ // Adjust the number of columns of `tableau'.
+ tableau.remove_trailing_columns(tableau.num_columns() - new_tableau_n_cols);
+ // Zero the last column of the tableau.
+ for (dimension_type i = tableau_n_rows; i-- > 0; )
+ tableau[i][new_tableau_last_index] = 0;
+
+ // ... then properly set the element in the (new) last column,
+ // encoding the kind of optimization; ...
+ working_cost[new_tableau_last_index] = working_cost[tableau_last_index];
+ // ... and finally remove redundant columns.
+ const dimension_type working_cost_new_size = working_cost.size() -
+ (tableau_last_index - new_tableau_last_index);
+ working_cost.shrink(working_cost_new_size);
+}
+
+// See pag 55 of Papadimitriou.
+
+PPL::LP_Problem_Status
+PPL::LP_Problem::compute_tableau() {
+ assert(tableau.num_rows() == 0);
+ assert(dim_map.size() == 0);
+ // Note: exploiting friendship so as to efficiently access the
+ // coefficients of each constraint.
+ Linear_System& cs = input_cs;
+ const dimension_type cs_num_rows = cs.num_rows();
+ const dimension_type cs_num_cols = cs.num_columns();
+
+ // Step 1:
+ // determine variables that are constrained to be nonnegative,
+ // detect (non-negativity or tautology) constraints that will not
+ // be part of the tableau and count the number of slack variables.
+
+ // Counters determining the dimensions of the tableau:
+ // initialized here, they will be updated while examining `cs'.
+ dimension_type tableau_num_rows = cs_num_rows;
+ dimension_type tableau_num_cols = 2*cs_num_cols - 1;
+ dimension_type num_slack_variables = 0;
+
+ // On exit, `is_tableau_constraint[i]' will be true if and only if
+ // `cs[i]' is neither a tautology (e.g., 1 >= 0) nor a non-negativity
+ // constraint (e.g., X >= 0).
+ std::deque<bool> is_tableau_constraint(cs_num_rows, true);
+
+ // On exit, `nonnegative_variable[j]' will be true if and only if
+ // Variable(j) is bound to be nonnegative in `cs'.
+ std::deque<bool> nonnegative_variable(cs_num_cols - 1, false);
+
+ // Process each row of the `cs' matrix.
+ for (dimension_type i = cs_num_rows; i-- > 0; ) {
+ const Linear_Row& cs_i = cs[i];
+ bool found_a_nonzero_coeff = false;
+ bool found_many_nonzero_coeffs = false;
+ dimension_type nonzero_coeff_column_index = 0;
+ for (dimension_type j = cs_num_cols; j-- > 1; ) {
+ if (cs_i[j] != 0)
+ if (found_a_nonzero_coeff) {
+ found_many_nonzero_coeffs = true;
+ if (cs_i.is_ray_or_point_or_inequality())
+ ++num_slack_variables;
+ break;
+ }
+ else {
+ nonzero_coeff_column_index = j;
+ found_a_nonzero_coeff = true;
+ }
+ }
+ // If more than one coefficient is nonzero,
+ // continue with next constraint.
+ if (found_many_nonzero_coeffs)
+ continue;
+
+ if (!found_a_nonzero_coeff) {
+ // All coefficients are 0.
+ // The constraint is either trivially true or trivially false.
+ if (cs_i.is_ray_or_point_or_inequality()) {
+ if (cs_i[0] < 0)
+ // A constraint such as -1 >= 0 is trivially false.
+ return UNFEASIBLE_LP_PROBLEM;
+ }
+ else
+ // The constraint is an equality.
+ if (cs_i[0] != 0)
+ // A constraint such as 1 == 0 is trivially false.
+ return UNFEASIBLE_LP_PROBLEM;
+ // Here the constraint is trivially true.
+ is_tableau_constraint[i] = false;
+ --tableau_num_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) Don't split the variable and do add the constraint in the tableau.
+ C) Don't split the variable and don't 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[nonzero_coeff_column_index]);
+ const int sgn_b = sgn(cs_i[0]);
+ // Cases 1-3: apply method A.
+ if (sgn_a == sgn_b) {
+ if (cs_i.is_ray_or_point_or_inequality())
+ ++num_slack_variables;
+ }
+ // Cases 4-5: apply method B.
+ else if (cs_i.is_line_or_equality()) {
+ if (!nonnegative_variable[nonzero_var_index]) {
+ nonnegative_variable[nonzero_var_index] = true;
+ --tableau_num_cols;
+ }
+ }
+ // Case 6: apply method B.
+ else if (sgn_b < 0) {
+ if (!nonnegative_variable[nonzero_var_index]) {
+ nonnegative_variable[nonzero_var_index] = true;
+ --tableau_num_cols;
+ }
+ ++num_slack_variables;
+ }
+ // Case 7: apply method C.
+ else if (sgn_a > 0) {
+ if (!nonnegative_variable[nonzero_var_index]) {
+ nonnegative_variable[nonzero_var_index] = true;
+ --tableau_num_cols;
+ }
+ is_tableau_constraint[i] = false;
+ --tableau_num_rows;
+ }
+ // Cases 8-9: apply method A.
+ else
+ ++num_slack_variables;
+ }
+ }
+
+ // The slack variables will be columns in the tableau.
+ tableau_num_cols += num_slack_variables;
+
+ // Now we can fill the map.
+ for (dimension_type i = 0, j = nonnegative_variable.size(),
+ nnv_size = j; i < nnv_size; ++i)
+ if (!nonnegative_variable[i]) {
+ dim_map.insert(std::make_pair(i, j));
+ ++j;
+ }
+
+ // Step 2:
+ // set the dimensions for the tableau and the cost function.
+ if (tableau_num_rows > 0) {
+ if (tableau_num_cols > tableau.max_num_columns())
+ throw std::length_error("PPL::LP_Problem:\nthe maximum size of an "
+ "internal data structure has been exceeded "
+ "while solving the LP_Problem.");
+ tableau.add_zero_rows_and_columns(tableau_num_rows,
+ tableau_num_cols,
+ Row::Flags());
+ }
+
+ // Phase 3:
+ // insert all the (possibly transformed) constraints that are not
+ // nonnegativity constraints. The transformation includes both
+ // the variable splitting (for variables that are unconstrained
+ // in sign) and the addition of slack variables (for inequalities
+ // in the original problem).
+
+ for (dimension_type k = tableau_num_rows, slack_index = tableau_num_cols,
+ i = cs_num_rows; i-- > 0; )
+ if (is_tableau_constraint[i]) {
+ // Copy the original constraint in the tableau.
+ Row& tableau_k = tableau[--k];
+ const Linear_Row& cs_i = cs[i];
+ for (dimension_type j = cs_num_cols; j-- > 0; )
+ tableau_k[j] = cs_i[j];
+ // Add the slack variable, if needed.
+ if (cs_i.is_ray_or_point_or_inequality())
+ tableau_k[--slack_index] = -1;
+ }
+
+ // Split the variables in the tableau and cost function.
+ typedef std::map<dimension_type, dimension_type>::const_iterator iter;
+ for (iter map_itr = dim_map.begin(),
+ map_end = dim_map.end(); map_itr != map_end; ++map_itr) {
+ const dimension_type original_var = (map_itr->first) + 1;
+ const dimension_type split_var = (map_itr->second) + 1;
+ for (dimension_type i = tableau_num_rows; i-- > 0; ) {
+ Row& tableau_i = tableau[i];
+ tableau_i[split_var] = -tableau_i[original_var];
+ }
+ }
+
+ // 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)
+ for (dimension_type i = tableau_num_cols; i-- > 1; )
+ if (input_obj_function[i] > 0){
+ status = UNBOUNDED;
+ return UNBOUNDED_LP_PROBLEM;
+ }
+ // The problem is neither trivially unfeasible nor trivially unbounded.
+ // The tableau was successfull computed and the caller has to figure
+ // out which case applies.
+ status = OPTIMIZED;
+ return OPTIMIZED_LP_PROBLEM;
+}
+
+bool
+PPL::LP_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::Generator
+PPL::LP_Problem::compute_generator() const {
+ // We will store in num[] and in den[] the numerators and
+ // the denominators of every variable of the original problem.
+ dimension_type original_space_dim = input_cs.space_dimension();
+ std::vector<Coefficient> num(original_space_dim);
+ std::vector<Coefficient> den(original_space_dim);
+ dimension_type row = 0;
+
+ // We start to compute num[] and den[].
+ typedef std::map<dimension_type, dimension_type>::const_iterator iter;
+ iter map_end = dim_map.end();
+
+ for (dimension_type i = original_space_dim; i-- > 0; ) {
+ Coefficient& num_i = num[i];
+ Coefficient& den_i = den[i];
+ // Get the value of the variable from the tableau
+ // (if it is not a basic variable, the value is 0).
+ if (is_in_base(i+1, row)) {
+ const Row& t_row = tableau[row];
+ if (t_row[i+1] > 0) {
+ num_i= -t_row[0];
+ den_i= t_row[i+1];
+ }
+ else {
+ num_i= t_row[0];
+ den_i= -t_row[i+1];
+ }
+ }
+ else {
+ num_i = 0;
+ den_i = 1;
+ }
+ // Check whether the variable was split.
+ iter map_iter = dim_map.find(i);
+ if (map_iter != map_end) {
+ // The variable was split: get the value for the negative component,
+ // having index map[i] + 1.
+ const dimension_type split_i = map_iter->second;
+ // Like before, we he have to check if the variable is in base.
+ if (is_in_base(split_i+1, row)) {
+ const Row& t_row = tableau[row];
+ TEMP_INTEGER(split_num);
+ TEMP_INTEGER(split_den);
+ if (t_row[split_i+1] > 0) {
+ split_num = -t_row[0];
+ split_den = t_row[split_i+1];
+ }
+ else {
+ split_num = t_row[0];
+ split_den = -t_row[split_i+1];
+ }
+ // We compute the lcm to compute subsequently the difference
+ // between the 2 variables.
+ TEMP_INTEGER(lcm);
+ lcm_assign(lcm, den_i, split_den);
+ exact_div_assign(den_i, lcm, den_i);
+ exact_div_assign(split_den, lcm, split_den);
+ num_i *= den_i;
+ sub_mul_assign(num_i, split_num, split_den);
+ if (num_i == 0)
+ den_i = 1;
+ else
+ den_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.
+ TEMP_INTEGER(lcm);
+ lcm = den[0];
+ for (dimension_type i = 1; i < original_space_dim; ++i)
+ lcm_assign(lcm, lcm, den[i]);
+ // Use the denominators to store the numerators' multipliers
+ // and then compute the normalized numerators.
+ for (dimension_type i = original_space_dim; i-- > 0; ) {
+ exact_div_assign(den[i], lcm, den[i]);
+ num[i] *= den[i];
+ }
+
+ // Finally, build the generator.
+ Linear_Expression expr;
+ for (dimension_type i = original_space_dim; i-- > 0; )
+ expr += num[i] * Variable(i);
+ return point(expr, lcm);
+}
+
+void
+PPL::LP_Problem::second_phase() {
+ // Second_phase requires that *this is satisfiable.
+ assert(status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED);
+ // In the following cases the problem is already solved.
+ if (status == UNBOUNDED || status == OPTIMIZED)
+ return;
+
+ // Negate the cost function if we are minimizing.
+ Row new_cost = input_obj_function;
+ if (opt_mode == MINIMIZATION)
+ for (dimension_type i = new_cost.size(); i-- > 0; )
+ neg_assign(new_cost[i]);
+
+ // Substitute properly the cost funcion in the `costs' Matrix.
+ const dimension_type cost_zero_size = working_cost.size();
+ Row tmp_cost = Row(new_cost, cost_zero_size, cost_zero_size);
+ tmp_cost.swap(working_cost);
+ working_cost[cost_zero_size-1] = 1;
+ // Split the variable in the original cost function as defined in the
+ // `dim_map' variable.
+ typedef std::map<dimension_type, dimension_type>::const_iterator iter;
+ for (iter map_itr = dim_map.begin(),
+ map_end = dim_map.end(); map_itr != map_end; ++map_itr){
+ const dimension_type original_var = (map_itr->first) + 1;
+ const dimension_type split_var = (map_itr->second) + 1;
+ working_cost[split_var] = -working_cost[original_var];
+ }
+
+ // Here the first phase problem succeeded with optimum value zero.
+ // Express the old cost function in terms of the computed base.
+ for (dimension_type i = tableau.num_rows(); i-- > 0; ) {
+ const dimension_type base_i = base[i];
+ if (working_cost[base_i] != 0)
+ linear_combine(working_cost, tableau[i], base_i);
+ }
+ // Solve the second phase problem.
+ bool second_phase_successful = compute_simplex();
+
+#if PPL_NOISY_SIMPLEX
+ std::cout << "LP_Problem::solve: 2nd phase ended at iteration "
+ << num_iterations << "." << std::endl;
+#endif
+ if (second_phase_successful) {
+ last_generator = compute_generator();
+ status = OPTIMIZED;
+ }
+ else
+ status = UNBOUNDED;
+ assert(OK());
+}
+
+void
+PPL::LP_Problem::evaluate_objective_function(const Generator& evaluating_point,
+ Coefficient& ext_n,
+ Coefficient& ext_d) const {
+ const dimension_type ep_space_dim = evaluating_point.space_dimension();
+ if (space_dimension() < ep_space_dim)
+ throw std::invalid_argument("PPL::LP_Problem::"
+ "evaluate_objective_function(p, n, d):\n"
+ "*this and p are dimension incompatible.");
+ if (!evaluating_point.is_point())
+ throw std::invalid_argument("PPL::LP_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 space_dim
+ = std::min(ep_space_dim, input_obj_function.space_dimension());
+ // Compute the optimal value of the cost function.
+ ext_n = input_obj_function.inhomogeneous_term();
+ for (dimension_type i = space_dim; i-- > 0; )
+ ext_n += evaluating_point.coefficient(Variable(i))
+ * input_obj_function.coefficient(Variable(i));
+ // Numerator and denominator should be coprime.
+ normalize2(ext_n, evaluating_point.divisor(), ext_n, ext_d);
+}
+
+bool
+PPL::LP_Problem::is_satisfiable() const {
+#if PPL_NOISY_SIMPLEX
+ num_iterations = 0;
+#endif
+ // Check for the `status' attribute in trivial cases.
+ switch (status) {
+ case UNSATISFIABLE:
+ return false;
+ case SATISFIABLE:
+ return true;
+ case UNBOUNDED:
+ return true;
+ case OPTIMIZED:
+ return true;
+ case PARTIALLY_SATISFIABLE:
+ return false;
+ case UNSOLVED:
+ break;
+ }
+
+ LP_Problem& x = const_cast<LP_Problem&>(*this);
+
+ // The space dimension of the solution to be computed.
+ // Note: here we can not use method Constraint_System::space_dimension(),
+ // because if the constraint system is NNC, then even the epsilon
+ // dimension has to be interpreted as a normal dimension.
+ const dimension_type space_dim = x.input_cs.num_columns() - 1;
+
+ // Reset internal objects.
+ x.tableau.clear();
+ x.dim_map.clear();
+ // Compute the initial tableau.
+ LP_Problem_Status s_status = x.compute_tableau();
+
+ // Check for trivial cases.
+ switch (s_status) {
+ case UNFEASIBLE_LP_PROBLEM:
+ return false;
+ case UNBOUNDED_LP_PROBLEM:
+ // A feasible point has to be returned: the origin.
+ // Ensure the right space dimension is obtained.
+ x.last_generator = point(0*Variable(space_dim-1));
+ return true;
+ case OPTIMIZED_LP_PROBLEM:
+ // Check for the special case of an empty tableau,
+ // in which case an optimizing solution is the origin.
+ if (x.tableau.num_rows() == 0) {
+ // Ensure the right space dimension is obtained.
+ x.last_generator = point(0*Variable(space_dim-1));
+ return true;
+ }
+ break;
+ }
+
+#if PPL_NOISY_SIMPLEX
+ num_iterations = 0;
+#endif
+
+ // Actually solve the LP problem.
+ x.base = std::vector<dimension_type> (x.tableau.num_rows());
+
+ // This will contain the new cost function for the 1st phase problem.
+ // Adds the necessary slack variables to get the 1st phase problem.
+ x.prepare_first_phase();
+ // Solve the first phase of the primal simplex algorithm.
+ bool first_phase_successful = x.compute_simplex();
+
+#if PPL_NOISY_SIMPLEX
+ std::cout << "LP_Problem::solve: 1st phase ended at iteration "
+ << num_iterations << "." << std::endl;
+#endif
+ // If the first phase problem was not solved or if we found an optimum
+ // value different from zero, then the origianl problem is unfeasible.
+ if (!first_phase_successful || x.working_cost[0] != 0){
+ x.status = UNSATISFIABLE;
+ return false;
+ }
+
+ // The first phase has found a feasible solution. If only a satisfiability
+ // check was requested, we can return that feasible solution.
+ // Store the last succesfully computed generator.
+ x.last_generator = compute_generator();
+ x.status = SATISFIABLE;
+ // Erase the slack variables.
+ x.erase_slacks();
+ return true;
+}
+
+bool
+PPL::LP_Problem::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // Constraint system should contain no strict inequalities.
+ if (input_cs.has_strict_inequalities()) {
+#ifndef NDEBUG
+ cerr << "The feasible region of the LP_Problem is defined by "
+ << "a constraint system containing strict inequalities."
+ << endl;
+#endif
+ return false;
+ }
+
+ // Constraint system and objective function should be dimension compatible.
+ const dimension_type space_dim = input_cs.space_dimension();
+ if (space_dim < input_obj_function.space_dimension()) {
+#ifndef NDEBUG
+ cerr << "The LP_Problem and the objective function have "
+ << "incompatible space dimensions ("
+ << space_dim << " < " << input_obj_function.space_dimension() << ")."
+ << endl;
+#endif
+ return false;
+ }
+
+ if (status == SATISFIABLE || status == UNBOUNDED || status == OPTIMIZED) {
+ // Here `last_generator' has to be meaningful.
+ // Check for dimension compatibility and actual feasibility.
+ if (space_dim != last_generator.space_dimension()) {
+#ifndef NDEBUG
+ cerr << "The LP_Problem and the cached feasible point have "
+ << "incompatible space dimensions ("
+ << space_dim << " != " << last_generator.space_dimension() << ")."
+ << endl;
+#endif
+ return false;
+ }
+ if (!input_cs.satisfies_all_constraints(last_generator)) {
+#ifndef NDEBUG
+ cerr << "The cached feasible point does not belong to "
+ << "the feasible region of the LP_Problem."
+ << endl;
+#endif
+ return false;
+ }
+
+ const dimension_type tableau_nrows = tableau.num_rows();
+ const dimension_type tableau_ncols = tableau.num_columns();
+
+ // The number of rows in the tableau and base should be equal.
+ if (tableau_nrows != base.size()) {
+#ifndef NDEBUG
+ cerr << "tableau and base have incompatible sizes" << endl;
+#endif
+ return false;
+ }
+
+ // The number of columns in the tableau and working_cost should be equal.
+ if (tableau_ncols != working_cost.size()) {
+#ifndef NDEBUG
+ cerr << "tableau and working_cost have incompatible sizes" << endl;
+#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_ncols) {
+#ifndef NDEBUG
+ cerr << "base contains an invalid column index" << endl;
+#endif
+ return false;
+ }
+
+ // dim_map should encode an injective function having
+ // disjoint domain and range.
+ std::set<dimension_type> domain;
+ std::set<dimension_type> range;
+ typedef std::map<dimension_type, dimension_type>::const_iterator Iter;
+ for (Iter i = dim_map.begin(), iend = dim_map.end(); i != iend; ++i) {
+ domain.insert(i->first);
+ range.insert(i->second);
+ }
+ if (domain.size() != range.size()
+ || domain.end() != std::find_first_of(domain.begin(), domain.end(),
+ range.begin(), range.end())) {
+#ifndef NDEBUG
+ cerr << "dim_map encodes an invalid map" << endl;
+#endif
+ return false;
+ }
+ }
+ // TODO: further tests will be added when supporting incremental
+ // computations.
+
+ // All checks passed.
+ return true;
+}
+
+void
+PPL::LP_Problem::ascii_dump(std::ostream& s) const {
+ using namespace IO_Operators;
+
+ s << "input_cs\n";
+ input_cs.ascii_dump(s);
+ s << "\ninput_obj_function\n";
+ input_obj_function.ascii_dump(s);
+ s << "\nopt_mode " << (opt_mode == MAXIMIZATION ? "MAX" : "MIN") << "\n";
+
+ s << "\nstatus: ";
+ switch (status) {
+ case UNSATISFIABLE:
+ s << "UNSAT";
+ break;
+ case SATISFIABLE:
+ s << "SATIS";
+ break;
+ case UNBOUNDED:
+ s << "UNBOU";
+ break;
+ case OPTIMIZED:
+ s << "OPTIM";
+ break;
+ case PARTIALLY_SATISFIABLE:
+ s << "P_SAT";
+ break;
+ case UNSOLVED:
+ s << "UNSOL";
+ break;
+ }
+ s << "\n";
+
+ s << "\ntableau\n";
+ tableau.ascii_dump(s);
+ s << "\nworking_cost\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] << ' ';
+
+ const dimension_type dim_map_size = dim_map.size();
+ s << "\ndim_map (" << dim_map_size << ")\n";
+ for (std::map<dimension_type, dimension_type>::const_iterator
+ i = dim_map.begin(), iend = dim_map.end(); i != iend; ++i)
+ s << Variable(i->first) << "->" << Variable(i->second) << ' ';
+
+ s << "\nlast_generator\n";
+ last_generator.ascii_dump(s);
+ s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(LP_Problem);
diff --git a/src/LP_Problem.defs.hh b/src/LP_Problem.defs.hh
new file mode 100644
index 0000000..3f5e7db
--- /dev/null
+++ b/src/LP_Problem.defs.hh
@@ -0,0 +1,394 @@
+/* LP_Problem class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_LP_Problem_defs_hh
+#define PPL_LP_Problem_defs_hh 1
+
+#include "LP_Problem.types.hh"
+#include "globals.types.hh"
+#include "Row.defs.hh"
+#include "Matrix.defs.hh"
+#include "Constraint_System.defs.hh"
+#include "Linear_Expression.defs.hh"
+#include "Constraint.types.hh"
+#include "Generator.defs.hh"
+#include <vector>
+#include <map>
+#include <iosfwd>
+
+//! A Linear Programming problem.
+/*! \ingroup PPL_CXX_interface */
+class Parma_Polyhedra_Library::LP_Problem {
+public:
+ //! Default constructor: builds a trivial LP problem.
+ /*!
+ The trivial LP problem requires to maximize the objective function
+ \f$0\f$ on the zero-dimensional vector space under no constraints
+ at all: the origin of the vector space is the optimal solution.
+ */
+ LP_Problem();
+
+ /*! \brief
+ Builds an LP problem from the constraint system \p cs, the objective
+ function \p obj and optimization mode \p mode.
+
+ \param cs
+ The constraint system defining the feasible region for the LP problem.
+
+ \param obj
+ The objective function for the LP problem (optional argument with
+ default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::invalid_argument
+ Thrown if the constraint system contains any strict inequality
+ or if the space dimension of the objective function is strictly
+ greater than the space dimension of the constraint system.
+ */
+ explicit LP_Problem(const Constraint_System& cs,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ //! Ordinary copy-constructor.
+ LP_Problem(const LP_Problem& y);
+
+ //! Destructor.
+ ~LP_Problem();
+
+ //! Assignment operator.
+ LP_Problem& operator=(const LP_Problem& y);
+
+ //! Returns the maximum space dimension a LP_Problem can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the current LP problem.
+ dimension_type space_dimension() const;
+
+ //! Returns the constraints defining the current feasible region.
+ const Constraint_System& constraints() const;
+
+ //! Returns the current objective function.
+ const Linear_Expression& objective_function() const;
+
+ //! Returns the current optimization mode.
+ Optimization_Mode optimization_mode() const;
+
+ //! Resets \p *this to be equal to the trivial LP problem.
+ void clear();
+
+ /*! \brief
+ Adds a copy of constraint \p c to the current LP problem,
+ increasing the number of space dimensions if needed.
+
+ \exception std::invalid_argument
+ Thrown if the constraint \p c is a strict inequality.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the current LP problem,
+ increasing the number of space dimensions if needed.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains any strict inequality.
+ */
+ 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 LP problem is satisfiable.
+ */
+ bool is_satisfiable() const;
+
+ //! Optimizes the current LP problem using the primal simplex algorithm.
+ /*!
+ \return
+ An LP_Problem_Status flag indicating the outcome of the optimization
+ attempt (unfeasible, unbounded or optimized problem).
+ */
+ LP_Problem_Status solve() const;
+
+ /*! \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 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& num,
+ Coefficient& den) const;
+
+ //! Returns a feasible point for \p *this, if it exists.
+ /*!
+ \exception std::domain_error
+ Thrown if the LP 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 doesn't not have an optimizing point, i.e.,
+ if the LP problem is unbounded or not satisfiable.
+ */
+ const Generator& optimizing_point() const;
+
+ /*! \brief
+ Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+ the solution of the optimization problem.
+
+ \exception std::domain_error
+ Thrown if \p *this doesn't not have an optimizing point, i.e.,
+ if the LP problem is unbounded or not satisfiable.
+ */
+ void optimal_value(Coefficient& num, Coefficient& den) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(LP_Problem& y);
+
+private:
+ //! The matrix encoding the current feasible region in tableau form.
+ Matrix tableau;
+ //! The working cost function.
+ Row working_cost;
+ //! The current basic solution.
+ std::vector<dimension_type> base;
+ //! A mapping between original variables and split ones.
+ /*!
+ Contains all the pairs (i, j) such that Variable(i) (that was not found
+ to be constrained in sign) has been split into two nonnegative variables.
+ The "positive" one is represented again by Variable(i), and
+ the "negative" one is represented by Variable(j).
+ */
+ std::map<dimension_type, dimension_type> dim_map;
+
+ //! An enumerated type describing the internal status of the LP problem.
+ enum Status {
+ //! The LP problem has not been solved yet.
+ UNSOLVED,
+ //! The LP problem is unsatisfiable.
+ UNSATISFIABLE,
+ //! The LP problem is satisfiable; a feasible solution has been computed.
+ SATISFIABLE,
+ //! The LP problem is unbounded; a feasible solution has been computed.
+ UNBOUNDED,
+ //! The LP problem is optimized; an optimal solution has been computed.
+ OPTIMIZED,
+ /*! \brief
+ The feasible region of the LP problem has been changed by adding
+ new constraints; a feasible solution for the old constraints has
+ been computed.
+ */
+ PARTIALLY_SATISFIABLE
+ };
+
+ //! The internal state of the LP problem.
+ Status status;
+
+ //! The constraint system describing the feasible region.
+ Constraint_System input_cs;
+
+ //! 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
+ Optimizes the current LP problem using the second phase of the
+ primal simplex algorithm.
+ */
+ void second_phase();
+
+ /*! \brief
+ Assigns to \p this->tableau a simplex tableau representing the
+ current LP problem, inserting into \p this->dim_map the information
+ that is required to recover the original LP problem.
+
+ \return
+ <CODE>UNFEASIBLE_LP_PROBLEM</CODE> if the constraint system contains
+ any trivially unfeasible constraint (tableau was not computed);
+ <CODE>UNBOUNDED_LP_PROBLEM</CODE> if the problem is trivially unbounded
+ (the computed tableau contains no constraints);
+ <CODE>OPTIMIZED_LP_PROBLEM></CODE> if the problem is neither trivially
+ unfeasible nor trivially unbounded (the tableau was computed successfully).
+ */
+ LP_Problem_Status compute_tableau();
+
+ /*! \brief
+ Checks for optimality and, if it does not hold, computes the column
+ index of the variable entering the base of the LP problem.
+ Implemented 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 retuned.
+ */
+ dimension_type get_entering_var_index() const;
+
+ /*! \brief
+ Computes the row index of the variable exiting the base
+ of the LP problem. Implemented with anti-cycling rules.
+
+ \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 Linear_Row to \p x and normalizes it.
+ */
+ static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+ /*! \brief
+ Swaps two variables in base during the simplex algorithm,
+ performing the needed linear combinations.
+
+ \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 swap_base(const dimension_type entering_var_index,
+ const dimension_type exiting_base_index);
+
+ /*! \brief
+ Checks for optimality and, if it does not hold, computes the column
+ index of the variable entering the base of the LP problem.
+
+ \return
+ The column index of the variable that enters the base. If no such
+ variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+
+ 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 Integer implementation of the algorithm, our
+ tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
+ can be computed dividing the value of the cofficient by the value of
+ the variable in base. Obviously the result may not be an Integer, so
+ we will proceed in another way: the following code will compute the
+ lcm of all the variables in base to get the good ``weight'' of each
+ Coefficient of the tableau.
+ */
+ dimension_type steepest_edge() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and if only the algorithm successfully
+ computed a feasible solution.
+ */
+ bool compute_simplex();
+
+ /*! \brief
+ Adds the slack variables to satisfy the standard form of a LP problem,
+ inserts the "sign" to the cost functions, and makes the
+ necessary swaps to express the problem with the 1st phase base.
+ */
+ void prepare_first_phase();
+
+ /*! \brief
+ Drop unnecessary slack variables from the tableau and get ready
+ for the second phase of the simplex algorithm.
+ */
+ void erase_slacks();
+
+ bool is_in_base(const dimension_type var_index,
+ dimension_type& row_index) const;
+
+ Generator compute_generator() const;
+};
+
+#include "LP_Problem.inlines.hh"
+
+#endif // !defined(PPL_LP_Problem_defs_hh)
diff --git a/src/LP_Problem.inlines.hh b/src/LP_Problem.inlines.hh
new file mode 100644
index 0000000..ec0197e
--- /dev/null
+++ b/src/LP_Problem.inlines.hh
@@ -0,0 +1,267 @@
+/* LP_Problem class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_LP_Problem_inlines_hh
+#define PPL_LP_Problem_inlines_hh 1
+
+#include "Constraint.defs.hh"
+#include "Constraint_System.defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+LP_Problem::LP_Problem()
+ : tableau(), working_cost(0, Row::Flags()),
+ base(), dim_map(), status(OPTIMIZED),
+ input_cs(), input_obj_function(), opt_mode(MAXIMIZATION),
+ last_generator(point()) {
+ assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const Constraint_System& cs,
+ const Linear_Expression& obj,
+ const Optimization_Mode mode)
+ : tableau(), working_cost(0, Row::Flags()),
+ base(), dim_map(), status(UNSOLVED),
+ input_cs(!cs.has_strict_inequalities()
+ ? cs
+ : (throw std::invalid_argument("PPL::LP_Problem::"
+ "LP_Problem(cs, obj, m):\n"
+ "cs contains strict inequalities."),
+ cs)),
+ input_obj_function(obj.space_dimension() <= cs.space_dimension()
+ ? obj
+ : (throw std::invalid_argument("PPL::LP_Problem::"
+ "LP_Problem(cs, obj, m):\n"
+ "cs and obj have "
+ "incompatible space dimensions."),
+ obj)),
+ opt_mode(mode),
+ last_generator(point()) {
+ assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const LP_Problem& y)
+ : tableau(y.tableau), working_cost(y.working_cost),
+ base(y.base), dim_map(y.dim_map), status(y.status),
+ input_cs(y.input_cs), input_obj_function(y.input_obj_function),
+ opt_mode(y.opt_mode), last_generator(y.last_generator) {
+ assert(OK());
+}
+
+inline
+LP_Problem::~LP_Problem() {
+}
+
+inline void
+LP_Problem::swap(LP_Problem& y) {
+ std::swap(tableau, y.tableau);
+ std::swap(working_cost, y.working_cost);
+ std::swap(base, y.base);
+ std::swap(dim_map, y.dim_map);
+ std::swap(status, y.status);
+ std::swap(input_cs, y.input_cs);
+ std::swap(input_obj_function, y.input_obj_function);
+ std::swap(opt_mode, y.opt_mode);
+ std::swap(last_generator, y.last_generator);
+}
+
+inline LP_Problem&
+LP_Problem::operator=(const LP_Problem& y) {
+ LP_Problem tmp(y);
+ swap(tmp);
+ return *this;
+}
+
+inline dimension_type
+LP_Problem::max_space_dimension() {
+ return Constraint_System::max_space_dimension();
+}
+
+inline dimension_type
+LP_Problem::space_dimension() const {
+ return input_cs.space_dimension();
+}
+
+inline const Constraint_System&
+LP_Problem::constraints() const {
+ return input_cs;
+}
+
+inline const Linear_Expression&
+LP_Problem::objective_function() const {
+ return input_obj_function;
+}
+
+inline Optimization_Mode
+LP_Problem::optimization_mode() const {
+ return opt_mode;
+}
+
+inline void
+LP_Problem::clear() {
+ LP_Problem tmp;
+ swap(tmp);
+}
+
+inline void
+LP_Problem::add_constraint(const Constraint& c) {
+ if (c.is_strict_inequality())
+ throw std::invalid_argument("PPL::LP_Problem::add_constraint(c):\n"
+ "c is a strict inequality.");
+ input_cs.insert(c);
+ if (status != UNSATISFIABLE)
+ // TODO: apply an incremental version of the simplex algorithm,
+ // setting `status' to PARTIALLY_SATISFIABLE;
+ status = UNSOLVED;
+}
+
+inline void
+LP_Problem::add_constraints(const Constraint_System& cs) {
+ if (cs.has_strict_inequalities())
+ throw std::invalid_argument("PPL::LP_Problem::add_constraints(cs):\n"
+ "cs contains strict inequalities.");
+ const dimension_type cs_num_rows = cs.num_rows();
+ for (dimension_type i = cs_num_rows; i-- > 0; )
+ input_cs.insert(cs[i]);
+ if (status != UNSATISFIABLE)
+ // TODO: apply an incremental version of the simplex algorithm,
+ // setting `status' to PARTIALLY_SATISFIABLE;
+ status = UNSOLVED;
+ assert(OK());
+}
+
+inline void
+LP_Problem::set_objective_function(const Linear_Expression& obj) {
+ if (space_dimension() < obj.space_dimension())
+ throw std::invalid_argument("PPL::LP_Problem::"
+ "set_objective_function(obj):\n"
+ "*this and obj are dimension incompatible.");
+ switch (status) {
+ case UNBOUNDED:
+ status = SATISFIABLE;
+ break;
+ case OPTIMIZED:
+ status = SATISFIABLE;
+ break;
+ default:
+ break;
+ }
+ input_obj_function = obj;
+ assert(OK());
+}
+
+inline void
+LP_Problem::set_optimization_mode(Optimization_Mode mode) {
+ if (opt_mode == mode)
+ return;
+ switch (status) {
+ case UNBOUNDED:
+ status = SATISFIABLE;
+ break;
+ case OPTIMIZED:
+ status = SATISFIABLE;
+ break;
+ default:
+ break;
+ }
+ opt_mode = mode;
+ assert(OK());
+}
+
+inline LP_Problem_Status
+LP_Problem::solve() const {
+ if (is_satisfiable()) {
+ LP_Problem& x = const_cast<LP_Problem&>(*this);
+ x.second_phase();
+ if (x.status == UNBOUNDED)
+ return UNBOUNDED_LP_PROBLEM;
+ if (x.status == OPTIMIZED)
+ return OPTIMIZED_LP_PROBLEM;
+ }
+ return UNFEASIBLE_LP_PROBLEM;
+}
+
+inline const Generator&
+LP_Problem::feasible_point() const {
+ if (is_satisfiable()) {
+ assert(OK());
+ return last_generator;
+ }
+ throw std::domain_error("PPL::LP_Problem::feasible_point():\n"
+ "*this is not satisfiable.");
+}
+
+inline const Generator&
+LP_Problem::optimizing_point() const {
+ if (solve() == OPTIMIZED_LP_PROBLEM)
+ return last_generator;
+ throw std::domain_error("PPL::LP_Problem::optimizing_point():\n"
+ "*this doesn't have an optimizing point.");
+}
+
+inline void
+LP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
+ const Generator& g_ref = optimizing_point();
+ evaluate_objective_function(g_ref, num, den);
+ assert(OK());
+}
+
+inline memory_size_type
+LP_Problem::external_memory_in_bytes() const {
+ memory_size_type n
+ = tableau.external_memory_in_bytes()
+ + working_cost.external_memory_in_bytes()
+ + input_cs.external_memory_in_bytes()
+ + input_obj_function.external_memory_in_bytes()
+ + last_generator.external_memory_in_bytes();
+ // Adding the external memory for `base'.
+ n += base.capacity() * sizeof(dimension_type);
+ // Adding the external memory for `dim_map'.
+ // CHECK ME: just a lower approximation?
+ n += dim_map.size()
+ * sizeof(std::map<dimension_type, dimension_type>::value_type);
+ return n;
+}
+
+inline memory_size_type
+LP_Problem::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::LP_Problem */
+inline void
+swap(Parma_Polyhedra_Library::LP_Problem& x,
+ Parma_Polyhedra_Library::LP_Problem& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_LP_Problem_inlines_hh)
diff --git a/src/LP_Problem.types.hh b/src/LP_Problem.types.hh
new file mode 100644
index 0000000..ea812e1
--- /dev/null
+++ b/src/LP_Problem.types.hh
@@ -0,0 +1,32 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_LP_Problem_types_hh
+#define PPL_LP_Problem_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the LP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum LP_Problem_Status {
+ //! The problem is unfeasible.
+ UNFEASIBLE_LP_PROBLEM,
+ //! The problem is unbounded.
+ UNBOUNDED_LP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_LP_PROBLEM
+};
+
+class LP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_LP_Problem_types_hh)
diff --git a/src/Limits.hh b/src/Limits.hh
new file mode 100644
index 0000000..3fec349
--- /dev/null
+++ b/src/Limits.hh
@@ -0,0 +1,95 @@
+/* Limits for native integer types.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Limits_hh
+#define PPL_Limits_hh 1
+
+#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 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 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 SIZEOF_UNSIGNED_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+/*
+ The only reason to use these definitions instead of std::numeric_limits
+ is a missing optimization in GCC 3.4.1.
+*/
+
+template <typename T>
+struct Limits;
+
+#define signed_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+ static const type min = prefix ## _MIN; \
+ static const type max = prefix ## _MAX; \
+}
+
+#define unsigned_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+ static const type min = 0; \
+ static const type max = prefix ## _MAX; \
+}
+
+signed_limits(signed char, SCHAR);
+signed_limits(short, SHRT);
+signed_limits(int, INT);
+signed_limits(long, LONG);
+signed_limits(long long, LLONG);
+
+unsigned_limits(unsigned char, UCHAR);
+unsigned_limits(unsigned short, USHRT);
+unsigned_limits(unsigned int, UINT);
+unsigned_limits(unsigned long, ULONG);
+unsigned_limits(unsigned long long, ULLONG);
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Limits_hh)
diff --git a/src/Linear_Expression.cc b/src/Linear_Expression.cc
new file mode 100644
index 0000000..5fd2a3b
--- /dev/null
+++ b/src/Linear_Expression.cc
@@ -0,0 +1,289 @@
+/* Linear_Expression class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+
+#include <config.h>
+
+#include "Linear_Expression.defs.hh"
+#include "Constraint.defs.hh"
+#include "Generator.defs.hh"
+#include "Congruence.defs.hh"
+#include <stdexcept>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Linear_Expression::Linear_Expression(const Constraint& c)
+ : Linear_Row(c.space_dimension() + 1, Linear_Row::Flags()) {
+ Linear_Expression& e = *this;
+ for (dimension_type i = size(); i-- > 0; )
+ e[i] = c[i];
+}
+
+PPL::Linear_Expression::Linear_Expression(const Generator& g)
+ : Linear_Row(g.space_dimension() + 1, Linear_Row::Flags()) {
+ Linear_Expression& e = *this;
+ // Do not copy the divisor of `g'.
+ for (dimension_type i = size(); --i > 0; )
+ e[i] = g[i];
+}
+
+PPL::Linear_Expression::Linear_Expression(const Congruence& cg)
+ : Linear_Row(cg.space_dimension() + 1, Linear_Row::Flags()) {
+ Linear_Expression& e = *this;
+ for (dimension_type i = size(); i-- > 0; )
+ e[i] = cg[i];
+}
+
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator+(const Linear_Expression& e1, const Linear_Expression& e2) {
+ dimension_type e1_size = e1.size();
+ dimension_type e2_size = e2.size();
+ dimension_type min_size;
+ dimension_type max_size;
+ const Linear_Expression* p_e_max;
+ if (e1_size > e2_size) {
+ min_size = e2_size;
+ max_size = e1_size;
+ p_e_max = &e1;
+ }
+ else {
+ min_size = e1_size;
+ max_size = e2_size;
+ p_e_max = &e2;
+ }
+
+ Linear_Expression r(max_size, false);
+ dimension_type i = max_size;
+ while (i > min_size) {
+ --i;
+ r[i] = (*p_e_max)[i];
+ }
+ while (i > 0) {
+ --i;
+ r[i] = e1[i] + e2[i];
+ }
+
+ return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator+(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ Linear_Expression r(e);
+ r[0] += n;
+ return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator-(const Linear_Expression& e) {
+ Linear_Expression r(e);
+ for (dimension_type i = e.size(); i-- > 0; )
+ neg_assign(r[i]);
+ return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator-(const Linear_Expression& e1, const Linear_Expression& e2) {
+ dimension_type e1_size = e1.size();
+ dimension_type e2_size = e2.size();
+ if (e1_size > e2_size) {
+ Linear_Expression r(e1_size, false);
+ dimension_type i = e1_size;
+ while (i > e2_size) {
+ --i;
+ r[i] = e1[i];
+ }
+ while (i > 0) {
+ --i;
+ r[i] = e1[i] - e2[i];
+ }
+ return r;
+ }
+ else {
+ Linear_Expression r(e2_size, false);
+ dimension_type i = e2_size;
+ while (i > e1_size) {
+ --i;
+ r[i] = -e2[i];
+ }
+ while (i > 0) {
+ --i;
+ r[i] = e1[i] - e2[i];
+ }
+ return r;
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator-(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ Linear_Expression r(e);
+ for (dimension_type i = e.size(); i-- > 0; )
+ neg_assign(r[i]);
+ r[0] += n;
+
+ return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression
+PPL::operator*(Coefficient_traits::const_reference n,
+ const Linear_Expression& e) {
+ Linear_Expression r(e);
+ for (dimension_type i = e.size(); i-- > 0; )
+ r[i] *= n;
+ return r;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator+=(Linear_Expression& e1, const Linear_Expression& e2) {
+ dimension_type e1_size = e1.size();
+ dimension_type e2_size = e2.size();
+ if (e1_size >= e2_size)
+ for (dimension_type i = e2_size; i-- > 0; )
+ e1[i] += e2[i];
+ else {
+ Linear_Expression e(e2);
+ for (dimension_type i = e1_size; i-- > 0; )
+ e[i] += e1[i];
+ std::swap(e1, e);
+ }
+ return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator+=(Linear_Expression& e, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression::max_space_dimension())
+ throw std::length_error("PPL::operator+=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ const dimension_type e_size = e.size();
+ if (e_size <= v_space_dim) {
+ Linear_Expression new_e(e, v_space_dim+1);
+ std::swap(e, new_e);
+ }
+ ++e[v_space_dim];
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator-=(Linear_Expression& e1, const Linear_Expression& e2) {
+ dimension_type e1_size = e1.size();
+ dimension_type e2_size = e2.size();
+ if (e1_size >= e2_size)
+ for (dimension_type i = e2_size; i-- > 0; )
+ e1[i] -= e2[i];
+ else {
+ Linear_Expression e(e1, e2_size);
+ for (dimension_type i = e2_size; i-- > 0; )
+ e[i] -= e2[i];
+ std::swap(e1, e);
+ }
+ return e1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator-=(Linear_Expression& e, const Variable v) {
+ const dimension_type v_space_dim = v.space_dimension();
+ if (v_space_dim > Linear_Expression::max_space_dimension())
+ throw std::length_error("PPL::operator-=(e, v):\n"
+ "v exceeds the maximum allowed space dimension.");
+ const dimension_type e_size = e.size();
+ if (e_size <= v_space_dim) {
+ Linear_Expression new_e(e, v_space_dim+1);
+ std::swap(e, new_e);
+ }
+ --e[v_space_dim];
+ return e;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+PPL::Linear_Expression&
+PPL::operator*=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ dimension_type e_size = e.size();
+ for (dimension_type i = e_size; i-- > 0; )
+ e[i] *= n;
+ return e;
+}
+
+bool
+PPL::Linear_Expression::OK() const {
+ dimension_type sz = size();
+ return Linear_Row::OK(sz, sz);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+std::ostream&
+PPL::IO_Operators::operator<<(std::ostream& s, const Linear_Expression& e) {
+ const int num_variables = e.space_dimension();
+ bool first = true;
+ for (int v = 0; v < num_variables; ++v) {
+ Coefficient ev = e[v+1];
+ if (ev != 0) {
+ if (!first) {
+ if (ev > 0)
+ s << " + ";
+ else {
+ s << " - ";
+ neg_assign(ev);
+ }
+ }
+ else
+ first = false;
+ if (ev == -1)
+ s << "-";
+ else if (ev != 1)
+ s << ev << "*";
+ s << PPL::Variable(v);
+ }
+ }
+ // Inhomogeneous term.
+ Coefficient it = e[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();
+ return s;
+}
diff --git a/src/Linear_Expression.defs.hh b/src/Linear_Expression.defs.hh
new file mode 100644
index 0000000..b822e14
--- /dev/null
+++ b/src/Linear_Expression.defs.hh
@@ -0,0 +1,444 @@
+/* Linear_Expression class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Expression_defs_hh
+#define PPL_Linear_Expression_defs_hh 1
+
+#include "Linear_Expression.types.hh"
+#include "Scalar_Products.types.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+#include "Congruence.types.hh"
+#include "Grid_Generator.types.hh"
+#include "Linear_Row.defs.hh"
+#include "Coefficient.types.hh"
+#include "Variable.defs.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Congruence_System.types.hh"
+#include "Grid_Generator_System.types.hh"
+#include "Polyhedron.types.hh"
+#include "Grid.types.hh"
+#include "LP_Problem.types.hh"
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the congruence \p e1 = \p e2 \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \p e = \p n \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! 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);
+
+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
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+void swap(Parma_Polyhedra_Library::Linear_Expression& x,
+ Parma_Polyhedra_Library::Linear_Expression& y);
+
+} // namespace std
+
+//! 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 : private Linear_Row {
+public:
+ //! Default constructor: returns a copy of Linear_Expression::zero().
+ Linear_Expression();
+
+ //! Ordinary copy-constructor.
+ Linear_Expression(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);
+
+ //! Builds the linear expression corresponding to the variable \p v.
+ /*! \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(Variable v);
+
+ //! Builds the linear expression corresponding to constraint \p c.
+ /*!
+ Given the constraint
+ \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$,
+ where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+ this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+ If \p c is an inequality (resp., equality) constraint, then
+ the built linear expression is unique up to a positive
+ (resp., non-zero) factor.
+ */
+ explicit Linear_Expression(const Constraint& c);
+
+ /*! \brief
+ Builds the linear expression corresponding to generator \p g
+ (for points and closure points, the divisor is not copied).
+
+ Given the generator
+ \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
+ (where, for lines and rays, we have \f$d = 1\f$),
+ this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
+ The inhomogeneous term of the linear expression will always be 0.
+ If \p g is a ray, point or closure point (resp., a line), then
+ the linear expression is unique up to a positive
+ (resp., non-zero) factor.
+ */
+ explicit Linear_Expression(const Generator& g);
+
+ //! Builds the linear expression corresponding to congruence \p cg.
+ /*!
+ Given the congruence
+ \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$,
+ this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+ */
+ explicit Linear_Expression(const Congruence& cg);
+
+ //! 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;
+
+ //! 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 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;
+
+ //! Swaps \p *this with \p y.
+ void swap(Linear_Expression& y);
+
+private:
+ friend class Parma_Polyhedra_Library::Scalar_Products;
+ friend class Parma_Polyhedra_Library::Constraint;
+ friend class Parma_Polyhedra_Library::Generator;
+ // The following declaration grants access to Grid_Generator::parameter.
+ friend class Parma_Polyhedra_Library::Grid_Generator;
+ friend class Parma_Polyhedra_Library::Congruence;
+ // FIXME: the following friend declaration should be avoided.
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ friend class Parma_Polyhedra_Library::Grid;
+ friend class Parma_Polyhedra_Library::LP_Problem;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Constraint_System::affine_preimage().
+ friend class Parma_Polyhedra_Library::Constraint_System;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Generator_System::affine_image().
+ friend class Parma_Polyhedra_Library::Generator_System;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Congruence_System::affine_preimage().
+ friend class Parma_Polyhedra_Library::Congruence_System;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Grid_Generator_System::affine_image().
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+ //! Copy-constructor with a specified space dimension.
+ Linear_Expression(const Linear_Expression& e, dimension_type sz);
+
+ //! 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 sz, bool);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator+(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator+(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator+(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(const Linear_Expression& e);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator*(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator*(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator+=(Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+ Variable v);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator-=(Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+ Variable v);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator*=(Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Linear_Expression& e);
+
+ friend Congruence
+ Parma_Polyhedra_Library::operator%=(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+
+ friend Congruence
+ Parma_Polyhedra_Library::operator%=(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+};
+
+#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..ae0f301
--- /dev/null
+++ b/src/Linear_Expression.inlines.hh
@@ -0,0 +1,212 @@
+/* Linear_Expression class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Expression_inlines_hh
+#define PPL_Linear_Expression_inlines_hh 1
+
+#include "Variable.defs.hh"
+#include "Coefficient.defs.hh"
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Linear_Expression::max_space_dimension() {
+ return Linear_Row::max_space_dimension();
+}
+
+inline
+Linear_Expression::Linear_Expression()
+ : Linear_Row(1, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(dimension_type sz, bool)
+ : Linear_Row(sz, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Variable v)
+ : Linear_Row(v.space_dimension() <= max_space_dimension()
+ ? v.id() + 2
+ : (throw std::length_error("PPL::Linear_Expression::"
+ "Linear_Expression(v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension."),
+ v.id() + 2)
+ , Linear_Row::Flags()) {
+ (*this)[v.id() + 1] = 1;
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e)
+ : Linear_Row(e) {
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e,
+ dimension_type sz)
+ : Linear_Row(e, sz, sz) {
+}
+
+inline
+Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n)
+ : Linear_Row(1, Linear_Row::Flags()) {
+ (*this)[0] = n;
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+ return size() - 1;
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ return Coefficient_zero();
+ return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+ return Linear_Row::inhomogeneous_term();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+ static Linear_Expression z = Linear_Expression(Coefficient_zero());
+ return z;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+ return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+ return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \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) {
+ return n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+ // FIXME: provide a better implementation.
+ return Linear_Expression(v) + Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+ // FIXME: provide a better implementation.
+ return e + Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+ return v + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return -n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+ // FIXME: provide a better implementation.
+ return Linear_Expression(v) - Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+ // FIXME: provide a better implementation.
+ return Linear_Expression(v) - e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+ // FIXME: provide a better implementation.
+ return e - Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return n * e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ e[0] += n;
+ return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ e[0] -= n;
+ return e;
+}
+
+inline void
+Linear_Expression::swap(Linear_Expression& y) {
+ Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Expression& x,
+ Parma_Polyhedra_Library::Linear_Expression& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#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..3858003
--- /dev/null
+++ b/src/Linear_Expression.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Row.cc b/src/Linear_Row.cc
new file mode 100644
index 0000000..7d77920
--- /dev/null
+++ b/src/Linear_Row.cc
@@ -0,0 +1,209 @@
+/* Linear_Row class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_Row.defs.hh"
+#include "Coefficient.defs.hh"
+#include <algorithm>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Linear_Row::sign_normalize() {
+ if (is_line_or_equality()) {
+ Linear_Row& x = *this;
+ const dimension_type sz = x.size();
+ // `first_non_zero' indicates the index of the first
+ // coefficient of the row different from zero, disregarding
+ // the very first coefficient (inhomogeneous term / divisor).
+ dimension_type first_non_zero;
+ for (first_non_zero = 1; first_non_zero < sz; ++first_non_zero)
+ if (x[first_non_zero] != 0)
+ break;
+ if (first_non_zero < sz)
+ // If the first non-zero coefficient of the row is negative,
+ // we negate the entire row.
+ if (x[first_non_zero] < 0) {
+ for (dimension_type j = first_non_zero; j < sz; ++j)
+ neg_assign(x[j]);
+ // Also negate the first coefficient.
+ neg_assign(x[0]);
+ }
+ }
+}
+
+bool
+PPL::Linear_Row::check_strong_normalized() const {
+ Linear_Row tmp = *this;
+ tmp.strong_normalize();
+ return compare(*this, tmp) == 0;
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+int
+PPL::compare(const Linear_Row& x, const Linear_Row& 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;
+
+ // Compare all the coefficients of the row starting from position 1.
+ const dimension_type xsz = x.size();
+ const dimension_type ysz = y.size();
+ const dimension_type min_sz = std::min(xsz, ysz);
+ dimension_type i;
+ for (i = 1; i < min_sz; ++i)
+ if (const int comp = cmp(x[i], y[i]))
+ // There is at least a different coefficient.
+ return (comp > 0) ? 2 : -2;
+
+ // Handle the case where `x' and `y' are of different size.
+ if (xsz != ysz) {
+ for( ; i < xsz; ++i)
+ if (const int sign = sgn(x[i]))
+ return (sign > 0) ? 2 : -2;
+ for( ; i < ysz; ++i)
+ if (const int sign = sgn(y[i]))
+ return (sign < 0) ? 2 : -2;
+ }
+
+ // 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.
+ if (const int comp = cmp(x[0], y[0]))
+ return (comp > 0) ? 1 : -1;
+
+ // `x' and `y' are equal.
+ return 0;
+}
+
+void
+PPL::Linear_Row::linear_combine(const Linear_Row& y, const dimension_type k) {
+ Linear_Row& x = *this;
+ // We can combine only vector of the same dimension.
+ assert(x.size() == y.size());
+ 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.
+ TEMP_INTEGER(normalized_x_k);
+ TEMP_INTEGER(normalized_y_k);
+ normalize2(x[k], y[k], normalized_x_k, normalized_y_k);
+ for (dimension_type i = size(); i-- > 0; )
+ if (i != k) {
+ Coefficient& x_i = x[i];
+ x_i *= normalized_y_k;
+ sub_mul_assign(x_i, y[i], normalized_x_k);
+ }
+ x[k] = 0;
+ x.strong_normalize();
+}
+
+bool
+PPL::Linear_Row::all_homogeneous_terms_are_zero() const {
+ const Linear_Row& x = *this;
+ for (dimension_type i = x.size(); --i > 0; )
+ if (x[i] != 0)
+ return false;
+ return true;
+}
+
+namespace {
+
+// These are the keywords that indicate the individual assertions.
+const char* rpi_valid = "RPI_V";
+const char* is_rpi = "RPI";
+const char* nnc_valid = "NNC_V";
+const char* is_nnc = "NNC";
+const char* bit_names[] = {rpi_valid, is_rpi, nnc_valid, is_nnc};
+
+} // namespace
+
+void
+PPL::Linear_Row::Flags::ascii_dump(std::ostream& s) const {
+ s << (test_bits(1 << Flags::rpi_validity_bit) ? '+' : '-')
+ << rpi_valid << ' '
+ << (test_bits(1 << Flags::rpi_bit) ? '+' : '-')
+ << is_rpi << ' '
+ << ' '
+ << (test_bits(1 << Flags::nnc_validity_bit) ? '+' : '-')
+ << nnc_valid << ' '
+ << (test_bits(1 << Flags::nnc_bit) ? '+' : '-')
+ << is_nnc;
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row::Flags);
+
+bool
+PPL::Linear_Row::Flags::ascii_load(std::istream& s) {
+ std::string str;
+ // Assume that the bits are used in sequence.
+ reset_bits(std::numeric_limits<base_type>::max());
+ for (unsigned int bit = 0;
+ bit < (sizeof(bit_names) / sizeof(char*));
+ ++bit) {
+ if (!(s >> str))
+ return false;
+ if (str[0] == '+')
+ set_bits(1 << Row::Flags::first_free_bit + bit);
+ else if (str[0] != '-')
+ return false;
+ if (str.compare(1, strlen(bit_names[bit]), bit_names[bit]) != 0)
+ return false;
+ }
+ return true;
+}
+
+void
+PPL::Linear_Row::ascii_dump(std::ostream& s) const {
+ const Row& x = *this;
+ dimension_type x_size = x.size();
+ for (dimension_type i = 0; i < x_size; ++i)
+ s << x[i] << ' ';
+ s << "f ";
+ flags().ascii_dump(s);
+ s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_Row);
+
+bool
+PPL::Linear_Row::ascii_load(std::istream& s) {
+ Row& x = *this;
+ std::string str;
+ const dimension_type x_size = x.size();
+ for (dimension_type col = 0; col < x_size; ++col)
+ if (!(s >> x[col]))
+ return false;
+ if (!(s >> str) || (str.compare("f") != 0))
+ return false;
+ return flags().ascii_load(s);
+}
+
+bool
+PPL::Linear_Row::OK(const dimension_type row_size,
+ const dimension_type row_capacity) const {
+ return Row::OK(row_size, row_capacity);
+}
diff --git a/src/Linear_Row.defs.hh b/src/Linear_Row.defs.hh
new file mode 100644
index 0000000..8088795
--- /dev/null
+++ b/src/Linear_Row.defs.hh
@@ -0,0 +1,458 @@
+/* Linear_Row class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Row_defs_hh
+#define PPL_Linear_Row_defs_hh 1
+
+#include "Linear_Row.types.hh"
+#include "globals.defs.hh"
+#include "Row.defs.hh"
+#include "Topology.hh"
+#include "Linear_Expression.types.hh"
+#include "Constraint.types.hh"
+#include "Generator.types.hh"
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for linear expressions, constraints and generators.
+/*! \ingroup PPL_CXX_interface
+ The class Linear_Row allows us to build objects of the form
+ \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$,
+ i.e., a finite sequence of coefficients subscripted by a pair of flags,
+ which are both stored in a Linear_Row::Flags object.
+ The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents
+ the <EM>topology</EM> and
+ the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents
+ the <EM>kind</EM> of the Linear_Row object.
+ Note that, even though all the four possible combinations of topology
+ and kind values will result in a legal Linear_Row::Flags object, some
+ of these pose additional constraints on the values of the Linear_Row's
+ coefficients.
+
+ When \f$t = c\f$, we have the following cases
+ (\f$d\f$ is the dimension of the vector space):
+ - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+ represents the equality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+ represents the non-strict inequality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+ represents the line of direction
+ \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+ represents the ray of direction
+ \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$,
+ represents the point
+ \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+ When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is
+ associated to the slack variable \f$\epsilon\f$, so that we have the
+ following cases (\f$d\f$ is again the dimension of the vector space,
+ but this time we have \f$d+2\f$ coefficients):
+ - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+ represents the equality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+ represents the non-strict inequality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+ with \f$e < 0\f$, represents the strict inequality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+ represents the line of direction
+ \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+ represents the ray of direction
+ \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+ with \f$b > 0\f$ and \f$e > 0\f$, represents the point
+ \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$,
+ with \f$b > 0\f$, represents the closure point
+ \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+ So, a Linear_Row can be both a constraint and a generator: it can be an
+ equality, a strict or non-strict inequality, a line, a ray, a point
+ or a closure point.
+
+ The inhomogeneous term of a constraint can be zero or different from zero.
+
+ Points and closure points must have a positive inhomogeneous term
+ (which is used as a common divisor for all the other coefficients),
+ lines and rays must have the inhomogeneous term equal to zero.
+ If needed, the coefficients of points and closure points are negated
+ at creation time so that they satisfy this invariant.
+ The invariant is maintained because, when combining a point or closure
+ point with another generator, we only consider positive combinations.
+
+ The \f$\epsilon\f$ coefficient, when present, is negative for strict
+ inequality constraints, positive for points and equal to zero in all
+ the other cases.
+ Note that the above description corresponds to the end-user, high-level
+ view of a Linear_Row object. In the implementation, to allow for code reuse,
+ it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on
+ the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object
+ on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack
+ variable \f$\epsilon\f$ as an ordinary dimension of the vector space.
+
+ A Linear_Row object implementing a Linear_Expression is always of the form
+ \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the
+ linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_Row : public Row {
+public:
+ //! The possible kinds of Linear_Row objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ The type of the object to which the coefficients refer to,
+ encoding both topology and kind.
+
+ \ingroup PPL_CXX_interface
+ This combines the information about the topology (necessarily closed
+ or not) and the kind (line/equality or ray/point/inequality)
+ of a Linear_Row object.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ class Flags : public Row::Flags {
+ public:
+ //! Default constructor: builds an object where all flags are invalid.
+ Flags();
+
+ //! Builds an object corresponding to the topology \p t.
+ explicit Flags(Topology t);
+
+ //! Builds an object corresponding to the topology \p t and kind \p k.
+ Flags(Topology t, Kind k);
+
+ //! \name Testing and setting the type
+ //@{
+ Topology topology() const;
+ bool is_necessarily_closed() const;
+ bool is_not_necessarily_closed() const;
+ bool is_line_or_equality() const;
+ bool is_ray_or_point_or_inequality() const;
+
+ void set_necessarily_closed();
+ void set_not_necessarily_closed();
+ void set_is_line_or_equality();
+ void set_is_ray_or_point_or_inequality();
+ //@} // Testing and setting the type
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+ bool operator==(const Flags& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are different.
+ */
+ bool operator!=(const Flags& y) const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Flags representation from \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by \ref ascii_dump.
+ */
+ bool ascii_load(std::istream& s);
+
+ private:
+ //! Builds the type from a bit-mask.
+ explicit Flags(base_type mask);
+
+ //! \name The bits that are currently in use
+ //@{
+ // NB: ascii_load assumes that these are sequential.
+ static const unsigned rpi_validity_bit
+ = Row::Flags::first_free_bit + 0;
+ static const unsigned rpi_bit
+ = Row::Flags::first_free_bit + 1;
+ static const unsigned nnc_validity_bit
+ = Row::Flags::first_free_bit + 2;
+ static const unsigned nnc_bit
+ = Row::Flags::first_free_bit + 3;
+ //@}
+
+ protected:
+ //! Index of the first bit derived classes can use.
+ static const unsigned first_free_bit
+ = Row::Flags::first_free_bit + 4;
+
+ friend class Parma_Polyhedra_Library::Linear_Row;
+ };
+
+ //! Pre-constructs a row: construction must be completed by construct().
+ Linear_Row();
+
+ //! \name Post-constructors
+ //@{
+ //! Constructs properly a default-constructed element.
+ /*!
+ Builds a row with type \p t, size \p sz and minimum capacity.
+ */
+ void construct(dimension_type sz, Flags f);
+
+ //! 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.
+
+ \param f
+ Flags for the row that will be constructed.
+
+ The row that we are constructing has a minimum capacity, i.e., it
+ can contain at least \p capacity elements, \p sz of which will be
+ default-constructed now. The row flags are set to \p f.
+ */
+ void construct(dimension_type sz, dimension_type capacity, Flags f);
+ //@} // Post-constructors
+
+ //! Tight constructor: resizing will require reallocation.
+ Linear_Row(dimension_type sz, Flags f);
+
+ //! Sizing constructor with capacity.
+ Linear_Row(dimension_type sz, dimension_type capacity, Flags f);
+
+ //! Ordinary copy constructor.
+ Linear_Row(const Linear_Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to \p y size.
+ */
+ Linear_Row(const Linear_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.
+ */
+ Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~Linear_Row();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns a const reference to the flags of \p *this.
+ const Flags& flags() const;
+
+ //! Returns a non-const reference to the flags of \p *this.
+ Flags& flags();
+
+ //! 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 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
+
+ //! Returns the maximum space dimension a Linear_Row 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 inhomogeneous term.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns the coefficient \f$a_n\f$.
+ Coefficient_traits::const_reference coefficient(dimension_type n) const;
+
+ /*! \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 Linear_Row objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Linear_Row::normalize() and Linear_Row::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 <CODE>*this[k]</CODE> is 0.
+ /*!
+ \param y
+ The Linear_Row that will be combined with \p *this object;
+
+ \param k
+ The position of \p *this that have to be \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the element of index \p k equal to \f$0\f$. Then it assigns
+ the resulting Linear_Row to \p *this and normalizes it.
+ */
+ void linear_combine(const Linear_Row& y, dimension_type k);
+
+ /*! \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;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Linear_Row representation from \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by \ref ascii_dump.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+ friend class Parma_Polyhedra_Library::Linear_Expression;
+ friend class Parma_Polyhedra_Library::Constraint;
+ friend class Parma_Polyhedra_Library::Generator;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Row */
+bool operator==(const Linear_Row& x, const Linear_Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Row */
+bool operator!=(const Linear_Row& x, const Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Row
+ \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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Linear_Row& x, const Linear_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_Row& x,
+ Parma_Polyhedra_Library::Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y);
+
+} // namespace std
+
+#include "Linear_Row.inlines.hh"
+
+#endif // !defined(PPL_Linear_Row_defs_hh)
diff --git a/src/Linear_Row.inlines.hh b/src/Linear_Row.inlines.hh
new file mode 100644
index 0000000..9444163
--- /dev/null
+++ b/src/Linear_Row.inlines.hh
@@ -0,0 +1,290 @@
+/* Linear_Row class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_Row_inlines_hh
+#define PPL_Linear_Row_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_Row::Flags::Flags()
+ : Row::Flags() {
+ // Note that the constructed type has its validity bit unset.
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t)
+ : Row::Flags(t << nnc_bit) {
+#ifndef NDEBUG
+ set_bits(1 << nnc_validity_bit);
+#endif
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t, const Kind k)
+ : Row::Flags((k << rpi_bit) | (t << nnc_bit)) {
+#ifndef NDEBUG
+ set_bits((1 << rpi_validity_bit)
+ | (1 << nnc_validity_bit));
+#endif
+}
+
+inline bool
+Linear_Row::Flags::is_ray_or_point_or_inequality() const {
+ assert(test_bits(1 << rpi_validity_bit));
+ return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline void
+Linear_Row::Flags::set_is_ray_or_point_or_inequality() {
+#ifndef NDEBUG
+ set_bits(1 << rpi_validity_bit);
+#endif
+ set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_line_or_equality() const {
+ assert(test_bits(1 << rpi_validity_bit));
+ return !is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::Flags::set_is_line_or_equality() {
+#ifndef NDEBUG
+ set_bits(1 << rpi_validity_bit);
+#endif
+ reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_not_necessarily_closed() const {
+ assert(test_bits(1 << nnc_validity_bit));
+ return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_necessarily_closed() const {
+ assert(test_bits(1 << nnc_validity_bit));
+ return !is_not_necessarily_closed();
+}
+
+inline void
+Linear_Row::Flags::set_not_necessarily_closed() {
+#ifndef NDEBUG
+ set_bits(1 << nnc_validity_bit);
+#endif
+ set_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline void
+Linear_Row::Flags::set_necessarily_closed() {
+#ifndef NDEBUG
+ set_bits(1 << nnc_validity_bit);
+#endif
+ reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline Topology
+Linear_Row::Flags::topology() const {
+ return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED;
+}
+
+inline bool
+Linear_Row::Flags::operator==(const Flags& y) const {
+ base_type mask = low_bits_mask<base_type>(first_free_bit);
+ return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Linear_Row::Flags::operator!=(const Flags& y) const {
+ return !operator==(y);
+}
+
+inline const Linear_Row::Flags&
+Linear_Row::flags() const {
+ return static_cast<const Flags&>(Row::flags());
+}
+
+inline Linear_Row::Flags&
+Linear_Row::flags() {
+ return static_cast<Flags&>(Row::flags());
+}
+
+inline bool
+Linear_Row::is_necessarily_closed() const {
+ return flags().is_necessarily_closed();
+}
+
+inline dimension_type
+Linear_Row::max_space_dimension() {
+ // The first coefficient holds the inhomogeneous term or the divisor.
+ // In NNC rows, the last coefficient is for the epsilon dimension.
+ return max_size() - 2;
+}
+
+inline dimension_type
+Linear_Row::space_dimension() const {
+ const dimension_type sz = size();
+ return (sz == 0)
+ ? 0
+ : sz - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline
+Linear_Row::Linear_Row()
+ : Row() {
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const dimension_type capacity,
+ const Flags f) {
+ Row::construct(sz, capacity, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity,
+ const Flags f) {
+ construct(sz, capacity, f);
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const Flags f) {
+ construct(sz, sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const Flags f) {
+ construct(sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y)
+ : Row(y) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+ const dimension_type capacity)
+ : Row(y, capacity) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+ const dimension_type sz, const dimension_type capacity)
+ : Row(y, sz, capacity) {
+}
+
+inline
+Linear_Row::~Linear_Row() {
+}
+
+inline bool
+Linear_Row::is_line_or_equality() const {
+ return flags().is_line_or_equality();
+}
+
+inline bool
+Linear_Row::is_ray_or_point_or_inequality() const {
+ return flags().is_ray_or_point_or_inequality();
+}
+
+inline Topology
+Linear_Row::topology() const {
+ return flags().topology();
+}
+
+inline void
+Linear_Row::set_is_line_or_equality() {
+ flags().set_is_line_or_equality();
+}
+
+inline void
+Linear_Row::set_is_ray_or_point_or_inequality() {
+ flags().set_is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::set_necessarily_closed() {
+ flags().set_necessarily_closed();
+}
+
+inline void
+Linear_Row::set_not_necessarily_closed() {
+ flags().set_not_necessarily_closed();
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::inhomogeneous_term() const {
+ return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::coefficient(const dimension_type k) const {
+ return (*this)[k+1];
+}
+
+inline void
+Linear_Row::strong_normalize() {
+ normalize();
+ sign_normalize();
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator==(const Linear_Row& x, const Linear_Row& y) {
+ return x.flags() == y.flags()
+ && static_cast<const Row&>(x) == static_cast<const Row&>(y);
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator!=(const Linear_Row& x, const Linear_Row& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Row& x,
+ Parma_Polyhedra_Library::Linear_Row& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Linear_Row_inlines_hh)
diff --git a/src/Linear_Row.types.hh b/src/Linear_Row.types.hh
new file mode 100644
index 0000000..618a4cd
--- /dev/null
+++ b/src/Linear_Row.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Row_types_hh
+#define PPL_Linear_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_Row_types_hh)
diff --git a/src/Linear_System.cc b/src/Linear_System.cc
new file mode 100644
index 0000000..e65fc2b
--- /dev/null
+++ b/src/Linear_System.cc
@@ -0,0 +1,916 @@
+/* Linear_System class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_System.defs.hh"
+#include "Coefficient.defs.hh"
+#include "Row.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <algorithm>
+#include <iostream>
+#include <string>
+#include <deque>
+
+#include "swapping_sort.icc"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::dimension_type
+PPL::Linear_System::num_lines_or_equalities() const {
+ 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;
+}
+
+void
+PPL::Linear_System::merge_rows_assign(const Linear_System& y) {
+ assert(row_size >= y.row_size);
+ // Both systems have to be sorted and have no pending rows.
+ assert(check_sorted() && y.check_sorted());
+ assert(num_pending_rows() == 0 && y.num_pending_rows() == 0);
+
+ Linear_System& x = *this;
+
+ // A temporary vector of rows...
+ std::vector<Row> tmp;
+ // ... with enough capacity not to require any reallocations.
+ tmp.reserve(compute_capacity(x.num_rows() + y.num_rows(), max_num_rows()));
+
+ dimension_type xi = 0;
+ dimension_type x_num_rows = x.num_rows();
+ dimension_type yi = 0;
+ 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'
+ std::swap(x[xi++], *tmp.insert(tmp.end(), Linear_Row()));
+ if (comp == 0)
+ // A duplicate element.
+ ++yi;
+ }
+ else {
+ // (comp > 0)
+ Linear_Row copy(y[yi++], row_size, row_capacity);
+ std::swap(copy, *tmp.insert(tmp.end(), Linear_Row()));
+ }
+ }
+ // Insert what is left.
+ if (xi < x_num_rows)
+ while (xi < x_num_rows)
+ std::swap(x[xi++], *tmp.insert(tmp.end(), Linear_Row()));
+ else
+ while (yi < y_num_rows) {
+ Linear_Row copy(y[yi++], row_size, row_capacity);
+ std::swap(copy, *tmp.insert(tmp.end(), Linear_Row()));
+ }
+
+ // We get the result vector and let the old one be destroyed.
+ std::swap(tmp, rows);
+ // There are no pending rows.
+ unset_pending_rows();
+ assert(check_sorted());
+}
+
+void
+PPL::Linear_System::set_rows_topology() {
+ Linear_System& x = *this;
+ if (is_necessarily_closed())
+ for (dimension_type i = num_rows(); i-- > 0; )
+ x[i].set_necessarily_closed();
+ else
+ for (dimension_type i = num_rows(); i-- > 0; )
+ x[i].set_not_necessarily_closed();
+}
+
+void
+PPL::Linear_System::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.
+ const Linear_System& x = *this;
+ dimension_type x_num_rows = x.num_rows();
+ dimension_type x_num_columns = x.num_columns();
+ s << "topology " << (is_necessarily_closed()
+ ? "NECESSARILY_CLOSED"
+ : "NOT_NECESSARILY_CLOSED")
+ << "\n"
+ << x_num_rows << " x " << x_num_columns
+ << (x.sorted ? "(sorted)" : "(not_sorted)")
+ << "\n"
+ << "index_first_pending " << x.first_pending_row()
+ << "\n";
+ for (dimension_type i = 0; i < x_num_rows; ++i)
+ x[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Linear_System);
+
+bool
+PPL::Linear_System::ascii_load(std::istream& s) {
+ std::string str;
+ if (!(s >> str) || str != "topology")
+ return false;
+ if (!(s >> str))
+ return false;
+ if (str == "NECESSARILY_CLOSED")
+ set_necessarily_closed();
+ else {
+ if (str != "NOT_NECESSARILY_CLOSED")
+ return false;
+ set_not_necessarily_closed();
+ }
+
+ dimension_type nrows;
+ dimension_type ncols;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str))
+ return false;
+ if (!(s >> ncols))
+ return false;
+ resize_no_copy(nrows, ncols);
+
+ if (!(s >> str) || (str != "(sorted)" && str != "(not_sorted)"))
+ return false;
+ set_sorted(str == "(sorted)");
+ dimension_type index;
+ if (!(s >> str) || str != "index_first_pending")
+ return false;
+ if (!(s >> index))
+ return false;
+ set_index_first_pending_row(index);
+
+ Linear_System& x = *this;
+ for (dimension_type row = 0; row < nrows; ++row)
+ if (!x[row].ascii_load(s))
+ return false;
+
+ // Check for well-formedness.
+ assert(OK(true));
+ return true;
+}
+
+void
+PPL::Linear_System::insert(const Linear_Row& r) {
+ // The added row must be strongly normalized and have the same
+ // topology of the system.
+ assert(r.check_strong_normalized());
+ assert(topology() == r.topology());
+ // This method is only used when the system has no pending rows.
+ assert(num_pending_rows() == 0);
+
+ const dimension_type old_num_rows = num_rows();
+ const dimension_type old_num_columns = num_columns();
+ const dimension_type r_size = r.size();
+
+ // Resize the system, if necessary.
+ if (r_size > old_num_columns) {
+ add_zero_columns(r_size - old_num_columns);
+ if (!is_necessarily_closed() && old_num_rows != 0)
+ // Move the epsilon coefficients to the last column
+ // (note: sorting is preserved).
+ swap_columns(old_num_columns - 1, r_size - 1);
+ add_row(r);
+ }
+ else if (r_size < old_num_columns)
+ if (is_necessarily_closed() || old_num_rows == 0)
+ add_row(Linear_Row(r, old_num_columns, row_capacity));
+ else {
+ // Create a resized copy of the row (and move the epsilon
+ // coefficient to its last position).
+ Linear_Row tmp_row(r, old_num_columns, row_capacity);
+ std::swap(tmp_row[r_size - 1], tmp_row[old_num_columns - 1]);
+ add_row(tmp_row);
+ }
+ else
+ // Here r_size == old_num_columns.
+ add_row(r);
+
+ // The added row was not a pending row.
+ assert(num_pending_rows() == 0);
+ // Do not check for strong normalization,
+ // because no modification of rows has occurred.
+ assert(OK(false));
+}
+
+void
+PPL::Linear_System::insert_pending(const Linear_Row& r) {
+ // The added row must be strongly normalized and have the same
+ // topology of the system.
+ assert(r.check_strong_normalized());
+ assert(topology() == r.topology());
+
+ const dimension_type old_num_rows = num_rows();
+ const dimension_type old_num_columns = num_columns();
+ const dimension_type r_size = r.size();
+
+ // Resize the system, if necessary.
+ if (r_size > old_num_columns) {
+ add_zero_columns(r_size - old_num_columns);
+ if (!is_necessarily_closed() && old_num_rows != 0)
+ // Move the epsilon coefficients to the last column
+ // (note: sorting is preserved).
+ swap_columns(old_num_columns - 1, r_size - 1);
+ add_pending_row(r);
+ }
+ else if (r_size < old_num_columns)
+ if (is_necessarily_closed() || old_num_rows == 0)
+ add_pending_row(Linear_Row(r, old_num_columns, row_capacity));
+ else {
+ // Create a resized copy of the row (and move the epsilon
+ // coefficient to its last position).
+ Linear_Row tmp_row(r, old_num_columns, row_capacity);
+ std::swap(tmp_row[r_size - 1], tmp_row[old_num_columns - 1]);
+ add_pending_row(tmp_row);
+ }
+ else
+ // Here r_size == old_num_columns.
+ add_pending_row(r);
+
+ // The added row was a pending row.
+ assert(num_pending_rows() > 0);
+ // Do not check for strong normalization,
+ // because no modification of rows has occurred.
+ assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_pending_rows(const Linear_System& y) {
+ Linear_System& x = *this;
+ assert(x.row_size == y.row_size);
+
+ const dimension_type x_n_rows = x.num_rows();
+ const dimension_type y_n_rows = y.num_rows();
+ // Grow to the required size without changing sortedness.
+ const bool was_sorted = sorted;
+ add_zero_rows(y_n_rows, Linear_Row::Flags(row_topology));
+ sorted = was_sorted;
+
+ // Copy the rows of `y', forcing size and capacity.
+ for (dimension_type i = y_n_rows; i-- > 0; ) {
+ Row copy(y[i], x.row_size, x.row_capacity);
+ std::swap(copy, x[x_n_rows+i]);
+ }
+ // Do not check for strong normalization,
+ // because no modification of rows has occurred.
+ assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_rows(const Linear_System& y) {
+ assert(num_pending_rows() == 0);
+
+ // Adding no rows is a no-op.
+ if (y.num_rows() == 0)
+ return;
+
+ // Check if sortedness is preserved.
+ if (is_sorted())
+ if (!y.is_sorted() || y.num_pending_rows() > 0)
+ set_sorted(false);
+ else {
+ // `y' is sorted and has no pending rows.
+ const dimension_type n_rows = num_rows();
+ if (n_rows > 0)
+ set_sorted(compare((*this)[n_rows-1], y[0]) <= 0);
+ }
+
+ // Add the rows of `y' as if they were pending.
+ add_pending_rows(y);
+ // There are no pending_rows.
+ unset_pending_rows();
+
+ // Do not check for strong normalization,
+ // because no modification of rows has occurred.
+ assert(OK(false));
+}
+
+void
+PPL::Linear_System::sort_rows() {
+ const dimension_type num_pending = num_pending_rows();
+ // We sort the non-pending rows only.
+ sort_rows(0, first_pending_row());
+ set_index_first_pending_row(num_rows() - num_pending);
+ sorted = true;
+ // Do not check for strong normalization,
+ // because no modification of rows has occurred.
+ assert(OK(false));
+}
+
+void
+PPL::Linear_System::sort_rows(const dimension_type first_row,
+ const dimension_type last_row) {
+ assert(first_row <= last_row && last_row <= num_rows());
+ // We cannot mix pending and non-pending rows.
+ assert(first_row >= first_pending_row() || last_row <= first_pending_row());
+
+ // First sort without removing duplicates.
+ std::vector<Row>::iterator first = rows.begin() + first_row;
+ std::vector<Row>::iterator last = rows.begin() + last_row;
+ swapping_sort(first, last, Row_Less_Than());
+ // Second, move duplicates to the end.
+ std::vector<Row>::iterator new_last = swapping_unique(first, last);
+ // Finally, remove duplicates.
+ rows.erase(new_last, last);
+ // NOTE: we cannot check for well-formedness of the system here,
+ // because the caller still has to update `index_first_pending'.
+}
+
+void
+PPL::Linear_System::add_row(const Linear_Row& r) {
+ // The added row must be strongly normalized and have the same
+ // number of elements as the existing rows of the system.
+ assert(r.check_strong_normalized());
+ assert(r.size() == row_size);
+ // This method is only used when the system has no pending rows.
+ assert(num_pending_rows() == 0);
+
+ const bool was_sorted = is_sorted();
+
+ Matrix::add_row(r);
+
+ // We update `index_first_pending', because it must be equal to
+ // `num_rows()'.
+ set_index_first_pending_row(num_rows());
+
+ 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.
+ Linear_System& x = *this;
+ set_sorted(compare(x[nrows-2], x[nrows-1]) <= 0);
+ }
+ else
+ // A system having only one row is sorted.
+ set_sorted(true);
+ }
+ // The added row was not a pending row.
+ assert(num_pending_rows() == 0);
+ // Do not check for strong normalization, because no modification of
+ // rows has occurred.
+ assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_pending_row(const Linear_Row& r) {
+ // The added row must be strongly normalized and have the same
+ // number of elements of the existing rows of the system.
+ assert(r.check_strong_normalized());
+ assert(r.size() == row_size);
+
+ const dimension_type new_rows_size = rows.size() + 1;
+ if (rows.capacity() < new_rows_size) {
+ // Reallocation will take place.
+ std::vector<Row> new_rows;
+ new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_rows_size, Row());
+ // Put the new row in place.
+ Row new_row(r, row_capacity);
+ dimension_type i = new_rows_size-1;
+ std::swap(new_rows[i], new_row);
+ // Steal the old rows.
+ while (i-- > 0)
+ new_rows[i].swap(rows[i]);
+ // Put the new rows into place.
+ std::swap(rows, new_rows);
+ }
+ else {
+ // Reallocation will NOT take place.
+ // Inserts a new empty row at the end, then substitutes it with a
+ // copy of the given row.
+ Row tmp(r, row_capacity);
+ std::swap(*rows.insert(rows.end(), Row()), tmp);
+ }
+
+ // The added row was a pending row.
+ assert(num_pending_rows() > 0);
+ // Do not check for strong normalization, because no modification of
+ // rows has occurred.
+ assert(OK(false));
+}
+
+void
+PPL::Linear_System::add_pending_row(const Linear_Row::Flags flags) {
+ const dimension_type new_rows_size = rows.size() + 1;
+ if (rows.capacity() < new_rows_size) {
+ // Reallocation will take place.
+ std::vector<Row> new_rows;
+ new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_rows_size, Row());
+ // Put the new row in place.
+ Linear_Row new_row(row_size, row_capacity, flags);
+ dimension_type i = new_rows_size-1;
+ std::swap(new_rows[i], new_row);
+ // Steal the old rows.
+ while (i-- > 0)
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::swap(rows, new_rows);
+ }
+ else {
+ // Reallocation will NOT take place.
+ // Insert a new empty row at the end, then construct it assigning
+ // it the given type.
+ Row& new_row = *rows.insert(rows.end(), Row());
+ static_cast<Linear_Row&>(new_row).construct(row_size, row_capacity, flags);
+ }
+
+ // The added row was a pending row.
+ assert(num_pending_rows() > 0);
+}
+
+void
+PPL::Linear_System::normalize() {
+ Linear_System& x = *this;
+ // We normalize also the pending rows.
+ for (dimension_type i = num_rows(); i-- > 0; )
+ x[i].normalize();
+ set_sorted(false);
+}
+
+void
+PPL::Linear_System::strong_normalize() {
+ Linear_System& x = *this;
+ // We strongly normalize also the pending rows.
+ for (dimension_type i = num_rows(); i-- > 0; )
+ x[i].strong_normalize();
+ set_sorted(false);
+}
+
+void
+PPL::Linear_System::sign_normalize() {
+ Linear_System& x = *this;
+ // We sign-normalize also the pending rows.
+ for (dimension_type i = num_rows(); i-- > 0; )
+ x[i].sign_normalize();
+ set_sorted(false);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+bool
+PPL::operator==(const Linear_System& x, const Linear_System& y) {
+ if (x.num_columns() != y.num_columns())
+ 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;
+ // Notice that calling operator==(const Matrix&, const Matrix&)
+ // 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;
+}
+
+void
+PPL::Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat) {
+ Linear_System& sys = *this;
+ // We can only sort the non-pending part of the system.
+ assert(sys.first_pending_row() == sat.num_rows());
+ if (sys.first_pending_row() <= 1) {
+ sys.set_sorted(true);
+ return;
+ }
+
+ // First, sort `sys' (keeping `sat' consistent) without removing duplicates.
+ With_Saturation_Matrix_iterator first(sys.rows.begin(), sat.rows.begin());
+ With_Saturation_Matrix_iterator last = first + sat.num_rows();
+ swapping_sort(first, last, Row_Less_Than());
+ // Second, move duplicates in `sys' to the end (keeping `sat' consistent).
+ With_Saturation_Matrix_iterator new_last = swapping_unique(first, last);
+
+ const dimension_type num_duplicates = last - new_last;
+ const dimension_type new_first_pending_row
+ = sys.first_pending_row() - num_duplicates;
+
+ if (sys.num_pending_rows() > 0) {
+ // In this case, we must put the duplicates after the pending rows.
+ const dimension_type n_rows = sys.num_rows() - 1;
+ for (dimension_type i = 0; i < num_duplicates; ++i)
+ std::swap(sys[new_first_pending_row + i], sys[n_rows - i]);
+ }
+ // Erasing the duplicated rows...
+ sys.erase_to_end(sys.num_rows() - num_duplicates);
+ sys.set_index_first_pending_row(new_first_pending_row);
+ // ... and the corresponding rows of the saturation matrix.
+ sat.rows_erase_to_end(sat.num_rows() - num_duplicates);
+ assert(sys.check_sorted());
+ // Now the system is sorted.
+ sys.set_sorted(true);
+}
+
+PPL::dimension_type
+PPL::Linear_System::gauss(const dimension_type n_lines_or_equalities) {
+ Linear_System& x = *this;
+ // This method is only applied to a well-formed 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.
+ assert(x.OK(true));
+ assert(x.num_pending_rows() == 0);
+ assert(n_lines_or_equalities == x.num_lines_or_equalities());
+#ifndef NDEBUG
+ for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+ assert(x[i].is_line_or_equality());
+#endif
+
+ dimension_type rank = 0;
+ // Will keep track of the variations on the system of equalities.
+ bool changed = false;
+ for (dimension_type j = x.num_columns(); 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 (x[i][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) {
+ std::swap(x[i], x[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 (x[k][j] != 0) {
+ x[k].linear_combine(x[rank], j);
+ changed = true;
+ }
+ // Already dealt with the rank-th row.
+ ++rank;
+ // Consider another column index `j'.
+ break;
+ }
+ if (changed)
+ x.set_sorted(false);
+ // A well-formed system is returned.
+ assert(x.OK(true));
+ return rank;
+}
+
+void
+PPL::Linear_System
+::back_substitute(const dimension_type n_lines_or_equalities) {
+ Linear_System& x = *this;
+ // This method is only applied to a well-formed 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.
+ assert(x.OK(true));
+ assert(x.num_pending_rows() == 0);
+ assert(n_lines_or_equalities <= x.num_lines_or_equalities());
+#ifndef NDEBUG
+ for (dimension_type i = n_lines_or_equalities; i-- > 0; )
+ assert(x[i].is_line_or_equality());
+#endif
+
+ const dimension_type nrows = x.num_rows();
+ const dimension_type ncols = x.num_columns();
+ // Trying to keep sortedness.
+ bool still_sorted = x.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.
+ Linear_Row& x_k = x[k];
+ dimension_type j = ncols - 1;
+ while (j != 0 && x_k[j] == 0)
+ --j;
+
+ // Go through the equalities above `x_k'.
+ for (dimension_type i = k; i-- > 0; ) {
+ Linear_Row& x_i = x[i];
+ if (x_i[j] != 0) {
+ // Combine linearly `x_i' with `x_k'
+ // so that `x_i[j]' becomes zero.
+ x_i.linear_combine(x_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 `x_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 = (x_k[j] < 0);
+ if (have_to_negate)
+ for (dimension_type h = ncols; h-- > 0; )
+ PPL::neg_assign(x_k[h]);
+ // 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) {
+ Linear_Row& x_i = x[i];
+ if (x_i[j] != 0) {
+ // Combine linearly the `x_i' with `x_k'
+ // so that `x_i[j]' becomes zero.
+ x_i.linear_combine(x_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 `x_k' to restore strong-normalization.
+ for (dimension_type h = ncols; h-- > 0; )
+ PPL::neg_assign(x_k[h]);
+ }
+
+ // Trying to keep sortedness.
+ for (dimension_type i = 0; still_sorted && i < nrows-1; ++i)
+ if (check_for_sortedness[i])
+ // Have to check sortedness of `x[i]' with respect to `x[i+1]'.
+ still_sorted = (compare(x[i], x[i+1]) <= 0);
+ // Set the sortedness flag.
+ x.set_sorted(still_sorted);
+
+ // A well-formed system is returned.
+ assert(x.OK(true));
+}
+
+void
+PPL::Linear_System::simplify() {
+ Linear_System& x = *this;
+ // This method is only applied to a well-formed system
+ // having no pending rows.
+ assert(x.OK(true));
+ assert(x.num_pending_rows() == 0);
+
+ // Partially sort the linear system so that all lines/equalities come first.
+ dimension_type nrows = x.num_rows();
+ dimension_type n_lines_or_equalities = 0;
+ for (dimension_type i = 0; i < nrows; ++i)
+ if (x[i].is_line_or_equality()) {
+ if (n_lines_or_equalities < i) {
+ std::swap(x[i], x[n_lines_or_equalities]);
+ // The system was not sorted.
+ assert(!x.sorted);
+ }
+ ++n_lines_or_equalities;
+ }
+ // Apply Gaussian's elimination to the subsystem of lines/equalities.
+ const dimension_type rank = x.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; )
+ std::swap(x[--nrows], x[rank + i]);
+ x.erase_to_end(nrows);
+ x.unset_pending_rows();
+ if (n_rays_or_points_or_inequalities > num_swaps)
+ x.set_sorted(false);
+ n_lines_or_equalities = rank;
+ }
+ // Apply back-substitution to the system of rays/points/inequalities.
+ x.back_substitute(n_lines_or_equalities);
+ // A well-formed system is returned.
+ assert(x.OK(true));
+}
+
+void
+PPL::Linear_System::add_rows_and_columns(const dimension_type n) {
+ assert(n > 0);
+ const bool was_sorted = is_sorted();
+ const dimension_type old_n_rows = num_rows();
+ const dimension_type old_n_columns = num_columns();
+ add_zero_rows_and_columns(n, n, Linear_Row::Flags(row_topology));
+ Linear_System& x = *this;
+ // The old system is moved to the bottom.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ std::swap(x[i], x[i + n]);
+ for (dimension_type i = n, c = old_n_columns; 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.
+ Linear_Row& r = x[i];
+ r[c++] = 1;
+ r.set_is_line_or_equality();
+ // Note: `r' is strongly normalized.
+ }
+ // If the old system was empty, the last row added is either
+ // a positivity constraint or a point.
+ if (old_n_columns == 0) {
+ x[n-1].set_is_ray_or_point_or_inequality();
+ // Since ray, points and inequalities come after lines
+ // and equalities, this case implies the system is sorted.
+ set_sorted(true);
+ }
+ else if (was_sorted)
+ set_sorted(compare(x[n-1], x[n]) <= 0);
+
+ // A well-formed system has to be returned.
+ assert(OK(true));
+}
+
+void
+PPL::Linear_System::sort_pending_and_remove_duplicates() {
+ assert(num_pending_rows() > 0);
+ assert(is_sorted());
+ Linear_System& x = *this;
+
+ // The non-pending part of the system is already sorted.
+ // Now sorting the pending part..
+ const dimension_type first_pending = x.first_pending_row();
+ x.sort_rows(first_pending, x.num_rows());
+ // Recompute the number of rows, because we may have removed
+ // some rows occurring more than once in the pending part.
+ dimension_type num_rows = x.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(x[k1], x[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)
+ std::swap(x[k2], x[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)
+ std::swap(x[k2], x[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)
+ std::swap(x[k2], x[k2 + num_duplicates]);
+ x.erase_to_end(num_rows);
+ }
+ // Do not check for strong normalization,
+ // because no modification of rows has occurred.
+ assert(OK(false));
+}
+
+bool
+PPL::Linear_System::check_sorted() const {
+ const Linear_System& x = *this;
+ for (dimension_type i = first_pending_row(); i-- > 1; )
+ if (compare(x[i], x[i-1]) < 0)
+ return false;
+ return true;
+}
+
+bool
+PPL::Linear_System::OK(const bool check_strong_normalized) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // `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;
+ }
+
+ // An empty system is OK,
+ // unless it is an NNC system with exactly one column.
+ if (num_rows() == 0)
+ if (is_necessarily_closed() || num_columns() != 1)
+ return true;
+ else {
+#ifndef NDEBUG
+ cerr << "NNC Linear_System has one column" << endl;
+#endif
+ return false;
+ }
+
+ // A non-empty system will contain constraints or generators; in
+ // both cases it must have at least one column for the inhomogeneous
+ // term and, if it is NNC, another one for the epsilon coefficient.
+ const dimension_type min_cols = is_necessarily_closed() ? 1 : 2;
+ if (num_columns() < min_cols) {
+#ifndef NDEBUG
+ cerr << "Linear_System has fewer columns than the minimum "
+ << "allowed by its topology:"
+ << endl
+ << "num_columns is " << num_columns()
+ << ", minimum is " << min_cols
+ << endl;
+#endif
+ return false;
+ }
+
+ const Linear_System& x = *this;
+ const dimension_type n_rows = num_rows();
+ for (dimension_type i = 0; i < n_rows; ++i) {
+ if (!x[i].OK(row_size, row_capacity))
+ return false;
+ // Checking for topology mismatches.
+ if (x.topology() != x[i].topology()) {
+#ifndef NDEBUG
+ cerr << "Topology mismatch between the system "
+ << "and one of its rows!"
+ << endl;
+#endif
+ return false;
+ }
+ }
+
+ if (check_strong_normalized) {
+ // Check for strong normalization of rows.
+ // Note: normalization cannot be checked inside the
+ // Linear_Row::OK() method, because a Linear_Row object may also
+ // implement a Linear_Expression object, which in general cannot
+ // be (strongly) normalized.
+ Linear_System tmp(x, With_Pending());
+ tmp.strong_normalize();
+ if (x != tmp) {
+#ifndef NDEBUG
+ cerr << "Linear_System rows are not strongly normalized!"
+ << 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;
+}
diff --git a/src/Linear_System.defs.hh b/src/Linear_System.defs.hh
new file mode 100644
index 0000000..ebc440b
--- /dev/null
+++ b/src/Linear_System.defs.hh
@@ -0,0 +1,517 @@
+/* Linear_System class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_System_defs_hh
+#define PPL_Linear_System_defs_hh 1
+
+#include "Linear_System.types.hh"
+#include "Row.types.hh"
+#include "Saturation_Row.types.hh"
+#include "Saturation_Matrix.types.hh"
+#include "Matrix.defs.hh"
+#include "Topology.hh"
+#include "Linear_Row.defs.hh"
+
+#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 Linear_Row objects,
+ where each Linear_Row implements a constraint or a generator.
+ Linear systems are characterized by the matrix of coefficients,
+ also encoding the number, size and capacity of Linear_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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_System : public Matrix {
+public:
+ //! Builds an empty linear system with specified topology.
+ /*!
+ Rows size and capacity are initialized to \f$0\f$.
+ */
+ Linear_System(Topology topol);
+
+ //! Builds a system with specified topology and dimensions.
+ /*!
+ \param topol
+ The topology of the system that will be created;
+
+ \param n_rows
+ The number of rows of the system that will be created;
+
+ \param n_columns
+ The number of columns of the system that will be created.
+
+ Creates a \p n_rows \f$\times\f$ \p n_columns system whose
+ coefficients are all zero and whose rows are all initialized
+ to be of the given topology.
+ */
+ Linear_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns);
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ struct With_Pending {
+ };
+
+ //! Copy-constructor: pending rows are transformed into non-pending ones.
+ Linear_System(const Linear_System& y);
+
+ //! Full copy-constructor: pending rows are copied as pending.
+ Linear_System(const Linear_System& y, 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 swap(Linear_System& y);
+
+ //! 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;
+
+ //! Makes the system shrink by removing its \p n trailing columns.
+ void remove_trailing_columns(dimension_type n);
+
+ //! Permutes the columns of the system.
+ /*
+ \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 non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the system has 6
+ 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.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the \p k-th row of the system.
+ Linear_Row& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the system.
+ const Linear_Row& operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ //! 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 <CODE>NECESSARILY_CLOSED</CODE>.
+ void set_necessarily_closed();
+
+ //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ void set_not_necessarily_closed();
+
+ //! Sets the topology of all rows equal to the system topology.
+ void set_rows_topology();
+
+ //! 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);
+
+ //! Resizes the system without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized system;
+
+ \param new_n_columns
+ The number of columns of the resized system.
+
+ The system is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original system is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+
+ //! Adds \p n rows and columns to the system.
+ /*!
+ \param n
+ The number of rows and columns 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_rows_and_columns(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 Linear_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 Linear_Row& r);
+
+ //! Adds a copy of the given row to the system.
+ void add_row(const Linear_Row& r);
+
+ //! Adds a new empty row to the system, setting only its flags.
+ void add_pending_row(Linear_Row::Flags flags);
+
+ //! Adds a copy of the given row to the pending part of the system.
+ void add_pending_row(const Linear_Row& r);
+
+ //! Adds to \p *this a copy of the rows of `y'.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void add_rows(const Linear_System& y);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void add_pending_rows(const Linear_System& y);
+
+ /*! \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();
+
+ class With_Saturation_Matrix_iterator;
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Saturation matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Saturation_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 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);
+
+ /*! \brief
+ Applies Gaussian's elimination and back-substitution so as to
+ simplify the linear system.
+ */
+ void simplify();
+
+ /*! \brief
+ Normalizes the system by dividing each row for the GCD of the
+ row's elements.
+ */
+ void normalize();
+
+ //! Clears the system deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) 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 <CODE>ascii_dump()</CODE>. 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;
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ \param check_strong_normalized
+ <CODE>true</CODE> if and only if the strong normalization of all
+ the rows in the system has to be checked.
+
+ By default, the strong normalization check is performed.
+ This check may be turned off to avoid useless repeated checking;
+ e.g., when re-checking a well-formed Linear_System after the permutation
+ or deletion of some of its rows.
+ */
+ bool OK(bool check_strong_normalized = true) const;
+
+private:
+ //! The topological kind of the rows in the system.
+ 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 Linear_Row&, const Linear_Row&)</CODE>.
+ If <CODE>false</CODE> may not be sorted.
+ */
+ bool sorted;
+
+ //! Ordering predicate (used when implementing the sort algorithm).
+ struct Row_Less_Than {
+ bool operator()(const Row& x, const Row& y) const;
+ };
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_System& x,
+ Parma_Polyhedra_Library::Linear_System& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Linear_System& x, const Linear_System& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Linear_System& x, const Linear_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator keeping a Linear_System consistent with a Saturation_Matrix.
+/*! \ingroup PPL_CXX_interface
+ An iterator on the vector of Row objects encoded in a Linear_System
+ extended to maintain a corresponding iterator on a vector of
+ Saturation_Row objects. Access to values is always done on the Row
+ objects, but iterator
+ movements and swaps are done on both components.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator {
+public:
+ typedef std::vector<Row>::iterator Iter1;
+ typedef std::vector<Saturation_Row>::iterator Iter2;
+
+private:
+ Iter1 i1;
+ Iter2 i2;
+
+public:
+ // Same traits as Iter1.
+ typedef std::iterator_traits<Iter1>::iterator_category iterator_category;
+ typedef std::iterator_traits<Iter1>::value_type value_type;
+ typedef std::iterator_traits<Iter1>::difference_type difference_type;
+ typedef std::iterator_traits<Iter1>::pointer pointer;
+ typedef std::iterator_traits<Iter1>::reference reference;
+
+ //! Constructor.
+ With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2);
+
+ //! Copy-constructor.
+ With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y);
+
+ //! Destructor.
+ ~With_Saturation_Matrix_iterator();
+
+ //! Assignment operator.
+ With_Saturation_Matrix_iterator&
+ operator=(const With_Saturation_Matrix_iterator& y);
+
+ //! \name Operators Implementing Iterator Movement
+ //@{
+ With_Saturation_Matrix_iterator& operator++();
+ With_Saturation_Matrix_iterator operator++(int);
+
+ With_Saturation_Matrix_iterator& operator--();
+ With_Saturation_Matrix_iterator operator--(int);
+
+ With_Saturation_Matrix_iterator& operator+=(difference_type d);
+ With_Saturation_Matrix_iterator operator+(difference_type d) const;
+
+ With_Saturation_Matrix_iterator& operator-=(difference_type d);
+ With_Saturation_Matrix_iterator operator-(difference_type d) const;
+ //@}
+
+ //! Distance operator.
+ difference_type operator-(const With_Saturation_Matrix_iterator& y) const;
+
+ //! \name Comparisons between Iterators
+ //@{
+ bool operator==(const With_Saturation_Matrix_iterator& y) const;
+ bool operator!=(const With_Saturation_Matrix_iterator& y) const;
+ bool operator<(const With_Saturation_Matrix_iterator& y) const;
+ //@}
+
+ //! Dereferencing operator.
+ reference operator*() const;
+
+ //! Access-through operator.
+ pointer operator->() const;
+
+ //! Swaps the pointed Row objects while keeping Saturation_Matrix consistent.
+ void iter_swap(const With_Saturation_Matrix_iterator& y) const;
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator x,
+ Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator y);
+
+} // namespace std
+
+#include "Linear_System.inlines.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..99e8a98
--- /dev/null
+++ b/src/Linear_System.inlines.hh
@@ -0,0 +1,393 @@
+/* Linear_System class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Linear_System_inlines_hh
+#define PPL_Linear_System_inlines_hh 1
+
+#include "Saturation_Row.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Linear_System::external_memory_in_bytes() const {
+ return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_System::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Linear_System::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'.
+ assert(!sorted || check_sorted());
+ return sorted;
+}
+
+inline void
+Linear_System::set_sorted(const bool b) {
+ sorted = b;
+}
+
+inline
+Linear_System::Linear_System(Topology topol)
+ : Matrix(),
+ row_topology(topol),
+ index_first_pending(0),
+ sorted(true) {
+}
+
+inline
+Linear_System::Linear_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns)
+ : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)),
+ row_topology(topol),
+ index_first_pending(n_rows),
+ sorted(true) {
+}
+
+inline dimension_type
+Linear_System::first_pending_row() const {
+ return index_first_pending;
+}
+
+inline dimension_type
+Linear_System::num_pending_rows() const {
+ assert(num_rows() >= first_pending_row());
+ return num_rows() - first_pending_row();
+}
+
+inline void
+Linear_System::unset_pending_rows() {
+ index_first_pending = num_rows();
+}
+
+inline void
+Linear_System::set_index_first_pending_row(const dimension_type i) {
+ index_first_pending = i;
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y)
+ : Matrix(y),
+ row_topology(y.row_topology) {
+ unset_pending_rows();
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ assert(num_pending_rows() == 0);
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y, With_Pending)
+ : Matrix(y),
+ row_topology(y.row_topology),
+ index_first_pending(y.index_first_pending),
+ sorted(y.sorted) {
+}
+
+inline Linear_System&
+Linear_System::operator=(const Linear_System& y) {
+ Matrix::operator=(y);
+ row_topology = y.row_topology;
+ unset_pending_rows();
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ assert(num_pending_rows() == 0);
+ return *this;
+}
+
+inline void
+Linear_System::assign_with_pending(const Linear_System& y) {
+ Matrix::operator=(y);
+ row_topology = y.row_topology;
+ index_first_pending = y.index_first_pending;
+ sorted = y.sorted;
+}
+
+inline void
+Linear_System::swap(Linear_System& y) {
+ Matrix::swap(y);
+ std::swap(row_topology, y.row_topology);
+ std::swap(index_first_pending, y.index_first_pending);
+ std::swap(sorted, y.sorted);
+}
+
+inline void
+Linear_System::clear() {
+ // Note: do NOT modify the value of `row_topology'.
+ Matrix::clear();
+ index_first_pending = 0;
+ sorted = true;
+}
+
+inline void
+Linear_System::resize_no_copy(const dimension_type new_n_rows,
+ const dimension_type new_n_columns) {
+ Matrix::resize_no_copy(new_n_rows, new_n_columns,
+ Linear_Row::Flags(row_topology));
+ // Even though `*this' may happen to keep its sortedness, we believe
+ // that checking such a property is not worth the effort. In fact,
+ // it is very likely that the system will be overwritten as soon as
+ // we return.
+ set_sorted(false);
+}
+
+inline void
+Linear_System::set_necessarily_closed() {
+ row_topology = NECESSARILY_CLOSED;
+ if (num_rows() > 0)
+ set_rows_topology();
+}
+
+inline void
+Linear_System::set_not_necessarily_closed() {
+ row_topology = NOT_NECESSARILY_CLOSED;
+ if (num_rows() > 0)
+ set_rows_topology();
+}
+
+inline bool
+Linear_System::is_necessarily_closed() const {
+ return row_topology == NECESSARILY_CLOSED;
+}
+
+inline Linear_Row&
+Linear_System::operator[](const dimension_type k) {
+ return static_cast<Linear_Row&>(Matrix::operator[](k));
+}
+
+inline const Linear_Row&
+Linear_System::operator[](const dimension_type k) const {
+ return static_cast<const Linear_Row&>(Matrix::operator[](k));
+}
+
+inline Topology
+Linear_System::topology() const {
+ return row_topology;
+}
+
+inline dimension_type
+Linear_System::max_space_dimension() {
+ // Column zero holds the inhomogeneous term or the divisor.
+ // In NNC linear systems, the last column holds the coefficient
+ // of the epsilon dimension.
+ return max_num_columns() - 2;
+}
+
+inline dimension_type
+Linear_System::space_dimension() const {
+ const dimension_type n_columns = num_columns();
+ return (n_columns == 0)
+ ? 0
+ : n_columns - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline void
+Linear_System::remove_trailing_columns(const dimension_type n) {
+ Matrix::remove_trailing_columns(n);
+ // Have to re-normalize the rows of the system,
+ // since we removed some coefficients.
+ strong_normalize();
+}
+
+inline void
+Linear_System::permute_columns(const std::vector<dimension_type>& cycles) {
+ Matrix::permute_columns(cycles);
+ // The rows with permuted columns are still normalized but may
+ // be not strongly normalized: sign normalization is necessary.
+ sign_normalize();
+}
+
+/*! \relates Linear_System */
+inline bool
+operator!=(const Linear_System& x, const Linear_System& y) {
+ return !(x == y);
+}
+
+inline bool
+Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const {
+ return compare(static_cast<const Linear_Row&>(x),
+ static_cast<const Linear_Row&>(y)) < 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+inline void
+swap(Parma_Polyhedra_Library::Linear_System& x,
+ Parma_Polyhedra_Library::Linear_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2)
+ : i1(iter1), i2(iter2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y)
+ : i1(y.i1), i2(y.i2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+~With_Saturation_Matrix_iterator() {
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::
+operator=(const With_Saturation_Matrix_iterator& y) {
+ i1 = y.i1;
+ i2 = y.i2;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator++() {
+ ++i1;
+ ++i2;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator++(int) {
+ With_Saturation_Matrix_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator--() {
+ --i1;
+ --i2;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator--(int) {
+ With_Saturation_Matrix_iterator tmp = *this;
+ operator--();
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator+=(difference_type d) {
+ i1 += d;
+ i2 += d;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator+(difference_type d) const {
+ With_Saturation_Matrix_iterator tmp = *this;
+ tmp += d;
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator-=(difference_type d) {
+ i1 -= d;
+ i2 -= d;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(difference_type d) const {
+ With_Saturation_Matrix_iterator tmp = *this;
+ tmp -= d;
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::difference_type
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(const With_Saturation_Matrix_iterator& y) const {
+ return i1 - y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator==(const With_Saturation_Matrix_iterator& y) const {
+ return i1 == y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator!=(const With_Saturation_Matrix_iterator& y) const {
+ return i1 != y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator<(const With_Saturation_Matrix_iterator& y) const {
+ return i1 < y.i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::reference
+Linear_System::With_Saturation_Matrix_iterator::operator*() const {
+ return *i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::pointer
+Linear_System::With_Saturation_Matrix_iterator::operator->() const {
+ return &*i1;
+}
+
+inline void
+Linear_System::With_Saturation_Matrix_iterator::
+iter_swap(const With_Saturation_Matrix_iterator& y) const {
+ std::iter_swap(i1, y.i1);
+ std::iter_swap(i2, y.i2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+inline void
+iter_swap(Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator x,
+ Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator y) {
+ x.iter_swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Linear_System_inlines_hh)
diff --git a/src/Linear_System.types.hh b/src/Linear_System.types.hh
new file mode 100644
index 0000000..52a2c13
--- /dev/null
+++ b/src/Linear_System.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 {
+
+class Linear_System;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Linear_System_types_hh)
diff --git a/src/Makefile.am b/src/Makefile.am
new file mode 100644
index 0000000..c14ffe0
--- /dev/null
+++ b/src/Makefile.am
@@ -0,0 +1,413 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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
+
+LIBPPL_LT_CURRENT = 6
+LIBPPL_LT_REVISION = 0
+LIBPPL_LT_AGE = 0
+
+AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src @extra_includes@
+
+lib_LTLIBRARIES = libppl.la
+
+bin_PROGRAMS = ppl-config
+ppl_config_SOURCES = \
+ppl-config.cc \
+BUGS.cc \
+COPYING.cc \
+CREDITS.cc
+
+ppl_config_LDADD = \
+libppl.la \
+ at extra_libraries@
+
+if USE_NATIVE_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif
+
+if USE_CHECKED_INTEGERS
+
+COEFFICIENT_TYPES_INCLUDE_FILES =
+
+COEFFICIENT_DEFS_INCLUDE_FILES =
+
+endif
+
+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
+
+# The ordering of the following list *matters*!
+INCLUDE_FILES = \
+namespaces.hh \
+compiler.hh \
+Coefficient_traits_template.hh \
+Checked_Number.types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient.types.hh \
+globals.types.hh \
+Interval.types.hh \
+Bounding_Box.types.hh \
+Constraint.types.hh \
+Generator.types.hh \
+Grid_Generator.types.hh \
+Congruence.types.hh \
+Init.types.hh \
+Row.types.hh \
+Linear_Row.types.hh \
+Matrix.types.hh \
+Variable.types.hh \
+Linear_Expression.types.hh \
+Linear_System.types.hh \
+Saturation_Row.types.hh \
+Saturation_Matrix.types.hh \
+Constraint_System.types.hh \
+Generator_System.types.hh \
+Grid_Generator_System.types.hh \
+Congruence_System.types.hh \
+Scalar_Products.types.hh \
+LP_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 \
+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 \
+fpu.types.hh \
+Float.defs.hh \
+Float.inlines.hh \
+Limits.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 \
+mp_numeric_limits.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient.defs.hh \
+Coefficient.inlines.hh \
+globals.defs.hh \
+globals.inlines.hh \
+Interval.defs.hh \
+Interval.inlines.hh \
+Bounding_Box.defs.hh \
+Bounding_Box.inlines.hh \
+Variable.defs.hh \
+Variable.inlines.hh \
+Init.defs.hh \
+initializer.hh \
+Topology.hh \
+Row.defs.hh \
+Row.inlines.hh \
+Linear_Row.defs.hh \
+Linear_Row.inlines.hh \
+Matrix.defs.hh \
+Matrix.inlines.hh \
+Saturation_Row.defs.hh \
+Saturation_Row.inlines.hh \
+Linear_System.defs.hh \
+Linear_System.inlines.hh \
+Saturation_Matrix.defs.hh \
+Saturation_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 \
+Constraint.defs.hh \
+Constraint.inlines.hh \
+Constraint_System.inlines.hh \
+Generator.defs.hh \
+Generator.inlines.hh \
+Grid_Generator.inlines.hh \
+Grid_Generator.defs.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 \
+LP_Problem.defs.hh \
+LP_Problem.inlines.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 \
+Polyhedron.defs.hh \
+Ph_Status.inlines.hh \
+Polyhedron.inlines.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_Matrix.defs.hh \
+DB_Matrix.inlines.hh \
+BD_Shape.defs.hh \
+BDS_Status.inlines.hh \
+BD_Shape.inlines.hh \
+BD_Shape.templates.hh \
+Determinate.types.hh \
+Determinate.defs.hh \
+Determinate.inlines.hh \
+Powerset.types.hh \
+Powerset.defs.hh \
+Powerset.inlines.hh \
+Powerset.templates.hh \
+Polyhedra_Powerset.types.hh \
+Polyhedra_Powerset.defs.hh \
+Polyhedra_Powerset.inlines.hh \
+Polyhedra_Powerset.templates.hh \
+max_space_dimension.hh \
+algorithms.hh
+
+NESTED_INCLUDE_FILES = \
+Ph_Status.idefs.hh \
+Grid_Status.idefs.hh \
+BDS_Status.idefs.hh
+
+libppl_la_SOURCES = \
+Bounding_Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.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 \
+Interval.cc \
+Linear_Expression.cc \
+Linear_System.cc \
+Matrix.cc \
+Scalar_Products.cc \
+LP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.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 \
+Polyhedra_Powerset.cc \
+Row.cc \
+Linear_Row.cc \
+Saturation_Matrix.cc \
+Saturation_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+conversion.cc \
+minimize.cc \
+simplify.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+globals.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort.icc
+
+if NO_UNDEFINED
+
+NO_UNDEFINED_FLAG = -no-undefined
+
+libppl_la_LIBADD = @extra_libraries@
+
+endif NO_UNDEFINED
+
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+include_HEADERS = ppl.hh
+
+nodist_noinst_HEADERS = ppl_include_files.hh
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+ rm -f $@
+ for file in $(INCLUDE_FILES); \
+ do \
+ printf "#include \"%s\"\n" $$file >>$@; \
+ done
+
+EXTRA_DIST = ppl_header.hh ppl-config.cc.in version.hh.in
+
+if HAVE_PERL
+
+ppl.hh: $(top_builddir)/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.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/BUGS
+ $(top_builddir)/utils/text2cxxarray --name=BUGS_array \
+ $(top_srcdir)/BUGS >$@
+COPYING.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/COPYING
+ $(top_builddir)/utils/text2cxxarray --name=COPYING_array \
+ $(top_srcdir)/COPYING >$@
+CREDITS.cc: $(top_builddir)/utils/text2cxxarray $(top_srcdir)/CREDITS
+ $(top_builddir)/utils/text2cxxarray --name=CREDITS_array \
+ $(top_srcdir)/CREDITS >$@
+
+else !HAVE_PERL
+
+ppl.hh: ppl.hh.dist
+ cp -f $< $@
+
+BUGS.cc: BUGS.cc.dist
+ cp -f $< $@
+COPYING.cc: COPYING.cc.dist
+ cp -f $< $@
+CREDITS.cc: CREDITS.cc.dist
+ cp -f $< $@
+
+endif !HAVE_PERL
+
+if USE_PRECOMPILED_HEADERS
+
+ppl.hh.gch: ppl.hh
+ $(CXXCOMPILE) -xc++-header -o $@ $<
+
+PRECOMPILED = ppl.hh.gch
+
+else
+
+PRECOMPILED =
+
+endif
+
+BUILT_SOURCES = \
+$(include_HEADERS) \
+$(nodist_noinst_HEADERS) \
+$(PRECOMPILED) \
+BUGS.cc \
+COPYING.cc \
+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.cc $(distdir)/BUGS.cc.dist
+ mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+ mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+
+MOSTLYCLEANFILES = $(BUILT_SOURCES)
diff --git a/src/Makefile.in b/src/Makefile.in
new file mode 100644
index 0000000..e55f707
--- /dev/null
+++ b/src/Makefile.in
@@ -0,0 +1,1167 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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
+
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(include_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in $(srcdir)/ppl-config.cc.in \
+ $(srcdir)/version.hh.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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
+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 = `echo $$p | sed -e 's|^.*/||'`;
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(includedir)"
+libLTLIBRARIES_INSTALL = $(INSTALL)
+LTLIBRARIES = $(lib_LTLIBRARIES)
+libppl_la_DEPENDENCIES =
+am__libppl_la_SOURCES_DIST = Bounding_Box.cc checked.cc \
+ Checked_Number.cc Float.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 Interval.cc Linear_Expression.cc \
+ Linear_System.cc Matrix.cc Scalar_Products.cc LP_Problem.cc \
+ Poly_Con_Relation.cc Poly_Gen_Relation.cc \
+ BHRZ03_Certificate.cc H79_Certificate.cc Grid_Certificate.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 \
+ Polyhedra_Powerset.cc Row.cc Linear_Row.cc \
+ Saturation_Matrix.cc Saturation_Row.cc Ph_Status.cc \
+ Grid_Status.cc Variable.cc conversion.cc minimize.cc \
+ simplify.cc Grid_conversion.cc Grid_simplify.cc globals.cc \
+ version.cc namespaces.hh compiler.hh \
+ Coefficient_traits_template.hh Checked_Number.types.hh \
+ GMP_Integer.types.hh Coefficient.types.hh globals.types.hh \
+ Interval.types.hh Bounding_Box.types.hh Constraint.types.hh \
+ Generator.types.hh Grid_Generator.types.hh Congruence.types.hh \
+ Init.types.hh Row.types.hh Linear_Row.types.hh Matrix.types.hh \
+ Variable.types.hh Linear_Expression.types.hh \
+ Linear_System.types.hh Saturation_Row.types.hh \
+ Saturation_Matrix.types.hh Constraint_System.types.hh \
+ Generator_System.types.hh Grid_Generator_System.types.hh \
+ Congruence_System.types.hh Scalar_Products.types.hh \
+ LP_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 \
+ 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 \
+ fpu.types.hh Float.defs.hh Float.inlines.hh Limits.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 mp_numeric_limits.hh \
+ checked_numeric_limits.hh GMP_Integer.defs.hh \
+ GMP_Integer.inlines.hh Coefficient.defs.hh \
+ Coefficient.inlines.hh globals.defs.hh globals.inlines.hh \
+ Interval.defs.hh Interval.inlines.hh Bounding_Box.defs.hh \
+ Bounding_Box.inlines.hh Variable.defs.hh Variable.inlines.hh \
+ Init.defs.hh initializer.hh Topology.hh Row.defs.hh \
+ Row.inlines.hh Linear_Row.defs.hh Linear_Row.inlines.hh \
+ Matrix.defs.hh Matrix.inlines.hh Saturation_Row.defs.hh \
+ Saturation_Row.inlines.hh Linear_System.defs.hh \
+ Linear_System.inlines.hh Saturation_Matrix.defs.hh \
+ Saturation_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 Constraint.defs.hh \
+ Constraint.inlines.hh Constraint_System.inlines.hh \
+ Generator.defs.hh Generator.inlines.hh \
+ Grid_Generator.inlines.hh Grid_Generator.defs.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 LP_Problem.defs.hh \
+ LP_Problem.inlines.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 Polyhedron.defs.hh \
+ Ph_Status.inlines.hh Polyhedron.inlines.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_Matrix.defs.hh DB_Matrix.inlines.hh \
+ BD_Shape.defs.hh BDS_Status.inlines.hh BD_Shape.inlines.hh \
+ BD_Shape.templates.hh Determinate.types.hh Determinate.defs.hh \
+ Determinate.inlines.hh Powerset.types.hh Powerset.defs.hh \
+ Powerset.inlines.hh Powerset.templates.hh \
+ Polyhedra_Powerset.types.hh Polyhedra_Powerset.defs.hh \
+ Polyhedra_Powerset.inlines.hh Polyhedra_Powerset.templates.hh \
+ max_space_dimension.hh algorithms.hh Ph_Status.idefs.hh \
+ Grid_Status.idefs.hh BDS_Status.idefs.hh swapping_sort.icc
+am__objects_1 =
+am__objects_2 = $(am__objects_1) $(am__objects_1)
+am_libppl_la_OBJECTS = Bounding_Box.lo checked.lo Checked_Number.lo \
+ Float.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 Interval.lo Linear_Expression.lo \
+ Linear_System.lo Matrix.lo Scalar_Products.lo LP_Problem.lo \
+ Poly_Con_Relation.lo Poly_Gen_Relation.lo \
+ BHRZ03_Certificate.lo H79_Certificate.lo Grid_Certificate.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 \
+ Polyhedra_Powerset.lo Row.lo Linear_Row.lo \
+ Saturation_Matrix.lo Saturation_Row.lo Ph_Status.lo \
+ Grid_Status.lo Variable.lo conversion.lo minimize.lo \
+ simplify.lo Grid_conversion.lo Grid_simplify.lo globals.lo \
+ version.lo $(am__objects_2) $(am__objects_1)
+libppl_la_OBJECTS = $(am_libppl_la_OBJECTS)
+binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
+PROGRAMS = $(bin_PROGRAMS)
+am_ppl_config_OBJECTS = ppl-config.$(OBJEXT) BUGS.$(OBJEXT) \
+ COPYING.$(OBJEXT) CREDITS.$(OBJEXT)
+ppl_config_OBJECTS = $(am_ppl_config_OBJECTS)
+ppl_config_DEPENDENCIES = libppl.la
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_la_SOURCES) $(ppl_config_SOURCES)
+DIST_SOURCES = $(am__libppl_la_SOURCES_DIST) $(ppl_config_SOURCES)
+includeHEADERS_INSTALL = $(INSTALL_HEADER)
+HEADERS = $(include_HEADERS) $(nodist_noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+LIBPPL_LT_CURRENT = 6
+LIBPPL_LT_REVISION = 0
+LIBPPL_LT_AGE = 0
+AM_CPPFLAGS = -I$(top_builddir) -I$(top_srcdir)/src @extra_includes@
+lib_LTLIBRARIES = libppl.la
+ppl_config_SOURCES = \
+ppl-config.cc \
+BUGS.cc \
+COPYING.cc \
+CREDITS.cc
+
+ppl_config_LDADD = \
+libppl.la \
+ at extra_libraries@
+
+ 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 \
+Coefficient_traits_template.hh \
+Checked_Number.types.hh \
+$(COEFFICIENT_TYPES_INCLUDE_FILES) \
+Coefficient.types.hh \
+globals.types.hh \
+Interval.types.hh \
+Bounding_Box.types.hh \
+Constraint.types.hh \
+Generator.types.hh \
+Grid_Generator.types.hh \
+Congruence.types.hh \
+Init.types.hh \
+Row.types.hh \
+Linear_Row.types.hh \
+Matrix.types.hh \
+Variable.types.hh \
+Linear_Expression.types.hh \
+Linear_System.types.hh \
+Saturation_Row.types.hh \
+Saturation_Matrix.types.hh \
+Constraint_System.types.hh \
+Generator_System.types.hh \
+Grid_Generator_System.types.hh \
+Congruence_System.types.hh \
+Scalar_Products.types.hh \
+LP_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 \
+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 \
+fpu.types.hh \
+Float.defs.hh \
+Float.inlines.hh \
+Limits.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 \
+mp_numeric_limits.hh \
+checked_numeric_limits.hh \
+$(COEFFICIENT_DEFS_INCLUDE_FILES) \
+Coefficient.defs.hh \
+Coefficient.inlines.hh \
+globals.defs.hh \
+globals.inlines.hh \
+Interval.defs.hh \
+Interval.inlines.hh \
+Bounding_Box.defs.hh \
+Bounding_Box.inlines.hh \
+Variable.defs.hh \
+Variable.inlines.hh \
+Init.defs.hh \
+initializer.hh \
+Topology.hh \
+Row.defs.hh \
+Row.inlines.hh \
+Linear_Row.defs.hh \
+Linear_Row.inlines.hh \
+Matrix.defs.hh \
+Matrix.inlines.hh \
+Saturation_Row.defs.hh \
+Saturation_Row.inlines.hh \
+Linear_System.defs.hh \
+Linear_System.inlines.hh \
+Saturation_Matrix.defs.hh \
+Saturation_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 \
+Constraint.defs.hh \
+Constraint.inlines.hh \
+Constraint_System.inlines.hh \
+Generator.defs.hh \
+Generator.inlines.hh \
+Grid_Generator.inlines.hh \
+Grid_Generator.defs.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 \
+LP_Problem.defs.hh \
+LP_Problem.inlines.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 \
+Polyhedron.defs.hh \
+Ph_Status.inlines.hh \
+Polyhedron.inlines.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_Matrix.defs.hh \
+DB_Matrix.inlines.hh \
+BD_Shape.defs.hh \
+BDS_Status.inlines.hh \
+BD_Shape.inlines.hh \
+BD_Shape.templates.hh \
+Determinate.types.hh \
+Determinate.defs.hh \
+Determinate.inlines.hh \
+Powerset.types.hh \
+Powerset.defs.hh \
+Powerset.inlines.hh \
+Powerset.templates.hh \
+Polyhedra_Powerset.types.hh \
+Polyhedra_Powerset.defs.hh \
+Polyhedra_Powerset.inlines.hh \
+Polyhedra_Powerset.templates.hh \
+max_space_dimension.hh \
+algorithms.hh
+
+NESTED_INCLUDE_FILES = \
+Ph_Status.idefs.hh \
+Grid_Status.idefs.hh \
+BDS_Status.idefs.hh
+
+libppl_la_SOURCES = \
+Bounding_Box.cc \
+checked.cc \
+Checked_Number.cc \
+Float.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 \
+Interval.cc \
+Linear_Expression.cc \
+Linear_System.cc \
+Matrix.cc \
+Scalar_Products.cc \
+LP_Problem.cc \
+Poly_Con_Relation.cc \
+Poly_Gen_Relation.cc \
+BHRZ03_Certificate.cc \
+H79_Certificate.cc \
+Grid_Certificate.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 \
+Polyhedra_Powerset.cc \
+Row.cc \
+Linear_Row.cc \
+Saturation_Matrix.cc \
+Saturation_Row.cc \
+Ph_Status.cc \
+Grid_Status.cc \
+Variable.cc \
+conversion.cc \
+minimize.cc \
+simplify.cc \
+Grid_conversion.cc \
+Grid_simplify.cc \
+globals.cc \
+version.cc \
+$(INCLUDE_FILES) \
+$(NESTED_INCLUDE_FILES) \
+swapping_sort.icc
+
+ at NO_UNDEFINED_TRUE@NO_UNDEFINED_FLAG = -no-undefined
+ at NO_UNDEFINED_TRUE@libppl_la_LIBADD = @extra_libraries@
+libppl_la_LDFLAGS = \
+$(NO_UNDEFINED_FLAG) \
+-version-info $(LIBPPL_LT_CURRENT):$(LIBPPL_LT_REVISION):$(LIBPPL_LT_AGE)
+
+include_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) \
+$(PRECOMPILED) \
+BUGS.cc \
+COPYING.cc \
+CREDITS.cc
+
+MOSTLYCLEANFILES = $(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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \
+ 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
+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)
+ test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ if test -f $$p; then \
+ f=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
+ $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
+ else :; fi; \
+ done
+
+uninstall-libLTLIBRARIES:
+ @$(NORMAL_UNINSTALL)
+ @set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ p=$(am__strip_dir) \
+ echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
+ $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
+ done
+
+clean-libLTLIBRARIES:
+ -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+ @list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+ dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+ test "$$dir" != "$$p" || dir=.; \
+ echo "rm -f \"$${dir}/so_locations\""; \
+ rm -f "$${dir}/so_locations"; \
+ done
+libppl.la: $(libppl_la_OBJECTS) $(libppl_la_DEPENDENCIES)
+ $(CXXLINK) -rpath $(libdir) $(libppl_la_LDFLAGS) $(libppl_la_OBJECTS) $(libppl_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)"
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ if test -f $$p \
+ || test -f $$p1 \
+ ; then \
+ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
+ else :; fi; \
+ done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
+ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
+ rm -f "$(DESTDIR)$(bindir)/$$f"; \
+ done
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+ppl-config$(EXEEXT): $(ppl_config_OBJECTS) $(ppl_config_DEPENDENCIES)
+ @rm -f ppl-config$(EXEEXT)
+ $(CXXLINK) $(ppl_config_LDFLAGS) $(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)/Bounding_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)/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)/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)/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)/Interval.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/LP_Problem.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_Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Linear_System.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Matrix.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)/Ph_Status.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)/Polyhedra_Powerset.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)/Row.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Saturation_Matrix.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Saturation_Row.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)/Variable.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)/conversion.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)/minimize.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)/simplify.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/version.Plo at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+install-includeHEADERS: $(include_HEADERS)
+ @$(NORMAL_INSTALL)
+ test -z "$(includedir)" || $(mkdir_p) "$(DESTDIR)$(includedir)"
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+ f=$(am__strip_dir) \
+ echo " $(includeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(includedir)/$$f'"; \
+ $(includeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+uninstall-includeHEADERS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(include_HEADERS)'; for p in $$list; do \
+ f=$(am__strip_dir) \
+ echo " rm -f '$(DESTDIR)$(includedir)/$$f'"; \
+ rm -f "$(DESTDIR)$(includedir)/$$f"; \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am: install-includeHEADERS
+
+install-exec-am: install-binPROGRAMS install-libLTLIBRARIES
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am uninstall-libLTLIBRARIES
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic clean-libLTLIBRARIES clean-libtool ctags \
+ 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-exec install-exec-am \
+ install-includeHEADERS install-info install-info-am \
+ install-libLTLIBRARIES install-man 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 uninstall uninstall-am uninstall-binPROGRAMS \
+ uninstall-includeHEADERS uninstall-info-am \
+ uninstall-libLTLIBRARIES
+
+
+ppl_include_files.hh: $(INCLUDE_FILES) Makefile
+ rm -f $@
+ for file in $(INCLUDE_FILES); \
+ do \
+ printf "#include \"%s\"\n" $$file >>$@; \
+ done
+
+ at HAVE_PERL_TRUE@ppl.hh: $(top_builddir)/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.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.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.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: ppl.hh.dist
+ at HAVE_PERL_FALSE@ cp -f $< $@
+
+ at HAVE_PERL_FALSE@BUGS.cc: BUGS.cc.dist
+ at HAVE_PERL_FALSE@ cp -f $< $@
+ at HAVE_PERL_FALSE@COPYING.cc: COPYING.cc.dist
+ at HAVE_PERL_FALSE@ cp -f $< $@
+ at HAVE_PERL_FALSE@CREDITS.cc: CREDITS.cc.dist
+ at HAVE_PERL_FALSE@ cp -f $< $@
+
+ at USE_PRECOMPILED_HEADERS_TRUE@ppl.hh.gch: ppl.hh
+ at USE_PRECOMPILED_HEADERS_TRUE@ $(CXXCOMPILE) -xc++-header -o $@ $<
+
+# 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.cc $(distdir)/BUGS.cc.dist
+ mv -f $(distdir)/COPYING.cc $(distdir)/COPYING.cc.dist
+ mv -f $(distdir)/CREDITS.cc $(distdir)/CREDITS.cc.dist
+# 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.cc b/src/Matrix.cc
new file mode 100644
index 0000000..77e97a2
--- /dev/null
+++ b/src/Matrix.cc
@@ -0,0 +1,409 @@
+/* Matrix class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Matrix.defs.hh"
+#include "Row.defs.hh"
+#include <algorithm>
+#include <iostream>
+#include <string>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Matrix::Matrix(const dimension_type n_rows,
+ const dimension_type n_columns,
+ Row::Flags row_flags)
+ : rows((assert(n_rows <= max_num_rows()),
+ n_rows)),
+ row_size(n_columns),
+ row_capacity(compute_capacity(n_columns, 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_columns, row_capacity, row_flags);
+ assert(OK());
+}
+
+void
+PPL::Matrix::add_zero_rows(const dimension_type n, Row::Flags row_flags) {
+ assert(n > 0);
+ assert(n <= max_num_rows() - num_rows());
+ const dimension_type old_num_rows = rows.size();
+ const dimension_type new_num_rows = old_num_rows + n;
+
+ if (rows.capacity() < new_num_rows) {
+ // Reallocation will take place.
+ std::vector<Row> new_rows;
+ new_rows.reserve(compute_capacity(new_num_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_num_rows, Row());
+ // Construct the new rows.
+ dimension_type i = new_num_rows;
+ while (i-- > old_num_rows)
+ new_rows[i].construct(row_size, row_capacity, row_flags);
+ // Steal the old rows.
+ ++i;
+ while (i-- > 0)
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::swap(rows, new_rows);
+ }
+ else {
+ // Reallocation will NOT take place.
+ rows.insert(rows.end(), n, Row());
+ for (dimension_type i = new_num_rows; i-- > old_num_rows; )
+ rows[i].construct(row_size, row_capacity, row_flags);
+ }
+}
+
+void
+PPL::Matrix::add_zero_columns(const dimension_type n) {
+ assert(n > 0);
+ assert(n <= max_num_columns() - num_columns());
+ const dimension_type num_rows = rows.size();
+ const dimension_type new_num_columns = row_size + n;
+
+ if (new_num_columns <= row_capacity)
+ // We have enough capacity: we resize existing rows.
+ for (dimension_type i = num_rows; i-- > 0; )
+ rows[i].expand_within_capacity(new_num_columns);
+ 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_num_columns, max_num_columns());
+ assert(new_row_capacity <= max_num_columns());
+ for (dimension_type i = num_rows; i-- > 0; ) {
+ Row new_row(rows[i], new_num_columns, new_row_capacity);
+ std::swap(rows[i], new_row);
+ }
+ row_capacity = new_row_capacity;
+ }
+ // Rows have been expanded.
+ row_size = new_num_columns;
+}
+
+void
+PPL::Matrix::add_zero_rows_and_columns(const dimension_type n,
+ const dimension_type m,
+ Row::Flags row_flags) {
+ assert(n > 0);
+ assert(n <= max_num_rows() - num_rows());
+ assert(m > 0);
+ assert(m <= max_num_columns() - num_columns());
+ const dimension_type old_num_rows = rows.size();
+ const dimension_type new_num_rows = old_num_rows + n;
+ const dimension_type new_num_columns = row_size + m;
+
+ if (new_num_columns <= row_capacity) {
+ // We can recycle the old rows.
+ if (rows.capacity() < new_num_rows) {
+ // Reallocation will take place.
+ std::vector<Row> new_rows;
+ new_rows.reserve(compute_capacity(new_num_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_num_rows, Row());
+ // Construct the new rows.
+ dimension_type i = new_num_rows;
+ while (i-- > old_num_rows)
+ new_rows[i].construct(new_num_columns, row_capacity, row_flags);
+ // Expand and steal the old rows.
+ ++i;
+ while (i-- > 0) {
+ rows[i].expand_within_capacity(new_num_columns);
+ new_rows[i].swap(rows[i]);
+ }
+ // Put the new vector into place.
+ std::swap(rows, new_rows);
+ }
+ else {
+ // Reallocation will NOT take place.
+ rows.insert(rows.end(), n, Row());
+ // Construct the new rows.
+ dimension_type i = new_num_rows;
+ while (i-- > old_num_rows)
+ rows[i].construct(new_num_columns, row_capacity, row_flags);
+ // Expand the old rows.
+ ++i;
+ while (i-- > 0)
+ rows[i].expand_within_capacity(new_num_columns);
+ }
+ row_size = new_num_columns;
+ }
+ else {
+ // We cannot even recycle the old rows.
+ Matrix new_matrix;
+ new_matrix.rows.reserve(compute_capacity(new_num_rows, max_num_rows()));
+ new_matrix.rows.insert(new_matrix.rows.end(), new_num_rows, Row());
+ // Construct the new rows.
+ new_matrix.row_size = new_num_columns;
+ new_matrix.row_capacity = compute_capacity(new_num_columns,
+ max_num_columns());
+ dimension_type i = new_num_rows;
+ while (i-- > old_num_rows)
+ new_matrix.rows[i].construct(new_matrix.row_size,
+ new_matrix.row_capacity,
+ row_flags);
+ // Copy the old rows.
+ ++i;
+ while (i-- > 0) {
+ Row new_row(rows[i],
+ new_matrix.row_size,
+ new_matrix.row_capacity);
+ std::swap(new_matrix.rows[i], new_row);
+ }
+ // Put the new vector into place.
+ swap(new_matrix);
+ }
+}
+
+void
+PPL::Matrix::add_recycled_row(Row& y) {
+ // The added row must have the same size and capacity as the
+ // existing rows of the system.
+ assert(y.OK(row_size, row_capacity));
+ const dimension_type new_rows_size = rows.size() + 1;
+ if (rows.capacity() < new_rows_size) {
+ // Reallocation will take place.
+ std::vector<Row> new_rows;
+ new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_rows_size, Row());
+ // Put the new row in place.
+ dimension_type i = new_rows_size-1;
+ std::swap(new_rows[i], y);
+ // Steal the old rows.
+ while (i-- > 0)
+ new_rows[i].swap(rows[i]);
+ // Put the new rows into place.
+ std::swap(rows, new_rows);
+ }
+ else
+ // Reallocation will NOT take place.
+ // Inserts a new empty row at the end,
+ // then substitutes it with a copy of the given row.
+ std::swap(*rows.insert(rows.end(), Row()), y);
+
+ assert(OK());
+}
+
+void
+PPL::Matrix::resize_no_copy(const dimension_type new_n_rows,
+ const dimension_type new_n_columns,
+ Row::Flags row_flags) {
+ dimension_type old_n_rows = rows.size();
+ // Note that, if we have `new_n_rows <= old_n_rows' and
+ // `new_n_columns >= row_size', the matrix will keep its sortedness.
+ // This is obvious if `new_n_columns == row_size'.
+ // If `new_n_columns > row_size', then sortedness is maintained
+ // because trailing zeroes will be added to all rows.
+ if (new_n_rows > old_n_rows) {
+ if (new_n_columns <= row_capacity) {
+ // We can recycle the old rows.
+ if (rows.capacity() < new_n_rows) {
+ // Reallocation (of vector `rows') will take place.
+ std::vector<Row> new_rows;
+ new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_n_rows, Row());
+ // 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_columns, row_capacity, row_flags);
+ // Steal the old rows.
+ ++i;
+ while (i-- > 0)
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::swap(rows, new_rows);
+ }
+ else {
+ // Reallocation (of vector `rows') will NOT take place.
+ rows.insert(rows.end(), new_n_rows - old_n_rows, Row());
+ // 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_columns, row_capacity, row_flags);
+ }
+ }
+ else {
+ // We cannot even recycle the old rows: allocate a new matrix and swap.
+ Matrix new_matrix(new_n_rows, new_n_columns, row_flags);
+ swap(new_matrix);
+ return;
+ }
+ }
+ else if (new_n_rows < old_n_rows) {
+ // Drop some rows.
+ rows.erase(rows.begin() + new_n_rows, rows.end());
+ old_n_rows = new_n_rows;
+ }
+ // Here we have the right number of rows.
+ if (new_n_columns != row_size) {
+ if (new_n_columns < row_size) {
+ // Shrink the existing rows.
+ for (dimension_type i = old_n_rows; i-- > 0; )
+ rows[i].shrink(new_n_columns);
+ }
+ else
+ // We need more columns.
+ if (new_n_columns <= 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_columns);
+ 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_columns, max_num_columns());
+ for (dimension_type i = old_n_rows; i-- > 0; ) {
+ Row new_row(new_n_columns, new_row_capacity, row_flags);
+ std::swap(rows[i], new_row);
+ }
+ row_capacity = new_row_capacity;
+ }
+ // Rows have grown or shrunk.
+ row_size = new_n_columns;
+ }
+}
+
+void
+PPL::Matrix::ascii_dump(std::ostream& s) const {
+ const Matrix& x = *this;
+ dimension_type x_num_rows = x.num_rows();
+ dimension_type x_num_columns = x.num_columns();
+ s << x_num_rows << " x " << x_num_columns << "\n";
+ for (dimension_type i = 0; i < x_num_rows; ++i)
+ x[i].ascii_dump(s);
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Matrix);
+
+bool
+PPL::Matrix::ascii_load(std::istream& s) {
+ Matrix& x = *this;
+ std::string str;
+ dimension_type x_num_rows;
+ dimension_type x_num_cols;
+ if (!(s >> x_num_rows))
+ return false;
+ if (!(s >> str) || (str.compare("x") != 0))
+ return false;
+ if (!(s >> x_num_cols))
+ return false;
+
+ resize_no_copy(x_num_rows, x_num_cols, Row::Flags());
+
+ for (dimension_type row = 0; row < x_num_rows; ++row)
+ if (!x[row].ascii_load(s))
+ return false;
+
+ // Check for well-formedness.
+ assert(OK());
+ return true;
+}
+
+void
+PPL::Matrix::swap_columns(const dimension_type i, const dimension_type j) {
+ assert(i != j && i < num_columns() && j < num_columns());
+ for (dimension_type k = num_rows(); k-- > 0; ) {
+ Row& rows_k = rows[k];
+ std::swap(rows_k[i], rows_k[j]);
+ }
+}
+
+void
+PPL::Matrix::remove_trailing_columns(const dimension_type n) {
+ assert(n > 0);
+ assert(n <= row_size);
+ row_size -= n;
+ for (dimension_type i = num_rows(); i-- > 0; )
+ rows[i].shrink(row_size);
+}
+
+void
+PPL::Matrix::permute_columns(const std::vector<dimension_type>& cycles) {
+ TEMP_INTEGER(tmp);
+ const dimension_type n = cycles.size();
+ assert(cycles[n - 1] == 0);
+ for (dimension_type k = num_rows(); k-- > 0; ) {
+ Row& rows_k = rows[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.
+ assert(j - i >= 2);
+ if (j - i == 2)
+ // For cycles of length 2 no temporary is needed, just a swap.
+ std::swap(rows_k[cycles[i]], rows_k[cycles[i+1]]);
+ else {
+ // Longer cycles need a temporary.
+ std::swap(rows_k[cycles[j-1]], tmp);
+ for (dimension_type l = j-1; l > i; --l)
+ std::swap(rows_k[cycles[l-1]], rows_k[cycles[l]]);
+ std::swap(tmp, rows_k[cycles[i]]);
+ }
+ }
+ }
+}
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+bool
+PPL::operator==(const Matrix& x, const Matrix& y) {
+ if (x.num_columns() != y.num_columns())
+ 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;
+ for (dimension_type i = x_num_rows; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+ return true;
+}
+
+PPL::memory_size_type
+PPL::Matrix::external_memory_in_bytes() const {
+ memory_size_type n = rows.capacity() * sizeof(Row);
+ for (dimension_type i = num_rows(); i-- > 0; )
+ n += rows[i].external_memory_in_bytes(row_capacity);
+ return n;
+}
+
+bool
+PPL::Matrix::OK() const {
+ if (row_size > row_capacity) {
+#ifndef NDEBUG
+ std::cerr << "Matrix completely broken: "
+ << "row_capacity is " << row_capacity
+ << ", row_size is " << row_size
+ << std::endl;
+#endif
+ return false;
+ }
+
+ const Matrix& x = *this;
+ for (dimension_type i = 0, n_rows = num_rows(); i < n_rows; ++i)
+ if (!x[i].OK(row_size, row_capacity))
+ return false;
+
+ // All checks passed.
+ return true;
+}
diff --git a/src/Matrix.defs.hh b/src/Matrix.defs.hh
new file mode 100644
index 0000000..bb6ce48
--- /dev/null
+++ b/src/Matrix.defs.hh
@@ -0,0 +1,356 @@
+/* Matrix class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Matrix_defs_hh
+#define PPL_Matrix_defs_hh 1
+
+#include "Matrix.types.hh"
+#include "Row.defs.hh"
+#include "Constraint_System.types.hh"
+#include "Generator_System.types.hh"
+#include "Coefficient.types.hh"
+#include <vector>
+#include <cstddef>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A 2-dimensional matrix of coefficients.
+/*! \ingroup PPL_CXX_interface
+ A Matrix object is a sequence of Row objects and is characterized
+ by the matrix dimensions (the number of rows and columns).
+ All the rows in a matrix, besides having the same size (corresponding
+ to the number of columns of the matrix), are also bound to have the
+ same capacity.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Matrix {
+public:
+ //! Returns the maximum number of rows of a Matrix.
+ static dimension_type max_num_rows();
+
+ //! Returns the maximum number of columns of a Matrix.
+ static dimension_type max_num_columns();
+
+ //! Builds an empty matrix.
+ /*!
+ Rows' size and capacity are initialized to \f$0\f$.
+ */
+ Matrix();
+
+ //! Builds a zero matrix with specified dimensions and flags.
+ /*!
+ \param n_rows
+ The number of rows of the matrix that will be created;
+
+ \param n_columns
+ The number of columns of the matrix that will be created.
+
+ \param row_flags
+ The flags used to build the rows of the matrix;
+ by default, the rows will have all flags unset.
+ */
+ Matrix(dimension_type n_rows, dimension_type n_columns,
+ Row::Flags row_flags = Row::Flags());
+
+ //! Copy-constructor.
+ Matrix(const Matrix& y);
+
+ //! Destructor.
+ ~Matrix();
+
+ //! Assignment operator.
+ Matrix& operator=(const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! An iterator over a matrix.
+ /*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each row contained in a Matrix object.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ class const_iterator {
+ private:
+ typedef std::vector<Row>::const_iterator Iter;
+ //! The const iterator on the rows' vector \p rows.
+ Iter i;
+
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef std::iterator_traits<Iter>::value_type value_type;
+ typedef std::iterator_traits<Iter>::difference_type difference_type;
+ typedef std::iterator_traits<Iter>::pointer pointer;
+ typedef 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;
+
+ // FIXME: the following section must become private.
+protected:
+ //! Contains the rows of the matrix.
+ std::vector<Row> rows;
+
+ //! Size of the initialized part of each row.
+ dimension_type row_size;
+
+ //! Capacity allocated for each row.
+ dimension_type row_capacity;
+
+public:
+ //! Swaps \p *this with \p y.
+ void swap(Matrix& y);
+
+ //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags.
+ /*!
+ \param n
+ The number of rows to be added: must be strictly positive.
+
+ \param row_flags
+ Flags for the newly added rows.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times c\f$ matrix \f$M \choose 0\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_zero_rows(dimension_type n, Row::Flags row_flags);
+
+ //! 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$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_zero_columns(dimension_type n);
+
+ //! 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.
+
+ \param row_flags
+ Flags for the newly added rows.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times (c+m)\f$ matrix
+ \f$\bigl({M \atop 0}{0 \atop 0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_zero_rows_and_columns(dimension_type n, dimension_type m,
+ Row::Flags row_flags);
+
+ //! Adds a copy of the row \p y to the matrix.
+ /*!
+ \param y
+ The row to be copied: it must have the same number of columns as
+ the matrix.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+1) \times c\f$ matrix
+ \f$\bigl({M \atop 0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_row(const Row& y);
+
+ //! 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.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+1) \times c\f$ matrix
+ \f$\bigl({M \atop 0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_recycled_row(Row& y);
+
+ //! Makes the matrix shrink by removing its \p n trailing columns.
+ void remove_trailing_columns(dimension_type n);
+
+ //! Resizes the matrix without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized matrix;
+
+ \param new_n_columns
+ The number of columns of the resized matrix.
+
+ \param row_flags
+ The flags of the rows eventually added to the matrix.
+
+ The matrix is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original matrix is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns,
+ Row::Flags row_flags);
+
+ //! Swaps the columns having indexes \p i and \p j.
+ void swap_columns(dimension_type i, dimension_type j);
+
+ //! Permutes the columns of the matrix.
+ /*
+ \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 non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the matrix has 6
+ 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.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+
+ //! \name Accessors
+ //@{
+
+ //! Returns the number of columns of the matrix (i.e., the size of the rows).
+ dimension_type num_columns() const;
+
+ //! Returns the number of rows in the matrix.
+ dimension_type num_rows() const;
+ //@} // Accessors
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the \p k-th row of the matrix.
+ Row& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the matrix.
+ const Row& operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ //! Clears the matrix deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+ 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
+ Erases from the matrix all the rows but those having
+ an index less than \p first_to_erase.
+ */
+ void erase_to_end(dimension_type first_to_erase);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Specializes <CODE>std::swap</CODE>.
+ /*! \relates Parma_Polyhedra_Library::Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Matrix& x,
+ Parma_Polyhedra_Library::Matrix& 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 Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Matrix& x, const Matrix& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Matrix& x, const Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#include "Matrix.inlines.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..1eeb38c
--- /dev/null
+++ b/src/Matrix.inlines.hh
@@ -0,0 +1,213 @@
+/* Matrix class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Matrix_inlines_hh
+#define PPL_Matrix_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Matrix::max_num_rows() {
+ return std::vector<Row>().max_size();
+}
+
+inline dimension_type
+Matrix::max_num_columns() {
+ return Row::max_size();
+}
+
+inline memory_size_type
+Matrix::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+Matrix::const_iterator::const_iterator()
+ : i(Iter()) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const Iter& b)
+ : i(b) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i) {
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ return *this;
+}
+
+inline Matrix::const_iterator::reference
+Matrix::const_iterator::operator*() const {
+ return *i;
+}
+
+inline Matrix::const_iterator::pointer
+Matrix::const_iterator::operator->() const {
+ return &*i;
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator++() {
+ ++i;
+ return *this;
+}
+
+inline Matrix::const_iterator
+Matrix::const_iterator::operator++(int) {
+ return const_iterator(i++);
+}
+
+inline bool
+Matrix::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Matrix::const_iterator::operator!=(const const_iterator& y) const {
+ return !operator==(y);
+}
+
+inline Matrix::const_iterator
+Matrix::begin() const {
+ return const_iterator(rows.begin());
+}
+
+inline Matrix::const_iterator
+Matrix::end() const {
+ return const_iterator(rows.end());
+}
+
+inline void
+Matrix::swap(Matrix& y) {
+ std::swap(rows, y.rows);
+ std::swap(row_size, y.row_size);
+ std::swap(row_capacity, y.row_capacity);
+}
+
+inline
+Matrix::Matrix()
+ : rows(),
+ row_size(0),
+ row_capacity(0) {
+}
+
+inline
+Matrix::Matrix(const Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size),
+ row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+inline
+Matrix::~Matrix() {
+}
+
+inline Matrix&
+Matrix::operator=(const 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;
+}
+
+inline void
+Matrix::add_row(const Row& y) {
+ Row new_row(y, row_capacity);
+ add_recycled_row(new_row);
+}
+
+inline Row&
+Matrix::operator[](const dimension_type k) {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline const Row&
+Matrix::operator[](const dimension_type k) const {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline dimension_type
+Matrix::num_rows() const {
+ return rows.size();
+}
+
+inline dimension_type
+Matrix::num_columns() const {
+ return row_size;
+}
+
+/*! \relates Matrix */
+inline bool
+operator!=(const Matrix& x, const Matrix& y) {
+ return !(x == y);
+}
+
+inline void
+Matrix::erase_to_end(const dimension_type first_to_erase) {
+ assert(first_to_erase <= rows.size());
+ if (first_to_erase < rows.size())
+ rows.erase(rows.begin() + first_to_erase, rows.end());
+}
+
+inline void
+Matrix::clear() {
+ // Clear `rows' and minimize its capacity.
+ std::vector<Row>().swap(rows);
+ row_size = 0;
+ row_capacity = 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Matrix& x,
+ Parma_Polyhedra_Library::Matrix& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Matrix_inlines_hh)
diff --git a/src/Matrix.types.hh b/src/Matrix.types.hh
new file mode 100644
index 0000000..0871cc9
--- /dev/null
+++ b/src/Matrix.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 {
+
+class Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Matrix_types_hh)
diff --git a/src/NNC_Polyhedron.cc b/src/NNC_Polyhedron.cc
new file mode 100644
index 0000000..6106113
--- /dev/null
+++ b/src/NNC_Polyhedron.cc
@@ -0,0 +1,66 @@
+/* NNC_Polyhedron class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "NNC_Polyhedron.defs.hh"
+#include "C_Polyhedron.defs.hh"
+#include "algorithms.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const C_Polyhedron& y)
+ : Polyhedron(NOT_NECESSARILY_CLOSED, y.space_dimension(), UNIVERSE) {
+ add_constraints(y.constraints());
+ assert(OK());
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(const Congruence_System& cgs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ cgs.space_dimension() <= max_space_dimension()
+ ? cgs.space_dimension()
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"), 0),
+ UNIVERSE) {
+ add_congruences(cgs);
+}
+
+PPL::NNC_Polyhedron::NNC_Polyhedron(Congruence_System& cgs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ cgs.space_dimension() <= max_space_dimension()
+ ? cgs.space_dimension()
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension"), 0),
+ UNIVERSE) {
+ add_congruences(cgs);
+}
+
+bool
+PPL::NNC_Polyhedron::poly_hull_assign_if_exact(const NNC_Polyhedron& y) {
+ return PPL::poly_hull_assign_if_exact(*this, y);
+}
diff --git a/src/NNC_Polyhedron.defs.hh b/src/NNC_Polyhedron.defs.hh
new file mode 100644
index 0000000..f2f1a15
--- /dev/null
+++ b/src/NNC_Polyhedron.defs.hh
@@ -0,0 +1,187 @@
+/* NNC_Polyhedron class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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"
+
+//! 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 will be
+ recycled to build the polyhedron.
+ */
+ explicit NNC_Polyhedron(Constraint_System& cs);
+
+ //! 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 will be
+ recycled to build the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit NNC_Polyhedron(Generator_System& gs);
+
+ //! 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 will 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 will be
+ recycled to build the polyhedron.
+ */
+ explicit NNC_Polyhedron(Congruence_System& cgs);
+
+ //! Builds an NNC polyhedron from the C polyhedron \p y.
+ explicit NNC_Polyhedron(const C_Polyhedron& y);
+
+ //! Builds an NNC polyhedron out of a generic, interval-based bounding box.
+ /*!
+ For a description of the methods that should be provided by
+ the template class Box, see the documentation of the protected method:
+ template \<typename Box\>
+ Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+ \param box
+ The bounding box representing the polyhedron to be built;
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one from the other
+ constructors.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+ */
+ template <typename Box>
+ NNC_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+ //! Ordinary copy-constructor.
+ NNC_Polyhedron(const NNC_Polyhedron& y);
+
+ /*! \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);
+};
+
+#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..7c27be6
--- /dev/null
+++ b/src/NNC_Polyhedron.inlines.hh
@@ -0,0 +1,134 @@
+/* NNC_Polyhedron class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ num_dimensions <= max_space_dimension()
+ ? num_dimensions
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ num_dimensions),
+ kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)) {
+}
+
+template <typename Box>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box& box, From_Bounding_Box)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ box.space_dimension() <= max_space_dimension()
+ ? box
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension"), box)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y)
+ : 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);
+ swap(nnc_y);
+ return *this;
+}
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+ return poly_hull_assign_if_exact(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..cd415c5
--- /dev/null
+++ b/src/NNC_Polyhedron.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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..fc84c3b
--- /dev/null
+++ b/src/Numeric_Format.defs.hh
@@ -0,0 +1,37 @@
+/* Numeric format.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/Ph_Status.cc b/src/Ph_Status.cc
new file mode 100644
index 0000000..1557cff
--- /dev/null
+++ b/src/Ph_Status.cc
@@ -0,0 +1,245 @@
+/* Polyhedron::Status class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include <iostream>
+#include <string>
+#include <cassert>
+
+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) {
+ 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 for well-formedness.
+ 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..c0e03d5
--- /dev/null
+++ b/src/Ph_Status.idefs.hh
@@ -0,0 +1,182 @@
+/* Polyhedron::Status class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Status_defs_hh
+#define PPL_Status_defs_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 \ref ascii_dump)
+ 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_defs_hh)
diff --git a/src/Ph_Status.inlines.hh b/src/Ph_Status.inlines.hh
new file mode 100644
index 0000000..2eddc51
--- /dev/null
+++ b/src/Ph_Status.inlines.hh
@@ -0,0 +1,216 @@
+/* Polyhedron::Status class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+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/Poly_Con_Relation.cc b/src/Poly_Con_Relation.cc
new file mode 100644
index 0000000..a67f8d9
--- /dev/null
+++ b/src/Poly_Con_Relation.cc
@@ -0,0 +1,77 @@
+/* Poly_Con_Relation class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Poly_Con_Relation.defs.hh"
+
+#include <iostream>
+#include <string>
+#include <cassert>
+
+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..2b885a4
--- /dev/null
+++ b/src/Poly_Con_Relation.defs.hh
@@ -0,0 +1,170 @@
+/* Poly_Con_Relation class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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
+ Parma_Polyhedra_Library::operator==(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator!=(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ Parma_Polyhedra_Library::operator&&(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ Parma_Polyhedra_Library::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 foreign
+ 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..b0432af
--- /dev/null
+++ b/src/Poly_Con_Relation.inlines.hh
@@ -0,0 +1,99 @@
+/* Poly_Con_Relation class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..70b12ac
--- /dev/null
+++ b/src/Poly_Con_Relation.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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..5a0d4ef
--- /dev/null
+++ b/src/Poly_Gen_Relation.cc
@@ -0,0 +1,65 @@
+/* Poly_Gen_Relation class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Poly_Gen_Relation.defs.hh"
+
+#include <iostream>
+#include <string>
+#include <cassert>
+
+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..8a6ade3
--- /dev/null
+++ b/src/Poly_Gen_Relation.defs.hh
@@ -0,0 +1,143 @@
+/* Poly_Gen_Relation class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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
+ Parma_Polyhedra_Library::operator==(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator!=(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ Parma_Polyhedra_Library::operator&&(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ Parma_Polyhedra_Library::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 foreign
+ 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..a6b34d3
--- /dev/null
+++ b/src/Poly_Gen_Relation.inlines.hh
@@ -0,0 +1,84 @@
+/* Poly_Gen_Relation class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..ffc3ac9
--- /dev/null
+++ b/src/Poly_Gen_Relation.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Polyhedra_Powerset.cc b/src/Polyhedra_Powerset.cc
new file mode 100644
index 0000000..eda0b73
--- /dev/null
+++ b/src/Polyhedra_Powerset.cc
@@ -0,0 +1,143 @@
+/* Polyhedra_Powerset class implementation: non-inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Polyhedra_Powerset.defs.hh"
+#include <utility>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// FIXME: Commented out so as to avoid a bug in GCC 3.3.3.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+// template <>
+// template <>
+// PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
+// ::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+// : Base(), space_dim(y.space_dimension()) {
+// Polyhedra_Powerset& x = *this;
+// for (Polyhedra_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->element()))
+// );
+// x.reduced = y.reduced;
+// assert(x.OK());
+// }
+
+// FIXME: Commented out so as to avoid a bug in GCC 3.3.3.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+// template <>
+// template <>
+// PPL::Polyhedra_Powerset<PPL::C_Polyhedron>
+// ::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
+// : Base(), space_dim(y.space_dimension()) {
+// Polyhedra_Powerset& x = *this;
+// for (Polyhedra_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->element()))
+// );
+// // 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;
+// assert(x.OK());
+// }
+
+template <>
+void
+PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ // 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& py = yi->element();
+ Sequence tmp_sequence;
+ for (Sequence_const_iterator nsi = new_sequence.begin(),
+ ns_end = new_sequence.end(); nsi != ns_end; ++nsi) {
+ std::pair<NNC_Polyhedron, Polyhedra_Powerset<NNC_Polyhedron> > partition
+ = linear_partition(py, nsi->element());
+ const Polyhedra_Powerset<NNC_Polyhedron>& residues = partition.second;
+ // Append the contents of `residues' to `tmp_sequence'.
+ std::copy(residues.begin(), residues.end(), back_inserter(tmp_sequence));
+ }
+ std::swap(tmp_sequence, new_sequence);
+ }
+ std::swap(x.sequence, new_sequence);
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <>
+bool
+PPL::Polyhedra_Powerset<PPL::NNC_Polyhedron>
+::geometrically_covers(const Polyhedra_Powerset& y) const {
+ const Polyhedra_Powerset& x = *this;
+ for (const_iterator yi = y.begin(), y_end = y.end(); yi != y_end; ++yi)
+ if (!check_containment(yi->element(), x))
+ return false;
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+bool
+PPL::check_containment(const NNC_Polyhedron& ph,
+ const Polyhedra_Powerset<NNC_Polyhedron>& ps) {
+ Polyhedra_Powerset<NNC_Polyhedron> tmp(ph.space_dimension(), EMPTY);
+ tmp.add_disjunct(ph);
+ for (Polyhedra_Powerset<NNC_Polyhedron>::const_iterator
+ i = ps.begin(), ps_end = ps.end(); i != ps_end; ++i) {
+ const NNC_Polyhedron& pi = i->element();
+ for (Polyhedra_Powerset<NNC_Polyhedron>::iterator
+ j = tmp.begin(); j != tmp.end(); ) {
+ const NNC_Polyhedron& pj = j->element();
+ if (pi.contains(pj))
+ j = tmp.drop_disjunct(j);
+ else
+ ++j;
+ }
+ if (tmp.empty())
+ return true;
+ else {
+ Polyhedra_Powerset<NNC_Polyhedron> new_disjuncts(ph.space_dimension(),
+ EMPTY);
+ for (Polyhedra_Powerset<NNC_Polyhedron>::iterator
+ j = tmp.begin(); j != tmp.end(); ) {
+ const NNC_Polyhedron& pj = j->element();
+ if (pj.is_disjoint_from(pi))
+ ++j;
+ else {
+ std::pair<NNC_Polyhedron, Polyhedra_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;
+}
diff --git a/src/Polyhedra_Powerset.defs.hh b/src/Polyhedra_Powerset.defs.hh
new file mode 100644
index 0000000..e0341e4
--- /dev/null
+++ b/src/Polyhedra_Powerset.defs.hh
@@ -0,0 +1,553 @@
+/* Polyhedra_Powerset class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedra_Powerset_defs_hh
+#define PPL_Polyhedra_Powerset_defs_hh
+
+#include "Polyhedra_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.types.hh"
+#include "NNC_Polyhedron.types.hh"
+#include "Polyhedron.defs.hh"
+#include "Variable.defs.hh"
+#include "Determinate.defs.hh"
+#include "Powerset.defs.hh"
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL polyhedra.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Polyhedra_Powerset
+ : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PH> > {
+public:
+ typedef PH element_type;
+
+private:
+ typedef Determinate<PH> CS;
+ typedef Powerset<CS> Base;
+
+public:
+ //! Returns the maximum space dimension a Polyhedra_Powerset<PH> can handle.
+ static dimension_type max_space_dimension();
+
+ //! \name Constructors
+ //@{
+
+ //! Builds a universe (top) or empty (bottom) Polyhedra_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
+ Polyhedra_Powerset(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy-constructor.
+ Polyhedra_Powerset(const Polyhedra_Powerset& y);
+
+ /*! \brief
+ If \p ph is nonempty, builds a powerset containing only \p ph.
+ Builds the empty powerset otherwise.
+ */
+ explicit Polyhedra_Powerset(const PH& ph);
+
+ /*! \brief
+ Copy-constructor allowing a source powerset with elements of a
+ different polyhedron kind.
+ */
+ template <typename QH>
+ explicit Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+ /*! \brief
+ Creates a Polyhedra_Powerset with a single polyhedron
+ with the same information contents as \p cs.
+ */
+ explicit Polyhedra_Powerset(const Constraint_System& cs);
+
+ //! Creates a Polyhedra_Powerset with a single polyhedron
+ //! with the same information contents as \p cgs.
+ explicit Polyhedra_Powerset(const Congruence_System& cgs);
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Powerset of Polyhedra
+ //@{
+
+ //! 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 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 topology-incompatible or
+ dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_covers(const Polyhedra_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 topology-incompatible or
+ dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_equals(const Polyhedra_Powerset& 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;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Powerset
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Powerset of Polyhedra
+ //@{
+
+ //! 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 PH& 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);
+
+ //! Intersects \p *this with the constraint \p c, minimizing the result.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool add_constraint_and_minimize(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
+ Intersects \p *this with the constraints in \p cs,
+ minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraints to intersect with.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ /*! \brief
+ Assign to \p *this the result of (recursively) merging together
+ the pairs of polyhedra whose poly-hull is the same as their
+ set-theoretical union.
+
+ On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different polyhedra
+ 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 wf
+ and the cardinality threshold \p max_disjuncts.
+
+ \param y
+ A finite powerset of polyhedra.
+ It <EM>must</EM> definitely entail \p *this;
+
+ \param wf
+ 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 topology-incompatible or
+ 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 Polyhedra_Powerset& y,
+ Widening wf,
+ 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 wf
+ certified by the convergence certificate \p Cert.
+
+ \param y
+ The finite powerset of polyhedra computed in the previous iteration step.
+ It <EM>must</EM> definitely entail \p *this;
+
+ \param wf
+ The widening function to be used on polyhedra objects.
+ 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 topology-incompatible or
+ 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 wf; 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 Polyhedra_Powerset& y, Widening wf);
+
+ //@} // 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).
+ */
+ Polyhedra_Powerset& operator=(const Polyhedra_Powerset& y);
+
+ /*! \brief
+ Assignment operator allowing a source powerset with elements of a
+ different polyhedron kind
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ template <typename QH>
+ Polyhedra_Powerset& operator=(const Polyhedra_Powerset<QH>& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Polyhedra_Powerset& y);
+
+ /*! \brief
+ Adds \p m new dimensions to the vector space containing \p *this
+ and embeds each polyhedron 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 polyhedra in \p *this in the new space.
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ The result is obtained by intersecting each polyhedron in \p *this
+ with each polyhedron in \p y and collecting all these intersections.
+ */
+ void intersection_assign(const Polyhedra_Powerset& y);
+
+ //! Assigns to \p *this the difference of \p *this and \p y.
+ /*!
+ The result is obtained by computing the
+ \ref Convex_Polyhedral_Difference "poly-difference" of each polyhedron
+ in \p *this with each polyhedron in \p y and collecting all these
+ differences.
+ */
+ void poly_difference_assign(const Polyhedra_Powerset& y);
+
+ //! 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 polyhedron
+ in \p *this with each polyhedron in \p y.
+ */
+ void concatenate_assign(const Polyhedra_Powerset& y);
+
+ /*! \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 polyhedron
+ in \p *this with each polyhedron in \p y.
+ */
+ void time_elapse_assign(const Polyhedra_Powerset& y);
+
+ //! Removes all the specified space dimensions.
+ /*!
+ \param to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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);
+
+ //@} // 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;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) and sets \p *this accordingly. Returns <CODE>true</CODE>
+ if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 *this the result of applying the BGP99 heuristics
+ to \p *this and \p y, using the widening function \p wf.
+ */
+ template <typename Widening>
+ void BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf);
+
+ //! Records in \p cert_ms the certificates for this set of polyhedra.
+ 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 polyhedra
+ 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 templatic constructor
+ // template <typename QH>
+ // Polyhedra_Powerset(const Polyhedra_Powerset<QH>&)
+ // but, apparently, this cannot be done.
+ // As a workaround, we could use
+ // friend class Polyhedra_Powerset<NNC_Polyhedron>
+ // but GCC 3.3.3 has a bug that causes its rejection.
+ // So, temporarily, we make all Polyhedra_Powerset's friends of each other.
+ template <typename QH> friend class Polyhedra_Powerset;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Polyhedra_Powerset
+ Let \p p and \p q be two polyhedra.
+ The function returns an object <CODE>r</CODE> of type
+ <CODE>std::pair\<PH, Polyhedra_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 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://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
+ this paper</A> for more information about the implementation.
+ \endif
+*/
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& 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 Polyhedra_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+ const Polyhedra_Powerset<NNC_Polyhedron>& ps);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the objects in \p ps contains \p ph.
+
+ \relates Polyhedra_Powerset
+ \note
+ It is assumed that the template parameter PH can be converted
+ without precision loss into an NNC_Polyhedron; otherwise,
+ an incorrect result might be obtained.
+*/
+template <typename PH>
+bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps);
+
+// CHECK ME: 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>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// CHECK ME: 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>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y);
+
+template <>
+template <>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y);
+
+template <>
+void
+Polyhedra_Powerset<NNC_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y);
+
+template <>
+bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Polyhedra_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+ Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y);
+
+} // namespace std
+
+#include "Polyhedra_Powerset.inlines.hh"
+#include "Polyhedra_Powerset.templates.hh"
+
+#endif // !defined(PPL_Polyhedra_Powerset_defs_hh)
diff --git a/src/Polyhedra_Powerset.inlines.hh b/src/Polyhedra_Powerset.inlines.hh
new file mode 100644
index 0000000..5c1b615
--- /dev/null
+++ b/src/Polyhedra_Powerset.inlines.hh
@@ -0,0 +1,268 @@
+/* Polyhedra_Powerset class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedra_Powerset_inlines_hh
+#define PPL_Polyhedra_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 PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::max_space_dimension() {
+ return PH::max_space_dimension();
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Base(), space_dim(num_dimensions) {
+ Polyhedra_Powerset& x = *this;
+ if (kind == UNIVERSE)
+ x.sequence.push_back(Determinate<PH>(PH(num_dimensions, kind)));
+ assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Polyhedra_Powerset& y)
+ : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const PH& ph)
+ : Base(ph), space_dim(ph.space_dimension()) {
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (Polyhedra_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->element()))
+ );
+ x.reduced = y.reduced;
+ assert(x.OK());
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (Polyhedra_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->element()))
+ );
+ // 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;
+ assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs)
+ // FIXME: calling Base(Determinate<PH>(cs)) will automatically handle
+ // the flag `reduced', but it will also force a non-emptiness test
+ // on the constraint system `cs'.
+ : Base(), space_dim(cs.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ x.sequence.push_back(Determinate<PH>(cs));
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Congruence_System& cgs)
+ // FIXME: calling Base(Determinate<PH>(cgs)) will automatically handle
+ // the flag `reduced', but it will also force a non-emptiness test
+ // on the congruence system `cgs'.
+ : Base(), space_dim(cgs.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ x.sequence.push_back(Determinate<PH>(cgs));
+ x.reduced = false;
+ assert(OK());
+}
+
+template <typename PH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.Base::operator=(y);
+ x.space_dim = y.space_dim;
+ return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::swap(Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.Base::swap(y);
+ std::swap(x.space_dim, y.space_dim);
+}
+
+template <typename PH>
+template <typename QH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset<QH>& y) {
+ Polyhedra_Powerset& x = *this;
+ Polyhedra_Powerset<PH> pps(y);
+ x.swap(pps);
+ return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::intersection_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y, CS::lift_op_assign(std::mem_fun_ref(&PH::intersection_assign)));
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::time_elapse_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y, CS::lift_op_assign(std::mem_fun_ref(&PH::time_elapse_assign)));
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_covers(const Polyhedra_Powerset& y) const {
+ const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+ const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy);
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+ const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+ const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+ const Polyhedra_Powerset& x = *this;
+ return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::external_memory_in_bytes() const {
+ return Base::external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <>
+inline void
+Polyhedra_Powerset<C_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset<NNC_Polyhedron> nnc_this(*this);
+ Polyhedra_Powerset<NNC_Polyhedron> nnc_y(y);
+ nnc_this.poly_difference_assign(nnc_y);
+ *this = nnc_this;
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps) {
+ const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
+ const Polyhedra_Powerset<NNC_Polyhedron> pps(ps);
+ return check_containment(pph, pps);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+ const Polyhedra_Powerset<C_Polyhedron>& ps) {
+ return check_containment(NNC_Polyhedron(ph),
+ Polyhedra_Powerset<NNC_Polyhedron>(ps));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+ Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Polyhedra_Powerset_inlines_hh)
diff --git a/src/Polyhedra_Powerset.templates.hh b/src/Polyhedra_Powerset.templates.hh
new file mode 100644
index 0000000..9616002
--- /dev/null
+++ b/src/Polyhedra_Powerset.templates.hh
@@ -0,0 +1,684 @@
+/* Polyhedra_Powerset class implementation: non-inline template functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedra_Powerset_templates_hh
+#define PPL_Polyhedra_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 <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_disjunct(const PH& ph) {
+ Polyhedra_Powerset& x = *this;
+ if (x.space_dimension() != ph.space_dimension()) {
+ std::ostringstream s;
+ s << "PPL::Polyhedra_Powerset<PH>::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<PH>(ph));
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (typename Polyhedra_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->element().constraints()))
+ );
+ x.reduced = y.reduced;
+ assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<C_Polyhedron>(
+ C_Polyhedron(i->element().constraints()))
+ );
+ // 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;
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::concatenate_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ x.omega_reduce();
+ y.omega_reduce();
+ Polyhedra_Powerset<PH> 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) {
+ CS zi = *xi;
+ zi.concatenate_assign(*yi);
+ assert(!zi.is_bottom());
+ new_x.sequence.push_back(zi);
+ }
+ ++xi;
+ if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
+ // Hurry up!
+ PH xph = xi->element();
+ for (++xi; xi != x_end; ++xi)
+ xph.upper_bound_assign(xi->element());
+ const_iterator yi = y_begin;
+ PH yph = yi->element();
+ for (++yi; yi != y_end; ++yi)
+ yph.upper_bound_assign(yi->element());
+ xph.concatenate_assign(yph);
+ x.swap(new_x);
+ x.add_disjunct(xph);
+ assert(x.OK());
+ return;
+ }
+ }
+ x.swap(new_x);
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraint(const Constraint& c) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_constraint(c);
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::add_constraint_and_minimize(const Constraint& c) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; )
+ if (!si->element().add_constraint_and_minimize(c))
+ si = x.sequence.erase(si);
+ else {
+ x.reduced = false;
+ ++si;
+ }
+ assert(x.OK());
+ return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraints(const Constraint_System& cs) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_constraints(cs);
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::
+add_constraints_and_minimize(const Constraint_System& cs) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; )
+ if (!si->element().add_constraints_and_minimize(cs))
+ si = x.sequence.erase(si);
+ else {
+ x.reduced = false;
+ ++si;
+ }
+ assert(x.OK());
+ return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_embed(dimension_type m) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_space_dimensions_and_embed(m);
+ x.space_dim += m;
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_project(dimension_type m) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_space_dimensions_and_project(m);
+ x.space_dim += m;
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::
+remove_space_dimensions(const Variables_Set& to_be_removed) {
+ Polyhedra_Powerset& x = *this;
+ Variables_Set::size_type num_removed = to_be_removed.size();
+ if (num_removed > 0) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->element().remove_space_dimensions(to_be_removed);
+ x.reduced = false;
+ }
+ x.space_dim -= num_removed;
+ assert(x.OK());
+ }
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::remove_higher_space_dimensions(dimension_type
+ new_dimension) {
+ Polyhedra_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->element().remove_higher_space_dimensions(new_dimension);
+ x.reduced = false;
+ }
+ x.space_dim = new_dimension;
+ assert(x.OK());
+ }
+}
+
+template <typename PH>
+template <typename Partial_Function>
+void
+Polyhedra_Powerset<PH>::map_space_dimensions(const Partial_Function& pfunc) {
+ Polyhedra_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->element().map_space_dimensions(pfunc);
+ x.space_dim = s_begin->element().space_dimension();
+ x.reduced = false;
+ }
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::pairwise_reduce() {
+ Polyhedra_Powerset& x = *this;
+ // It is wise to omega-reduce before pairwise-reducing.
+ x.omega_reduce();
+
+ size_type n = x.size();
+ size_type deleted;
+ do {
+ Polyhedra_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;
+ PH& pi = si->element();
+ 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 PH& pj = sj->element();
+ if (pi.upper_bound_assign_if_exact(pj)) {
+ marked[si_index] = marked[sj_index] = true;
+ new_x.add_non_bottom_disjunct(pi);
+ ++deleted;
+ goto next;
+ }
+ }
+ next:
+ ;
+ }
+ iterator nx_begin = new_x.begin();
+ iterator nx_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])
+ nx_begin = new_x.add_non_bottom_disjunct(*xi, nx_begin, nx_end);
+ std::swap(x.sequence, new_x.sequence);
+ n -= deleted;
+ } while (deleted > 0);
+ assert(x.OK());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf) {
+ // `x' is the current iteration value.
+ Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Polyhedra_Powerset<PH> x_copy = x;
+ const Polyhedra_Powerset<PH> y_copy = y;
+ assert(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ size_type n = x.size();
+ Polyhedra_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 PH& pi = i->element();
+ const PH& pj = j->element();
+ if (pi.contains(pj)) {
+ PH pi_copy = pi;
+ wf(pi_copy, pj);
+ new_x.add_non_bottom_disjunct(pi_copy);
+ marked[i_index] = true;
+ }
+ }
+ iterator nx_begin = new_x.begin();
+ iterator nx_end = new_x.end();
+ i_index = 0;
+ for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+ if (!marked[i_index])
+ nx_begin = new_x.add_non_bottom_disjunct(*i, nx_begin, nx_end);
+ std::swap(x.sequence, new_x.sequence);
+ assert(x.OK());
+ assert(x.is_omega_reduced());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
+ Widening wf,
+ unsigned max_disjuncts) {
+ // `x' is the current iteration value.
+ Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Polyhedra_Powerset<PH> x_copy = x;
+ const Polyhedra_Powerset<PH> y_copy = y;
+ assert(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ x.pairwise_reduce();
+ if (max_disjuncts != 0)
+ x.collapse(max_disjuncts);
+ x.BGP99_heuristics_assign(y, wf);
+}
+
+template <typename PH>
+template <typename Cert>
+void
+Polyhedra_Powerset<PH>::
+collect_certificates(std::map<Cert, size_type,
+ typename Cert::Compare>& cert_ms) const {
+ const Polyhedra_Powerset& x = *this;
+ assert(x.is_omega_reduced());
+ assert(cert_ms.size() == 0);
+ for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
+ Cert ph_cert(i->element());
+ ++cert_ms[ph_cert];
+ }
+}
+
+template <typename PH>
+template <typename Cert>
+bool
+Polyhedra_Powerset<PH>::
+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(),
+ xend = x_cert_ms.end(),
+ yi = y_cert_ms.begin(),
+ yend = y_cert_ms.end();
+ while (xi != xend && yi != yend) {
+ 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 == xend or yi == yend.
+ // Stabilization is achieved if `y_cert_ms' still has other elements.
+ return yi != yend;
+}
+
+template <typename PH>
+template <typename Cert, typename Widening>
+void
+Polyhedra_Powerset<PH>::BHZ03_widening_assign(const Polyhedra_Powerset& y,
+ Widening wf) {
+ // `x' is the current iteration value.
+ Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Polyhedra_Powerset<PH> x_copy = x;
+ const Polyhedra_Powerset<PH> y_copy = y;
+ assert(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ // First widening technique: do nothing.
+
+ // If `y' is the empty collection, do nothing.
+ assert(x.size() > 0);
+ if (y.size() == 0)
+ return;
+
+ // Compute the poly-hull of `x'.
+ PH 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->element());
+
+ // Compute the poly-hull of `y'.
+ PH 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->element());
+ // 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.
+ Polyhedra_Powerset<PH> bgp99_heuristics = x;
+ bgp99_heuristics.BGP99_heuristics_assign(y, wf);
+
+ // Compute the poly-hull of `bgp99_heuristics'.
+ PH bgp99_heuristics_hull(x.space_dim, EMPTY);
+ for (const_iterator i = bgp99_heuristics.begin(),
+ bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
+ bgp99_heuristics_hull.upper_bound_assign(i->element());
+
+ // 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.
+ std::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)) {
+ std::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.
+ Polyhedra_Powerset<PH> reduced_bgp99_heuristics(bgp99_heuristics);
+ reduced_bgp99_heuristics.pairwise_reduce();
+ if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+ std::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).
+ PH ph = bgp99_heuristics_hull;
+ wf(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.
+ Polyhedra_Powerset<PH> x_hull_singleton(x.space_dim, EMPTY);
+ x_hull_singleton.add_disjunct(x_hull);
+ std::swap(x, x_hull_singleton);
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::ascii_dump(std::ostream& s) const {
+ const Polyhedra_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->element().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PH, Polyhedra_Powerset<PH>);
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::ascii_load(std::istream& s) {
+ Polyhedra_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;
+
+ Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+ while (sz-- > 0) {
+ PH ph;
+ if (!ph.ascii_load(s))
+ return false;
+ new_x.add_disjunct(ph);
+ }
+ x.swap(new_x);
+
+ // Check for well-formedness.
+ assert(x.OK());
+ return true;
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::OK() const {
+ const Polyhedra_Powerset& x = *this;
+ for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+ const PH& pi = xi->element();
+ 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 Polyhedra_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p qq according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset
+ On exit, the intersection of \p qq and constraint \p c is stored
+ in \p qq, whereas the intersection of \p qq with the negation of \p c
+ is added as a new disjunct of the powerset \p r.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+void
+linear_partition_aux(const Constraint& c,
+ PH& qq,
+ Polyhedra_Powerset<NNC_Polyhedron>& r) {
+ Linear_Expression le(c);
+ Constraint neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+ NNC_Polyhedron qqq(qq);
+ if (qqq.add_constraint_and_minimize(neg_c))
+ r.add_disjunct(qqq);
+ qq.add_constraint(c);
+}
+
+} // namespace Polyhedra_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& q) {
+ using Implementation::Polyhedra_Powersets::linear_partition_aux;
+
+ Polyhedra_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+ PH qq = q;
+ const Constraint_System& pcs = p.constraints();
+ for (Constraint_System::const_iterator i = pcs.begin(),
+ pcs_end = pcs.end(); i != pcs_end; ++i) {
+ const Constraint c = *i;
+ if (c.is_equality()) {
+ Linear_Expression le(c);
+ linear_partition_aux(le <= 0, qq, r);
+ linear_partition_aux(le >= 0, qq, r);
+ }
+ else
+ linear_partition_aux(c, qq, r);
+ }
+ return std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >(qq, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedra_Powerset_templates_hh)
diff --git a/src/Polyhedra_Powerset.types.hh b/src/Polyhedra_Powerset.types.hh
new file mode 100644
index 0000000..e4a05fc
--- /dev/null
+++ b/src/Polyhedra_Powerset.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Polyhedra_Powerset_types_hh
+#define PPL_Polyhedra_Powerset_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Polyhedra_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedra_Powerset_types_hh)
diff --git a/src/Polyhedron.defs.hh b/src/Polyhedron.defs.hh
new file mode 100644
index 0000000..6ed78bd
--- /dev/null
+++ b/src/Polyhedron.defs.hh
@@ -0,0 +1,2475 @@
+/* Polyhedron class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 "Linear_Expression.defs.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 "Saturation_Matrix.defs.hh"
+#include "Generator.types.hh"
+#include "Congruence.defs.hh"
+#include "Poly_Con_Relation.defs.hh"
+#include "Poly_Gen_Relation.defs.hh"
+#include "BHRZ03_Certificate.types.hh"
+#include "H79_Certificate.types.hh"
+#include "BD_Shape.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
+
+/*! \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 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.
+ Most operators on polyhedra are provided with two implementations:
+ one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+ also enforces the minimization of the representations,
+ and returns the Boolean value <CODE>false</CODE> whenever
+ the resulting polyhedron turns out to be empty.
+
+ 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 to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ ph.remove_space_dimensions(to_be_removed);
+ \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> to_be_removed1;
+ to_be_removed1.insert(y);
+ ph.remove_space_dimensions(to_be_removed1);
+ set<Variable> to_be_removed2;
+ to_be_removed2.insert(z);
+ ph.remove_space_dimensions(to_be_removed2);
+ \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 to_be_removed2
+ 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:
+ //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+ static dimension_type max_space_dimension();
+
+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.
+ Polyhedron(const Polyhedron& y);
+
+ //! 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 will be
+ recycled to build the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p cs is incompatible with \p topol.
+ */
+ Polyhedron(Topology topol, Constraint_System& cs);
+
+ //! 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 will be
+ recycled to build 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, Generator_System& gs);
+
+ //! Builds a polyhedron out of a generic, interval-based bounding box.
+ /*!
+ \param topol
+ The topology of the polyhedron;
+
+ \param box
+ The bounding box representing the polyhedron to be built.
+
+ \exception std::invalid_argument
+ Thrown if \p box has intervals that are incompatible with \p topol.
+
+ The template class Box must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the polyhedron
+ represented by the bounding box.
+ \code
+ bool is_empty() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the bounding box
+ describes the empty set.
+ The <CODE>is_empty()</CODE> method will always be called before the
+ methods below. However, if <CODE>is_empty()</CODE> returns
+ <CODE>true</CODE>, none of the functions below will be called.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ */
+ template <typename Box>
+ Polyhedron(Topology topol, const Box& box);
+
+ /*! \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;
+
+ /*! \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 <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;
+
+ /*! \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 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 point
+ 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 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 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 point
+ 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 point are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& point) 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;
+
+ /*! \brief
+ Uses \p *this to shrink a generic, interval-based bounding box.
+ Assigns to \p box the intersection of \p box with the smallest
+ bounding box containing \p *this.
+
+ \param box
+ The bounding box to be shrunk;
+
+ \param complexity
+ The complexity class of the algorithm to be used.
+
+ If the polyhedron \p *this or \p box is empty, then the empty box
+ is returned.
+
+ If \p *this and \p box are non-empty, then, for
+ each space dimension \f$k\f$ with variable \f$\mathrm{var}\f$, let
+ \f$u\f$ be the upper and \f$l\f$ the lower bound of the smallest
+ interval containing \p *this.
+
+ If \f$l\f$ is infinite, then \p box is unaltered; if \f$l\f$ is
+ finite, then the \p box interval for space dimension \f$k\f$ is
+ (destructively) intersected with \f$[l, +\mathrm{infty})\f$ if a
+ point of \p *this satisfies \f$\mathrm{var} == l\f$ and with
+ \f$(l, +\mathrm{infty})\f$ otherwise.
+
+ Similarly, if \f$u\f$ is infinite, then \p box is unaltered; if
+ \f$u\f$ is finite, then the \p box interval for space dimension
+ \f$k\f$ is (destructively) intersected with \f$(-\mathrm{infty},
+ u]\f$ if a point of \p *this satisfies \f$\mathrm{var} == u\f$ and
+ with \f$(-\mathrm{infty}, u)\f$ otherwise.
+
+ The template class Box must provide the following methods, whose
+ return values, if any, are simply ignored.
+ \code
+ set_empty()
+ \endcode
+ causes the box to become empty, i.e., to represent the empty set.
+ \code
+ raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+ \code
+ lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+ is <CODE>false</CODE>.
+
+ The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+ will be called at most once for each possible value for <CODE>k</CODE>
+ and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+ that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+ is positive, \f$0/1\f$ being the unique representation for zero.
+ The same guarantee is offered for the function
+ <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+ */
+ template <typename Box>
+ void shrink_bounding_box(Box& box,
+ Complexity_Class complexity = ANY_COMPLEXITY) 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).
+
+ \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 constraint \p c to the system of constraints
+ of \p *this, minimizing the result
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are topology-incompatible
+ or dimension-incompatible.
+ */
+ bool add_constraint_and_minimize(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 generator \p g to the system of generators
+ of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_generator_and_minimize(const Generator& g);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to the system of congruences of \p
+ *this (without minimizing the result).
+
+ \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
+ 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 that will be recycled, adding its
+ constraints 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.
+
+ \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 constraints in \p cs to the system
+ of constraints of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraint system that will be recycled, adding its
+ constraints 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.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ bool add_recycled_constraints_and_minimize(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 that will be recycled, adding its generators
+ 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.
+
+ \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 generators in \p gs to the system
+ of generators of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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 the system
+ of generators \p gs is not empty, but has no points.
+ */
+ bool add_generators_and_minimize(const Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators
+ of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param gs
+ The generator system that will be recycled, adding its generators
+ 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 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.
+ */
+ bool add_recycled_generators_and_minimize(Generator_System& gs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p
+ cgs (without minimizing the result).
+
+ \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 topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_congruences(const 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 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 intersection of \p *this and \p y,
+ minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool intersection_assign_and_minimize(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the poly-hull of \p *this and \p y.
+ The result is not guaranteed to be minimized.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void poly_hull_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the poly-hull of \p *this and \p y,
+ minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool poly_hull_assign_and_minimize(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. The result is not guaranteed to be minimized.
+
+ \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 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());
+
+ /*! \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,
+ const 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,
+ const 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,
+ const 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,
+ const 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);
+
+ //! 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
+ Improves the result of the \ref 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
+ 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
+ Improves the result of the \ref 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
+ 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);
+
+ /*! \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 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
+ 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, 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
+ 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 to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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 class 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 to_be_folded into \p var.
+ /*!
+ \param to_be_folded
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param var
+ 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 var or with
+ one of the Variable objects contained in \p to_be_folded.
+ Also thrown if \p var is contained in \p to_be_folded.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ \p to_be_folded is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p var is not a member
+ of \p to_be_folded, then the space dimensions corresponding to
+ variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool Parma_Polyhedra_Library::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 swap(Polyhedron& y);
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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;
+
+ //@} // Miscellaneous Member Functions
+
+private:
+ //! The system of constraints.
+ Constraint_System con_sys;
+
+ //! The system of generators.
+ Generator_System gen_sys;
+
+ //! The saturation matrix having constraints on its columns.
+ Saturation_Matrix sat_c;
+
+ //! The saturation matrix having generators on its columns.
+ Saturation_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;
+
+ //! \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;
+
+ //@} // 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 point
+ 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 point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& point) 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_selected) 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_con_sys);
+
+ 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);
+
+ //@} // Widening- and Extrapolation-Related Functions
+
+ //! Adds new space dimensions to the given matrices.
+ /*!
+ \param mat1
+ The matrix to which columns are added;
+
+ \param mat2
+ The matrix to which rows and columns are added;
+
+ \param sat1
+ The saturation matrix whose columns are indexed by the rows of
+ matrix \p mat1. On entry it is up-to-date;
+
+ \param sat2
+ The saturation matrix whose columns are indexed by the rows of \p
+ mat2;
+
+ \param add_dim
+ The number of space dimensions to add.
+
+ Adds new space dimensions to the vector space modifying the matrices.
+ This function is invoked only by
+ <CODE>add_space_dimensions_and_embed()</CODE> and
+ <CODE>add_space_dimensions_and_project()</CODE>, passing the matrix of
+ constraints and that of generators (and the corresponding saturation
+ matrices) in different order (see those methods for details).
+ */
+ static void add_space_dimensions(Linear_System& mat1,
+ Linear_System& mat2,
+ Saturation_Matrix& sat1,
+ Saturation_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.
+ static bool minimize(bool con_to_gen,
+ Linear_System& source,
+ Linear_System& dest,
+ Saturation_Matrix& sat);
+
+ /*! \brief
+ Adds given constraints and builds minimized corresponding generators
+ or vice versa.
+ */
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ static bool add_and_minimize(bool con_to_gen,
+ Linear_System& source1,
+ Linear_System& dest,
+ Saturation_Matrix& sat,
+ const Linear_System& 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.
+ static bool add_and_minimize(bool con_to_gen,
+ Linear_System& source,
+ Linear_System& dest,
+ Saturation_Matrix& sat);
+
+ //! Performs the conversion from constraints to generators and vice versa.
+ // Detailed Doxygen comment to be found in file conversion.cc.
+ static dimension_type conversion(Linear_System& source,
+ dimension_type start,
+ Linear_System& dest,
+ Saturation_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.
+ static int simplify(Linear_System& mat, Saturation_Matrix& sat);
+
+ //@} // Minimization-Related Static Member Functions
+
+ template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+ friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+ friend class Parma_Polyhedra_Library::H79_Certificate;
+
+
+ //! \name Exception Throwers
+ //@{
+protected:
+ void throw_runtime_error(const char* method) const;
+ 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* e_name,
+ const Linear_Expression& e) 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;
+ void throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ const Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ // Note: it has to be a static method, because it can be called inside
+ // constructors (before actually constructing the polyhedron object).
+ static void throw_space_dimension_overflow(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;
+ //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+void swap(Parma_Polyhedra_Library::Polyhedron& x,
+ Parma_Polyhedra_Library::Polyhedron& y);
+
+} // namespace std
+
+#include "Ph_Status.inlines.hh"
+#include "Polyhedron.inlines.hh"
+#include "Polyhedron.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..e9265c0
--- /dev/null
+++ b/src/Polyhedron.inlines.hh
@@ -0,0 +1,344 @@
+/* Polyhedron class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedron_inlines_hh
+#define PPL_Polyhedron_inlines_hh 1
+
+#include "Interval.defs.hh"
+#include "Generator.defs.hh"
+#include "LP_Problem.defs.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::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_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 dimension_type
+Polyhedron::space_dimension() const {
+ return space_dim;
+}
+
+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
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::swap(Polyhedron& y) {
+ if (topology() != y.topology())
+ throw_topology_incompatible("swap(y)", "y", y);
+ std::swap(con_sys, y.con_sys);
+ std::swap(gen_sys, y.gen_sys);
+ std::swap(sat_c, y.sat_c);
+ std::swap(sat_g, y.sat_g);
+ std::swap(status, y.status);
+ std::swap(space_dim, y.space_dim);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+inline void
+std::swap(Parma_Polyhedra_Library::Polyhedron& x,
+ Parma_Polyhedra_Library::Polyhedron& y) {
+ x.swap(y);
+}
+
+namespace Parma_Polyhedra_Library {
+
+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 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 {
+ assert(space_dim > 0 && !marked_empty());
+ assert(has_something_pending());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ if (x.has_pending_constraints())
+ return x.process_pending_constraints();
+
+ assert(x.has_pending_generators());
+ x.process_pending_generators();
+ return true;
+}
+
+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 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);
+}
+
+/*! \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);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Polyhedron_inlines_hh)
diff --git a/src/Polyhedron.templates.hh b/src/Polyhedron.templates.hh
new file mode 100644
index 0000000..24fbcfb
--- /dev/null
+++ b/src/Polyhedron.templates.hh
@@ -0,0 +1,512 @@
+/* Polyhedron class implementation: non-inline template functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Polyhedron_templates_hh
+#define PPL_Polyhedron_templates_hh 1
+
+#include "Interval.defs.hh"
+#include "Generator.defs.hh"
+#include "LP_Problem.defs.hh"
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Polyhedron::Polyhedron(Topology topol, const Box& box)
+ : con_sys(topol),
+ gen_sys(topol),
+ 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;
+ }
+
+ // Insert a dummy constraint of the highest dimension to avoid the
+ // need of resizing the matrix of constraints later;
+ // this constraint will be removed at the end.
+ con_sys.insert(Variable(space_dim - 1) >= 0);
+
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ // See if we have a valid lower bound.
+ bool l_closed = false;
+ Coefficient l_n, l_d;
+ bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+ if (l_bounded && topol == NECESSARILY_CLOSED && !l_closed)
+ throw_invalid_argument("C_Polyhedron(const Box& box):",
+ " box has an open lower bound");
+ // See if we have a valid upper bound.
+ bool u_closed = false;
+ Coefficient u_n, u_d;
+ bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+ if (u_bounded && topol == NECESSARILY_CLOSED && !u_closed)
+ throw_invalid_argument("C_Polyhedron(const Box& box):",
+ " box has an open upper bound");
+
+ // 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 * Variable(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 * Variable(k) >= l_n);
+ else
+ // Add the constraint `l_d*v_k > l_n'.
+ con_sys.insert(l_d * Variable(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 * Variable(k) <= u_n);
+ else
+ // Add the constraint `u_d*v_k < u_n'.
+ con_sys.insert(u_d * Variable(k) < u_n);
+ }
+ }
+ }
+
+ // Adding the low-level constraints.
+ con_sys.add_low_level_constraints();
+ // Now removing the dummy constraint inserted before.
+ dimension_type n_rows = con_sys.num_rows() - 1;
+ con_sys[0].swap(con_sys[n_rows]);
+ con_sys.set_sorted(false);
+ // NOTE: here there are no pending constraints.
+ con_sys.set_index_first_pending_row(n_rows);
+ con_sys.erase_to_end(n_rows);
+
+ // Constraints are up-to-date.
+ set_constraints_up_to_date();
+ assert(OK());
+}
+
+template <typename Box>
+void
+Polyhedron::shrink_bounding_box(Box& box, Complexity_Class complexity) const {
+ bool reduce_complexity = (complexity != ANY_COMPLEXITY);
+ if (!reduce_complexity
+ || (!has_something_pending() && constraints_are_minimized())) {
+ // If the constraint system is minimized, the test `is_universe()'
+ // is not exponential.
+ if (is_universe())
+ return;
+ }
+ if (reduce_complexity) {
+ if (marked_empty()
+ || (generators_are_up_to_date() && gen_sys.num_rows() == 0)) {
+ box.set_empty();
+ return;
+ }
+ else if (constraints_are_up_to_date()) {
+ // See if there is at least one inconsistent constraint in `con_sys'.
+ for (Constraint_System::const_iterator i = con_sys.begin(),
+ cs_end = con_sys.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ box.set_empty();
+ return;
+ }
+ // If `complexity' allows it, use the LP_Problem solver to determine
+ // whether or not the polyhedron is empty.
+ if (complexity == SIMPLEX_COMPLEXITY
+ // TODO: find a workaround for NNC polyhedra.
+ && is_necessarily_closed()) {
+ LP_Problem lp(con_sys);
+ if (!lp.is_satisfiable()) {
+ box.set_empty();
+ return;
+ }
+ }
+ }
+ }
+ else
+ // The flag `reduce_complexity' is `false'.
+ // Note that the test `is_empty()' is exponential in the worst case.
+ if (is_empty()) {
+ box.set_empty();
+ return;
+ }
+
+ if (space_dim == 0)
+ return;
+
+ // The following vectors will store the lower and upper bound
+ // for each dimension.
+ // Lower bounds are initialized to open plus infinity.
+ std::vector<LBoundary>
+ lower_bound(space_dim,
+ LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN));
+ // Upper bounds are initialized to open minus infinity.
+ std::vector<UBoundary>
+ upper_bound(space_dim,
+ UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN));
+
+ if (!reduce_complexity && has_something_pending())
+ process_pending();
+
+ // TODO: use simplex to derive variable bounds, if the complexity
+ // is SIMPLEX_COMPLEXITY.
+
+ if (reduce_complexity &&
+ (!generators_are_up_to_date() || has_pending_constraints())) {
+ // Extract easy-to-find bounds from constraints.
+ assert(constraints_are_up_to_date());
+
+ // We must copy `con_sys' to a temporary matrix,
+ // as we need to simplify all of the matrix
+ // (not just the non-pending part of it).
+ Constraint_System cs(con_sys);
+ if (cs.num_pending_rows() > 0)
+ cs.unset_pending_rows();
+ if (has_pending_constraints() || !constraints_are_minimized())
+ cs.simplify();
+
+ const Constraint_System::const_iterator cs_begin = cs.begin();
+ const Constraint_System::const_iterator cs_end = cs.end();
+
+ for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i) {
+ dimension_type varid = space_dim;
+ const Constraint& c = *i;
+ // After `simplify()' some constraints may have become inconsistent.
+ if (c.is_inconsistent()) {
+ box.set_empty();
+ return;
+ }
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ // We look for constraints of the form `Variable(j) == k',
+ // `Variable(j) >= k', and `Variable(j) > k'.
+ if (c.coefficient(Variable(j)) != 0)
+ if (varid != space_dim) {
+ varid = space_dim;
+ break;
+ }
+ else
+ varid = j;
+ }
+ if (varid != space_dim) {
+ Coefficient_traits::const_reference d = c.coefficient(Variable(varid));
+ Coefficient_traits::const_reference n = c.inhomogeneous_term();
+ // The constraint `c' is of the form
+ // `Variable(varid) + n / d rel 0', where
+ // `rel' is either the relation `==', `>=', or `>'.
+ // For the purpose of shrinking intervals, this is
+ // (morally) turned into `Variable(varid) rel -n/d'.
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ // Turn `n/d' into `-n/d'.
+ q = -q;
+ const ERational r(q, ROUND_NOT_NEEDED);
+ const Constraint::Type c_type = c.type();
+ switch (c_type) {
+ case Constraint::EQUALITY:
+ lower_bound[varid] = LBoundary(r, LBoundary::CLOSED);
+ upper_bound[varid] = UBoundary(r, UBoundary::CLOSED);
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ case Constraint::STRICT_INEQUALITY:
+ if (d > 0)
+ // If `d' is strictly positive, we have a constraint of the
+ // form `Variable(varid) >= k' or `Variable(varid) > k'.
+ lower_bound[varid]
+ = LBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+ ? LBoundary::CLOSED
+ : LBoundary::OPEN));
+ else {
+ // Otherwise, we are sure that `d' is strictly negative
+ // and, in this case, we have a constraint of the form
+ // `Variable(varid) <= k' or `Variable(varid) < k'.
+ assert(d < 0);
+ upper_bound[varid]
+ = UBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+ ? UBoundary::CLOSED
+ : UBoundary::OPEN));
+ }
+ break;
+ }
+ }
+ }
+ }
+ else {
+ // We are in the case where either the generators are up-to-date
+ // or reduced complexity is not required.
+ // Get the generators for *this.
+
+ // We have not to copy `gen_sys', because in this case
+ // we only read the generators.
+ const Generator_System& gs = gen_sys;
+
+ // We first need to identify those axes that are unbounded below
+ // and/or above.
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i) {
+ // Note: using an iterator, we read also the pending part of the matrix.
+ const Generator& g = *i;
+ Generator::Type g_type = g.type();
+ switch (g_type) {
+ case Generator::LINE:
+ // Any axes `j' in which the coefficient is non-zero is unbounded
+ // both below and above.
+ for (dimension_type j = space_dim; j-- > 0; )
+ if (g.coefficient(Variable(j)) != 0) {
+ lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+ LBoundary::OPEN);
+ upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+ UBoundary::OPEN);
+ }
+ break;
+ case Generator::RAY:
+ // Axes in which the coefficient is negative are unbounded below.
+ // Axes in which the coefficient is positive are unbounded above.
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ int sign = sgn(g.coefficient(Variable(j)));
+ if (sign < 0)
+ lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+ LBoundary::OPEN);
+ else if (sign > 0)
+ upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+ UBoundary::OPEN);
+ }
+ break;
+ case Generator::POINT:
+ case Generator::CLOSURE_POINT:
+ {
+ Coefficient_traits::const_reference d = g.divisor();
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ Coefficient_traits::const_reference n = g.coefficient(Variable(j));
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ const ERational r(q, ROUND_NOT_NEEDED);
+ LBoundary lb(r,(g_type == Generator::CLOSURE_POINT
+ ? LBoundary::OPEN
+ : LBoundary::CLOSED));
+ if (lb < lower_bound[j])
+ lower_bound[j] = lb;
+ UBoundary ub(r, (g_type == Generator::CLOSURE_POINT
+ ? UBoundary::OPEN
+ : UBoundary::CLOSED));
+ if (ub > upper_bound[j])
+ upper_bound[j] = ub;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ TEMP_INTEGER(n);
+ TEMP_INTEGER(d);
+
+ // Now shrink the bounded axes.
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ // Lower bound.
+ const LBoundary& lb = lower_bound[j];
+ const ERational& lr = lb.bound();
+ if (!is_plus_infinity(lr) && !is_minus_infinity(lr)) {
+ n = raw_value(lr).get_num();
+ d = raw_value(lr).get_den();
+ box.raise_lower_bound(j, lb.is_closed(), n, d);
+ }
+
+ // Upper bound.
+ const UBoundary& ub = upper_bound[j];
+ const ERational& ur = ub.bound();
+ if (!is_plus_infinity(ur) && !is_minus_infinity(ur)) {
+ n = raw_value(ur).get_num();
+ d = raw_value(ur).get_den();
+ box.lower_upper_bound(j, ub.is_closed(), n, d);
+ }
+ }
+}
+
+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();
+
+ assert(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.
+
+ // We first compute suitable permutation cycles for the columns of
+ // the `con_sys' and `gen_sys' matrices. We will represent them
+ // with a linear array, using 0 as a terminator for each cycle
+ // (notice that the columns with index 0 of `con_sys' and
+ // `gen_sys' represent the inhomogeneous terms, and thus are
+ // unaffected by the permutation of dimensions).
+ // Cycles of length 1 will be omitted so that, in the worst case,
+ // we will have `space_dim' elements organized in `space_dim/2'
+ // cycles, which means we will have at most `space_dim/2'
+ // terminators.
+ std::vector<dimension_type> cycles;
+ cycles.reserve(space_dim + space_dim/2);
+
+ // 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)
+ // Cycle of length 1: skip it.
+ goto skip;
+
+ cycles.push_back(j+1);
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+ // End of cycle: mark it.
+ cycles.push_back(0);
+ skip:
+ ;
+ }
+ }
+
+ // If `cycles' is empty then `pfunc' is the identity.
+ if (cycles.empty())
+ return;
+
+ // 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_columns(cycles);
+
+ if (generators_are_up_to_date())
+ gen_sys.permute_columns(cycles);
+
+ assert(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.num_rows() == 0) {
+ // The polyhedron is empty.
+ Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+ std::swap(*this, new_polyhedron);
+ 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;
+ }
+
+ 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;
+ Linear_Expression e(0 * Variable(new_space_dimension-1));
+ bool all_zeroes = true;
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ if (old_g.coefficient(Variable(j)) != 0
+ && pfunc_maps[j] != not_a_dimension()) {
+ e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(line(e));
+ break;
+ case Generator::RAY:
+ if (!all_zeroes)
+ new_gensys.insert(ray(e));
+ break;
+ case Generator::POINT:
+ // A point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(point(e, old_g.divisor()));
+ break;
+ case Generator::CLOSURE_POINT:
+ // A closure point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(closure_point(e, old_g.divisor()));
+ break;
+ }
+ }
+ Polyhedron new_polyhedron(topology(), new_gensys);
+ std::swap(*this, new_polyhedron);
+ assert(OK(true));
+}
+
+} // 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..ea057dc
--- /dev/null
+++ b/src/Polyhedron.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_chdims.cc b/src/Polyhedron_chdims.cc
new file mode 100644
index 0000000..b472465
--- /dev/null
+++ b/src/Polyhedron_chdims.cc
@@ -0,0 +1,637 @@
+/* Polyhedron class implementation
+ (non-inline operators that may change the dimension of the vector space).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include <cassert>
+
+#define BE_LAZY 1
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Polyhedron::add_space_dimensions(Linear_System& sys1,
+ Linear_System& sys2,
+ Saturation_Matrix& sat1,
+ Saturation_Matrix& sat2,
+ dimension_type add_dim) {
+ assert(sys1.topology() == sys2.topology());
+ assert(sys1.num_columns() == sys2.num_columns());
+ assert(add_dim != 0);
+
+ sys1.add_zero_columns(add_dim);
+ dimension_type old_index = sys2.first_pending_row();
+ sys2.add_rows_and_columns(add_dim);
+ // The added rows are in the non-pending part.
+ sys2.set_index_first_pending_row(old_index + 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; )
+ std::swap(sat1[i], sat1[i+add_dim]);
+ // Computes the "sat_c", too.
+ sat2.transpose_assign(sat1);
+
+ if (!sys1.is_necessarily_closed()) {
+ // Moving the epsilon coefficients to the new last column.
+ dimension_type new_eps_index = sys1.num_columns() - 1;
+ dimension_type old_eps_index = new_eps_index - add_dim;
+ // This swap preserves sortedness of `sys1'.
+ sys1.swap_columns(old_eps_index, new_eps_index);
+
+ // Try to preserve sortedness of `sys2'.
+ if (!sys2.is_sorted())
+ sys2.swap_columns(old_eps_index, new_eps_index);
+ else {
+ for (dimension_type i = sys2.num_rows(); i-- > add_dim; ) {
+ Linear_Row& r = sys2[i];
+ std::swap(r[old_eps_index], r[new_eps_index]);
+ }
+ // The upper-right corner of `sys2' contains the J matrix:
+ // swap coefficients to preserve sortedness.
+ for (dimension_type i = add_dim; i-- > 0; ++old_eps_index) {
+ Linear_Row& r = sys2[i];
+ std::swap(r[old_eps_index], r[old_eps_index + 1]);
+ }
+ }
+ // NOTE: since we swapped columns in both `sys1' and `sys2',
+ // no swapping is required for `sat1' and `sat2'.
+ }
+}
+
+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.
+ if (m > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow(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.
+ assert(status.test_zero_dim_univ());
+ // We swap `*this' with a newly created
+ // universe polyhedron of dimension `m'.
+ Polyhedron ph(topology(), m, UNIVERSE);
+ 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.add_zero_columns(m);
+ // If the polyhedron is not necessarily closed,
+ // move the epsilon coefficients to the last column.
+ if (!is_necessarily_closed())
+ con_sys.swap_columns(space_dim + 1, space_dim + 1 + m);
+ }
+ else {
+ // Only generators are up-to-date: no need to modify the constraints.
+ assert(generators_are_up_to_date());
+ gen_sys.add_rows_and_columns(m);
+ // The polyhedron does not support pending generators.
+ gen_sys.unset_pending_rows();
+ // If the polyhedron is not necessarily closed,
+ // move the epsilon coefficients to the last column.
+ if (!is_necessarily_closed()) {
+ // Try to preserve sortedness of `gen_sys'.
+ if (!gen_sys.is_sorted())
+ gen_sys.swap_columns(space_dim + 1, space_dim + 1 + m);
+ else {
+ dimension_type old_eps_index = space_dim + 1;
+ dimension_type new_eps_index = old_eps_index + m;
+ for (dimension_type i = gen_sys.num_rows(); i-- > m; ) {
+ Generator& r = gen_sys[i];
+ std::swap(r[old_eps_index], r[new_eps_index]);
+ }
+ // The upper-right corner of `gen_sys' contains the J matrix:
+ // swap coefficients to preserve sortedness.
+ for (dimension_type i = m; i-- > 0; ++old_eps_index) {
+ Generator& r = gen_sys[i];
+ std::swap(r[old_eps_index], r[old_eps_index + 1]);
+ }
+ }
+ }
+ }
+ // Update the space dimension.
+ space_dim += m;
+
+ // Note: we do not check for satisfiability, because the system of
+ // constraints may be unsatisfiable.
+ assert(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.
+ if (m > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow(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) {
+ assert(status.test_zero_dim_univ() && gen_sys.num_rows() == 0);
+ // 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;
+ assert(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_rows_and_columns(m);
+ // The polyhedron does not support pending constraints.
+ con_sys.unset_pending_rows();
+ // If the polyhedron is not necessarily closed,
+ // move the epsilon coefficients to the last column.
+ if (!is_necessarily_closed()) {
+ // Try to preserve sortedness of `con_sys'.
+ if (!con_sys.is_sorted())
+ con_sys.swap_columns(space_dim + 1, space_dim + 1 + m);
+ else {
+ dimension_type old_eps_index = space_dim + 1;
+ dimension_type new_eps_index = old_eps_index + m;
+ for (dimension_type i = con_sys.num_rows(); i-- > m; ) {
+ Constraint& r = con_sys[i];
+ std::swap(r[old_eps_index], r[new_eps_index]);
+ }
+ // The upper-right corner of `con_sys' contains the J matrix:
+ // swap coefficients to preserve sortedness.
+ for (dimension_type i = m; i-- > 0; ++old_eps_index) {
+ Constraint& r = con_sys[i];
+ std::swap(r[old_eps_index], r[old_eps_index + 1]);
+ }
+ }
+ }
+ }
+ else {
+ // Only generators are up-to-date: no need to modify the constraints.
+ assert(generators_are_up_to_date());
+ gen_sys.add_zero_columns(m);
+ // If the polyhedron is not necessarily closed,
+ // move the epsilon coefficients to the last column.
+ if (!is_necessarily_closed())
+ gen_sys.swap_columns(space_dim + 1, space_dim + 1 + 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.
+ assert(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.
+ if (y.space_dim > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow(topology(),
+ "concatenate_assign(y)",
+ "concatenation exceeds the maximum "
+ "allowed space dimension");
+
+ const dimension_type added_columns = y.space_dim;
+
+ // 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.
+ dimension_type old_num_rows = con_sys.num_rows();
+ dimension_type old_num_columns = con_sys.num_columns();
+ 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.
+ assert(added_rows > 0 && added_columns > 0);
+
+ con_sys.add_zero_rows_and_columns(added_rows, added_columns,
+ Linear_Row::Flags(topology(),
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ // Move the epsilon coefficient to the last column, if needed.
+ if (!is_necessarily_closed())
+ con_sys.swap_columns(old_num_columns - 1,
+ old_num_columns - 1 + added_columns);
+ dimension_type cs_num_columns = cs.num_columns();
+ // Steal the constraints from `cs' and put them in `con_sys'
+ // using the right displacement for coefficients.
+ for (dimension_type i = added_rows; i-- > 0; ) {
+ Constraint& c_old = cs[i];
+ Constraint& c_new = con_sys[old_num_rows + i];
+ // Method `add_zero_rows_and_columns', by default, added
+ // inequalities.
+ if (c_old.is_equality())
+ c_new.set_is_equality();
+ // The inhomogeneous term is not displaced.
+ std::swap(c_new[0], c_old[0]);
+ // All homogeneous terms (included the epsilon coefficient,
+ // if present) are displaced by `space_dim' columns.
+ for (dimension_type j = 1; j < cs_num_columns; ++j)
+ std::swap(c_old[j], c_new[space_dim + j]);
+ }
+
+ if (can_have_something_pending()) {
+ // 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_rows_and_columns(added_columns);
+ gen_sys.set_sorted(false);
+ if (!is_necessarily_closed())
+ gen_sys.swap_columns(old_num_columns - 1,
+ old_num_columns - 1 + added_columns);
+ // The added lines are not pending.
+ gen_sys.unset_pending_rows();
+ // 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, couldn't 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.
+ for (dimension_type i = sat_c.num_rows() - added_columns; i-- > 0; )
+ std::swap(sat_c[i], sat_c[i+added_columns]);
+ // Since `added_rows > 0', we now have pending constraints.
+ set_constraints_pending();
+ }
+ else {
+ // The polyhedron cannot have pending constraints.
+ con_sys.unset_pending_rows();
+#if BE_LAZY
+ con_sys.set_sorted(false);
+#else
+ 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.
+ assert(OK());
+}
+
+void
+PPL::Polyhedron::remove_space_dimensions(const Variables_Set& to_be_removed) {
+ // 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 (to_be_removed.empty()) {
+ assert(OK());
+ return;
+ }
+
+ // Dimension-compatibility check: the variable having
+ // maximum space dimension is the one occurring last in the set.
+ const dimension_type
+ min_space_dim = to_be_removed.rbegin()->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 - to_be_removed.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;
+ assert(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;
+ }
+
+ // For each variable to be removed, we fill the corresponding column
+ // by shifting left those columns that will not be removed.
+ Variables_Set::const_iterator tbr = to_be_removed.begin();
+ Variables_Set::const_iterator tbr_end = to_be_removed.end();
+ dimension_type dst_col = tbr->space_dimension();
+ dimension_type src_col = dst_col + 1;
+ for (++tbr; tbr != tbr_end; ++tbr) {
+ dimension_type tbr_col = tbr->space_dimension();
+ // All columns in between are moved to the left.
+ while (src_col < tbr_col)
+ gen_sys.Matrix::swap_columns(dst_col++, src_col++);
+ ++src_col;
+ }
+ // Moving the remaining columns.
+ const dimension_type gen_sys_num_columns = gen_sys.num_columns();
+ while (src_col < gen_sys_num_columns)
+ gen_sys.Matrix::swap_columns(dst_col++, src_col++);
+
+ // The number of remaining columns is `dst_col'.
+ // Note that resizing also calls `set_sorted(false)'.
+ gen_sys.remove_trailing_columns(gen_sys_num_columns - dst_col);
+ // We may have invalid lines and rays now.
+ gen_sys.remove_invalid_lines_and_rays();
+
+ // 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;
+
+ assert(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) {
+ assert(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();
+ assert(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;
+ }
+
+ dimension_type new_num_cols = new_dimension + 1;
+ if (!is_necessarily_closed()) {
+ // The polyhedron is not necessarily closed: move the column
+ // of the epsilon coefficients to its new place.
+ gen_sys.swap_columns(gen_sys.num_columns() - 1, new_num_cols);
+ // The number of remaining columns is `new_dimension + 2'.
+ ++new_num_cols;
+ }
+ // Note that resizing also calls `set_sorted(false)'.
+ gen_sys.remove_trailing_columns(space_dim - new_dimension);
+ // We may have invalid lines and rays now.
+ gen_sys.remove_invalid_lines_and_rays();
+
+ // 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;
+
+ assert(OK(true));
+}
+
+void
+PPL::Polyhedron::expand_space_dimension(Variable var, dimension_type m) {
+ // TODO: this implementation is _really_ an executable specification.
+
+ // `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.
+ if (m > max_space_dimension() - space_dimension())
+ throw_space_dimension_overflow(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.
+ dimension_type old_dim = space_dim;
+
+ // Add the required new dimensions.
+ add_space_dimensions_and_embed(m);
+
+ const dimension_type src_d = var.id();
+ const Constraint_System& cs = constraints();
+ Constraint_System new_constraints;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ cs_end = cs.end(); i != cs_end; ++i) {
+ const Constraint& c = *i;
+
+ // If `c' does not constrain `var', skip it.
+ if (c.coefficient(var) == 0)
+ continue;
+
+ // Each relevant constraint results in `m' new constraints.
+ for (dimension_type dst_d = old_dim; dst_d < old_dim+m; ++dst_d) {
+ Linear_Expression e;
+ for (dimension_type j = old_dim; j-- > 0; )
+ e +=
+ c.coefficient(Variable(j))
+ * (j == src_d ? Variable(dst_d) : Variable(j));
+ e += c.inhomogeneous_term();
+ new_constraints.insert(c.is_equality()
+ ? (e == 0)
+ : (c.is_nonstrict_inequality()
+ ? (e >= 0)
+ : (e > 0)));
+ }
+ }
+ add_constraints(new_constraints);
+ assert(OK());
+}
+
+void
+PPL::Polyhedron::fold_space_dimensions(const Variables_Set& to_be_folded,
+ Variable var) {
+ // TODO: this implementation is _really_ an executable specification.
+
+ // `var' should be one of the dimensions of the polyhedron.
+ if (var.space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(tbf, v)", "v", var);
+
+ // The folding of no dimensions is a no-op.
+ if (to_be_folded.empty())
+ return;
+
+ // All variables in `to_be_folded' should be dimensions of the polyhedron.
+ if (to_be_folded.rbegin()->space_dimension() > space_dim)
+ throw_dimension_incompatible("fold_space_dimensions(tbf, v)",
+ "*tbf.rbegin()",
+ *to_be_folded.rbegin());
+
+ // Moreover, `var' should not occur in `to_be_folded'.
+ if (to_be_folded.find(var) != to_be_folded.end())
+ throw_invalid_argument("fold_space_dimensions(tbf, v)",
+ "v should not occur in tbf");
+
+ for (Variables_Set::const_iterator i = to_be_folded.begin(),
+ tbf_end = to_be_folded.end(); i != tbf_end; ++i) {
+ Polyhedron copy = *this;
+ copy.affine_image(var, Linear_Expression(*i));
+ poly_hull_assign(copy);
+ }
+ remove_space_dimensions(to_be_folded);
+ assert(OK());
+}
diff --git a/src/Polyhedron_nonpublic.cc b/src/Polyhedron_nonpublic.cc
new file mode 100644
index 0000000..66e75b6
--- /dev/null
+++ b/src/Polyhedron_nonpublic.cc
@@ -0,0 +1,1568 @@
+/* Polyhedron class implementation
+ (non-inline private or protected functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#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 // 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),
+ gen_sys(topol),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ 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;
+ assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Polyhedron& y)
+ : con_sys(y.topology()),
+ gen_sys(y.topology()),
+ status(y.status),
+ space_dim(y.space_dim) {
+ // Being a protected method, we simply assert that topologies do match.
+ 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& ccs)
+ : con_sys(topol),
+ gen_sys(topol),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ assert(ccs.space_dimension() <= max_space_dimension());
+
+ // TODO: this implementation is just an executable specification.
+ Constraint_System cs = ccs;
+
+ // 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)"
+ : "NNC_Polyhedron(cs)", "cs", cs);
+
+ // Set the space dimension.
+ space_dim = cs_space_dim;
+
+ if (space_dim > 0) {
+ // Stealing the rows from `cs'.
+ std::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'.
+ if (cs.num_columns() > 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;
+ }
+ }
+ assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, Constraint_System& cs)
+ : con_sys(topol),
+ gen_sys(topol),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ 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)"
+ : "NNC_Polyhedron(cs)", "cs", cs);
+
+ // Set the space dimension.
+ space_dim = cs_space_dim;
+
+ if (space_dim > 0) {
+ // Stealing the rows from `cs'.
+ std::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'.
+ if (cs.num_columns() > 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;
+ }
+ }
+ assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, const Generator_System& cgs)
+ : con_sys(topol),
+ gen_sys(topol),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ assert(cgs.space_dimension() <= max_space_dimension());
+
+ // TODO: this implementation is just an executable specification.
+ Generator_System gs = cgs;
+
+ // An empty set of generators defines the empty polyhedron.
+ if (gs.num_rows() == 0) {
+ space_dim = gs.space_dimension();
+ status.set_empty();
+ assert(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");
+
+ 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)"
+ : "NNC_Polyhedron(gs)", "gs", gs);
+
+ if (gs_space_dim > 0) {
+ // Stealing the rows from `gs'.
+ std::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.unset_pending_rows();
+ gen_sys.set_sorted(false);
+ }
+ // Generators are now up-to-date.
+ set_generators_up_to_date();
+
+ // Set the space dimension.
+ space_dim = gs_space_dim;
+ assert(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;
+ assert(OK());
+}
+
+PPL::Polyhedron::Polyhedron(const Topology topol, Generator_System& gs)
+ : con_sys(topol),
+ gen_sys(topol),
+ sat_c(),
+ sat_g() {
+ // Protecting against space dimension overflow is up to the caller.
+ assert(gs.space_dimension() <= max_space_dimension());
+
+ // An empty set of generators defines the empty polyhedron.
+ if (gs.num_rows() == 0) {
+ space_dim = gs.space_dimension();
+ status.set_empty();
+ assert(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");
+
+ 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)"
+ : "NNC_Polyhedron(gs)", "gs", gs);
+
+ if (gs_space_dim > 0) {
+ // Stealing the rows from `gs'.
+ std::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.unset_pending_rows();
+ gen_sys.set_sorted(false);
+ }
+ // Generators are now up-to-date.
+ set_generators_up_to_date();
+
+ // Set the space dimension.
+ space_dim = gs_space_dim;
+ assert(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;
+ assert(OK());
+}
+
+PPL::Polyhedron&
+PPL::Polyhedron::operator=(const Polyhedron& y) {
+ // Being a protected method, we simply assert that topologies do match.
+ 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.
+ assert(topology() == y.topology());
+ assert(space_dim == y.space_dim);
+ 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; ...
+ 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.
+ assert(topology() == y.topology());
+ assert(space_dim == y.space_dim);
+ 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
+
+ assert(x.OK());
+ assert(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& point) 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);
+
+ // 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.
+ 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.
+ // Initialized only to avoid a compiler warning.
+ dimension_type ext_position = 0;
+
+ // Whether the current candidate extremum is included or not.
+ // Initialized only to avoid a compiler warning.
+ bool ext_included = false;
+
+ TEMP_INTEGER(sp);
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; ) {
+ const Generator& g = gen_sys[i];
+ Scalar_Products::homogeneous_assign(sp, expr, g);
+ // Lines and rays in `*this' can cause `expr' to be unbounded.
+ if (g.is_line_or_ray()) {
+ const int sp_sign = sgn(sp);
+ if (sp_sign != 0
+ && (g.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.
+ assert(g.is_point() || g.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.
+ mpq_class candidate;
+ assign_r(candidate.get_num(), sp, ROUND_NOT_NEEDED);
+ assign_r(candidate.get_den(), g[0], ROUND_NOT_NEEDED);
+ candidate.canonicalize();
+ const bool g_is_point = g.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'.
+ 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.
+ assert(!first_candidate);
+ ext_n = Coefficient(extremum.get_num());
+ ext_d = Coefficient(extremum.get_den());
+ included = ext_included;
+ point = 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 {
+ assert(space_dim > 0 && !marked_empty());
+ 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();
+ assert(OK(true));
+ return true;
+ }
+
+ const bool empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c);
+ 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();
+ }
+ assert(OK(!empty));
+ return !empty;
+}
+
+void
+PPL::Polyhedron::process_pending_generators() const {
+ assert(space_dim > 0 && !marked_empty());
+ 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();
+ assert(OK(true));
+ return;
+ }
+
+ add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g);
+ 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 {
+ 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.unset_pending_rows();
+ x.con_sys.set_sorted(false);
+ x.clear_pending_constraints();
+ x.clear_constraints_minimized();
+ x.clear_generators_up_to_date();
+ }
+ else {
+ assert(x.has_pending_generators());
+ // We must process the pending generators and obtain the
+ // corresponding system of constraints.
+ x.process_pending_generators();
+ }
+ assert(OK(true));
+}
+
+bool
+PPL::Polyhedron::remove_pending_to_obtain_generators() const {
+ 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.unset_pending_rows();
+ x.gen_sys.set_sorted(false);
+ x.clear_pending_generators();
+ x.clear_generators_minimized();
+ x.clear_constraints_up_to_date();
+ assert(OK(true));
+ return true;
+ }
+ else {
+ 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 {
+ assert(space_dim > 0);
+ assert(!marked_empty());
+ assert(generators_are_up_to_date());
+ // We assume the polyhedron has no pending constraints or generators.
+ 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 {
+ assert(space_dim > 0);
+ assert(!marked_empty());
+ assert(constraints_are_up_to_date());
+ // We assume the polyhedron has no pending constraints or generators.
+ 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 {
+ assert(constraints_are_minimized());
+ assert(generators_are_minimized());
+ 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.
+ 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 {
+ assert(constraints_are_minimized());
+ assert(generators_are_minimized());
+ 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.
+ 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 {
+ 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();
+
+ assert(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators() const {
+ 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();
+
+ assert(gen_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_constraints_with_sat_c() const {
+ assert(constraints_are_up_to_date());
+ 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);
+
+ assert(con_sys.check_sorted());
+}
+
+void
+PPL::Polyhedron::obtain_sorted_generators_with_sat_g() const {
+ 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);
+
+ 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();
+ assert(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();
+ assert(OK());
+ return ret;
+ }
+ else {
+ assert(generators_are_up_to_date());
+ update_constraints();
+ assert(OK());
+ return true;
+ }
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_constraints() const {
+ 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()) {
+ assert(sat_c_is_up_to_date());
+ x.sat_g.transpose_assign(sat_c);
+ }
+
+ // These Saturation_Row's will be later used as masks in order to
+ // check saturation conditions restricted to particular subsets of
+ // the generator system.
+ Saturation_Row sat_all_but_rays;
+ Saturation_Row sat_all_but_points;
+ Saturation_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;
+ default:
+ // Found a line with index i >= n_lines.
+ throw std::runtime_error("PPL internal error: "
+ "strongly_minimize_constraints.");
+ }
+ Saturation_Row sat_lines_and_rays;
+ set_union(sat_all_but_points, sat_all_but_closure_points,
+ sat_lines_and_rays);
+ Saturation_Row sat_lines_and_closure_points;
+ set_union(sat_all_but_rays, sat_all_but_points,
+ sat_lines_and_closure_points);
+ Saturation_Row sat_lines;
+ set_union(sat_lines_and_rays, sat_lines_and_closure_points,
+ sat_lines);
+
+ // 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;
+ Saturation_Matrix& sat = x.sat_g;
+ dimension_type cs_rows = cs.num_rows();
+ const dimension_type eps_index = cs.num_columns() - 1;
+ for (dimension_type i = 0; i < cs_rows; )
+ if (cs[i].is_strict_inequality()) {
+ // First, check if it is saturated by no closure points
+ Saturation_Row sat_ci;
+ set_union(sat[i], sat_lines_and_closure_points, sat_ci);
+ 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];
+ bool all_zeroes = true;
+ for (dimension_type k = eps_index; k-- > 1; )
+ if (c[k] != 0) {
+ all_zeroes = false;
+ break;
+ }
+ if (all_zeroes && (c[0] + c[eps_index] == 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.
+ // Move it to the bottom of the constraint system,
+ // while keeping `sat_g' consistent.
+ --cs_rows;
+ std::swap(cs[i], cs[cs_rows]);
+ std::swap(sat[i], sat[cs_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.clear();
+ set_union(sat[i], sat_all_but_points, sat_ci);
+ bool eps_redundant = false;
+ for (dimension_type j = 0; j < cs_rows; ++j)
+ if (i != j && cs[j].is_strict_inequality()
+ && subset_or_equal(sat[j], sat_ci)) {
+ // Constraint `cs[i]' is eps-redundant:
+ // move it to the bottom of the constraint system,
+ // while keeping `sat_g' consistent.
+ --cs_rows;
+ std::swap(cs[i], cs[cs_rows]);
+ std::swap(sat[i], sat[cs_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;
+
+ if (changed) {
+ // If the constraint system has been changed, we have to erase
+ // the epsilon-redundant constraints.
+ assert(cs_rows < cs.num_rows());
+ cs.erase_to_end(cs_rows);
+ // The remaining constraints are not pending.
+ cs.unset_pending_rows();
+ // The constraint system is no longer sorted.
+ cs.set_sorted(false);
+ // 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 teh simplex algorithm).
+ if (!found_eps_leq_one) {
+ LP_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.set_necessarily_closed();
+ try {
+ lp.add_constraints(cs);
+ cs.set_not_necessarily_closed();
+ }
+ catch (...) {
+ cs.set_not_necessarily_closed();
+ throw;
+ }
+ // The objective function is `epsilon'.
+ lp.set_objective_function(Variable(x.space_dim));
+ lp.set_optimization_mode(MAXIMIZATION);
+ LP_Problem_Status status = lp.solve();
+ assert(status != UNFEASIBLE_LP_PROBLEM);
+ // If the epsilon dimension is actually unbounded,
+ // then add the eps_leq_one constraint.
+ if (status == UNBOUNDED_LP_PROBLEM)
+ cs.insert(Constraint::epsilon_leq_one());
+ }
+ }
+
+ assert(OK());
+ return true;
+}
+
+bool
+PPL::Polyhedron::strongly_minimize_generators() const {
+ 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()) {
+ assert(sat_g_is_up_to_date());
+ x.sat_c.transpose_assign(sat_g);
+ }
+
+ // This Saturation_Row will have all and only the indexes
+ // of strict inequalities set to 1.
+ Saturation_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);
+ Saturation_Matrix& sat = const_cast<Saturation_Matrix&>(sat_c);
+ dimension_type gs_rows = gs.num_rows();
+ const dimension_type n_lines = gs.num_lines();
+ const dimension_type eps_index = gs.num_columns() - 1;
+ for (dimension_type i = n_lines; i < gs_rows; )
+ if (gs[i].is_point()) {
+ // Compute the Saturation_Row corresponding to the candidate point
+ // when strict inequality constraints are ignored.
+ Saturation_Row sat_gi;
+ set_union(sat[i], sat_all_but_strict_ineq, sat_gi);
+ // 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)
+ if (i != j && gs[j].is_point() && subset_or_equal(sat[j], sat_gi)) {
+ // Point `gs[i]' is eps-redundant:
+ // move it to the bottom of the generator system,
+ // while keeping `sat_c' consistent.
+ --gs_rows;
+ std::swap(gs[i], gs[gs_rows]);
+ std::swap(sat[i], sat[gs_rows]);
+ eps_redundant = true;
+ changed = true;
+ break;
+ }
+ if (!eps_redundant) {
+ // Let all point encodings have epsilon coordinate 1.
+ Generator& gi = gs[i];
+ if (gi[eps_index] != gi[0]) {
+ gi[eps_index] = gi[0];
+ // Enforce normalization.
+ gi.normalize();
+ changed = true;
+ }
+ // Consider next generator.
+ ++i;
+ }
+ }
+ else
+ // Consider next generator.
+ ++i;
+
+ // If needed, erase the eps-redundant generators (also updating
+ // `index_first_pending').
+ if (gs_rows < gs.num_rows()) {
+ gs.erase_to_end(gs_rows);
+ gs.unset_pending_rows();
+ }
+
+ if (changed) {
+ // The generator system is no longer sorted.
+ x.gen_sys.set_sorted(false);
+ // The constraint system is no longer up-to-date.
+ x.clear_constraints_up_to_date();
+ }
+
+ assert(OK());
+ return true;
+}
+
+void
+PPL::Polyhedron::throw_runtime_error(const char* method) const {
+ std::ostringstream s;
+ s << "PPL::";
+ if (is_necessarily_closed())
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << "." << std::endl;
+ throw std::runtime_error(s.str());
+}
+
+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 {
+ 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 {
+ 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 {
+ 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* e_name,
+ const Linear_Expression& e) const {
+ throw_dimension_incompatible(method, e_name, e.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());
+}
+
+void
+PPL::Polyhedron::throw_space_dimension_overflow(const Topology topol,
+ const char* method,
+ const char* reason) {
+ std::ostringstream s;
+ s << "PPL::";
+ if (topol == NECESSARILY_CLOSED)
+ s << "C_";
+ else
+ s << "NNC_";
+ s << "Polyhedron::" << method << ":" << std::endl
+ << reason << ".";
+ throw std::length_error(s.str());
+}
+
+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..d662ca0
--- /dev/null
+++ b/src/Polyhedron_public.cc
@@ -0,0 +1,2965 @@
+/* Polyhedron class implementation (non-inline public functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+#include "Scalar_Products.defs.hh"
+
+#include <cassert>
+#include <iostream>
+
+#ifndef ENSURE_SORTEDNESS
+#define ENSURE_SORTEDNESS 0
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+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.num_rows() == 0) {
+ // 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);
+ const_cast<Constraint_System&>(con_sys).swap(unsat_cs);
+ }
+ else {
+ // Checking that `con_sys' contains the right thing.
+ assert(con_sys.space_dimension() == space_dim);
+ assert(con_sys.num_rows() == 1);
+ assert(con_sys[0].is_inconsistent());
+ }
+ return con_sys;
+ }
+
+ if (space_dim == 0) {
+ // zero-dimensional universe.
+ assert(con_sys.num_columns() == 0 && con_sys.num_rows() == 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()) {
+ assert(gen_sys.num_rows() == 0);
+ // 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);
+ const_cast<Generator_System&>(gen_sys).swap(gs);
+ }
+ return gen_sys;
+ }
+
+ if (space_dim == 0) {
+ assert(gen_sys.num_columns() == 0 && gen_sys.num_rows() == 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.
+ assert(gen_sys.num_rows() == 0);
+ // 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);
+ const_cast<Generator_System&>(gen_sys).swap(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();
+}
+
+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;
+ }
+
+ 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.
+ assert(generators_are_minimized());
+ if (num_lines == space_dim) {
+ assert(num_rays == 0);
+ return true;
+ }
+ 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.
+ 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];
+ const dimension_type eps_index = con_sys.num_columns() - 1;
+ assert(eps_leq_one[0] > 0 && eps_leq_one[eps_index] < 0
+ && eps_geq_zero[0] == 0 && eps_geq_zero[eps_index] > 0);
+ for (dimension_type i = 1; i < eps_index; ++i)
+ assert(eps_leq_one[i] == 0 && eps_geq_zero[i] == 0);
+#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.
+ 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& gi = gen_sys[i];
+ if (gi.is_closure_point()) {
+ bool gi_has_no_matching_point = true;
+ for (dimension_type j = n_rows; j-- > n_lines; ) {
+ const Generator& gj = gen_sys[j];
+ if (i != j
+ && gj.is_point()
+ && gi.is_matching_closure_point(gj)) {
+ gi_has_no_matching_point = false;
+ break;
+ }
+ }
+ if (gi_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::OK(bool check_not_empty) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ // The expected number of columns in the constraint and generator
+ // systems, if they are not empty.
+ const dimension_type poly_num_columns
+ = space_dim + (is_necessarily_closed() ? 1 : 2);
+
+ // 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 saturation matrices are well-formed.
+ if (!sat_c.OK())
+ goto bomb;
+ if (!sat_g.OK())
+ 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.num_rows() == 0)
+ 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.num_rows() != 0 || gen_sys.num_rows() != 0) {
+#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.num_columns() != poly_num_columns) {
+#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.num_columns() != gen_sys.num_columns()) {
+#ifndef NDEBUG
+ cerr << "Incompatible size! (con_sys and gen_sys)"
+ << endl;
+#endif
+ goto bomb;
+ }
+ }
+
+ if (generators_are_up_to_date()) {
+ if (gen_sys.num_columns() != poly_num_columns) {
+#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;
+ }
+
+ // Check if the system of generators is well-formed.
+ if (!gen_sys.OK())
+ 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.num_rows() > 0 && !gen_sys.has_points()) {
+#ifndef NDEBUG
+ cerr << "Non-empty generator system declared up-to-date "
+ << "has no points!"
+ << endl;
+#endif
+ goto bomb;
+ }
+
+#if 0
+ //=================================================
+ // 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.num_columns() - 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());
+ Generator_System gs_without_pending = gen_sys;
+ gs_without_pending.erase_to_end(gen_sys.first_pending_row());
+ gs_without_pending.unset_pending_rows();
+ Generator_System copy_of_gen_sys = gs_without_pending;
+ Saturation_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()) {
+ // Check if the system of constraints is well-formed.
+ if (!con_sys.OK())
+ goto bomb;
+
+ 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;
+ const dimension_type eps_index = con_sys.num_columns() - 1;
+ for (dimension_type i = con_sys.num_rows(); i-- > 0; )
+ if (con_sys[i][eps_index] > 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.erase_to_end(con_sys.first_pending_row());
+ cs_without_pending.unset_pending_rows();
+ Constraint_System copy_of_con_sys = cs_without_pending;
+ Generator_System new_gen_sys(topology());
+ Saturation_Matrix new_sat_g;
+
+ if (minimize(true, copy_of_con_sys, new_gen_sys, new_sat_g)) {
+ if (check_not_empty) {
+ // Want to know the satisfiability of the constraints.
+#ifndef NDEBUG
+ cerr << "Unsatisfiable system of constraints!"
+ << endl;
+#endif
+ goto bomb;
+ }
+ // The polyhedron is empty, there is nothing else to check.
+ return true;
+ }
+
+ 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 Saturation_Row tmp_sat = sat_c[i];
+ for (dimension_type j = sat_c.num_columns(); j-- > 0; )
+ if (Scalar_Products::sign(con_sys[j], tmp_gen) != 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 Saturation_Row tmp_sat = sat_g[i];
+ for (dimension_type j = sat_g.num_columns(); j-- > 0; )
+ if (Scalar_Products::sign(tmp_con, gen_sys[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())
+ 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);
+
+ // Adding a new constraint to an empty polyhedron
+ // results in an empty polyhedron.
+ if (marked_empty())
+ return;
+
+ // Dealing with a zero-dimensional space polyhedron first.
+ if (space_dim == 0) {
+ if (!c.is_tautological())
+ 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();
+
+ // Here we know that the system of constraints has at least a row.
+ 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 {
+ // Note: here we have a _legal_ topology mismatch, because
+ // `c' is NOT a strict inequality.
+ // 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'.
+ Linear_Expression nc_expr = Linear_Expression(c);
+ 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.
+ assert(OK());
+}
+
+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);
+
+ // Adding a new congruence to an empty polyhedron results in an
+ // empty polyhedron.
+ if (marked_empty())
+ return;
+
+ // Dealing with a zero-dimensional space polyhedron first.
+ if (space_dim == 0) {
+ if (!cg.is_trivial_true())
+ set_empty();
+ return;
+ }
+
+ if (cg.is_equality()) {
+ Linear_Expression le(cg);
+ Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ add_constraint(c);
+ }
+}
+
+bool
+PPL::Polyhedron::add_constraint_and_minimize(const Constraint& c) {
+ // TODO: this is just an executable specification.
+ Constraint_System cs(c);
+ return add_recycled_constraints_and_minimize(cs);
+}
+
+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.
+ 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
+ status.set_zero_dim_univ();
+ assert(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.
+ Generator& cp = gen_sys[gen_sys.num_rows() - 1];
+ cp[space_dim + 1] = 0;
+ cp.normalize();
+ // 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 = Linear_Expression(g);
+ 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 {
+ 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.
+ Generator& cp = gen_sys[gen_sys.num_rows() - 1];
+ cp[space_dim + 1] = 0;
+ cp.normalize();
+ // Re-insert the point (which is already normalized).
+ if (has_pending)
+ gen_sys.insert_pending(g);
+ else
+ gen_sys.insert(g);
+ }
+ }
+ else {
+ 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 = Linear_Expression(g);
+ 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;
+ default:
+ throw_runtime_error("add_generator(const Generator& g)");
+ }
+ }
+
+ 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();
+ }
+ }
+ assert(OK());
+}
+
+bool
+PPL::Polyhedron::add_generator_and_minimize(const Generator& g) {
+ // TODO: this is just an executable specification.
+ Generator_System gs(g);
+ return add_recycled_generators_and_minimize(gs);
+}
+
+void
+PPL::Polyhedron::add_recycled_constraints(Constraint_System& cs) {
+ // Topology compatibility check.
+ if (is_necessarily_closed() && cs.has_strict_inequalities())
+ throw_topology_incompatible("add_constraints(cs)", "cs", cs);
+ // 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.num_rows() == 0)
+ 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 _swap_ (instead of copying) the coefficients of `cs'
+ // (which is not a const).
+ const dimension_type old_num_rows = con_sys.num_rows();
+ const dimension_type cs_num_rows = cs.num_rows();
+ const dimension_type cs_num_columns = cs.num_columns();
+ con_sys.add_zero_rows(cs_num_rows,
+ Linear_Row::Flags(topology(),
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ for (dimension_type i = cs_num_rows; i-- > 0; ) {
+ // NOTE: we cannot directly swap the rows, since they might have
+ // different capacities (besides possibly having different sizes):
+ // thus, we steal one coefficient at a time.
+ Constraint& new_c = con_sys[old_num_rows + i];
+ Constraint& old_c = cs[i];
+ if (old_c.is_equality())
+ new_c.set_is_equality();
+ for (dimension_type j = cs_num_columns; j-- > 0; )
+ std::swap(new_c[j], old_c[j]);
+ }
+
+ if (adding_pending)
+ set_constraints_pending();
+ else {
+ // The newly added ones are not pending constraints.
+ con_sys.unset_pending_rows();
+ // They have been simply appended.
+ con_sys.set_sorted(false);
+ // 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.
+ assert(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);
+}
+
+bool
+PPL::Polyhedron::add_recycled_constraints_and_minimize(Constraint_System& cs) {
+ // Topology-compatibility check.
+ if (is_necessarily_closed() && cs.has_strict_inequalities())
+ throw_topology_incompatible("add_recycled_constraints_and_minimize(cs)",
+ "cs", cs);
+ // 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_and_minimize(cs)",
+ "cs", cs);
+
+ // Adding no constraints: just minimize.
+ if (cs.num_rows() == 0)
+ return minimize();
+
+ // Dealing with zero-dimensional space polyhedra first.
+ 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())
+ return true;
+ // There is a constraint, it must be inconsistent,
+ // the polyhedron is empty.
+ status.set_empty();
+ return false;
+ }
+
+ // The polyhedron must be minimized and have sorted constraints.
+ // `minimize()' will process any pending constraints or generators.
+ if (!minimize())
+ // We have just discovered that `x' is empty.
+ return false;
+ // Fully sort the system of constraints for `x'.
+ obtain_sorted_constraints_with_sat_c();
+
+ // Fully sort the system of constraints to be added
+ // (before adjusting dimensions in order to save time).
+ if (cs.num_pending_rows() > 0) {
+ cs.unset_pending_rows();
+ cs.sort_rows();
+ }
+ else if (!cs.is_sorted())
+ cs.sort_rows();
+ // 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 empty = add_and_minimize(true, con_sys, gen_sys, sat_c, cs);
+
+ if (empty)
+ set_empty();
+ else {
+ // `sat_c' is up-to-date, while `sat_g' is no longer up-to-date.
+ set_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ }
+ assert(OK());
+
+ return !empty;
+}
+
+bool
+PPL::Polyhedron::add_constraints_and_minimize(const Constraint_System& cs) {
+ // TODO: this is just an executable specification.
+ Constraint_System cs_copy = cs;
+ return add_recycled_constraints_and_minimize(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.num_rows() == 0)
+ 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");
+ status.set_zero_dim_univ();
+ assert(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.
+ std::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.unset_pending_rows();
+ gen_sys.set_sorted(false);
+ }
+ set_generators_up_to_date();
+ clear_empty();
+ assert(OK());
+ return;
+ }
+
+ const bool adding_pending = can_have_something_pending();
+
+ // Here we do not require `gen_sys' to be sorted.
+ // also, we _swap_ (instead of copying) the coefficients of `gs'
+ // (which is not a const).
+ const dimension_type old_num_rows = gen_sys.num_rows();
+ const dimension_type gs_num_rows = gs.num_rows();
+ const dimension_type gs_num_columns = gs.num_columns();
+ gen_sys.add_zero_rows(gs_num_rows,
+ Linear_Row::Flags(topology(),
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ for (dimension_type i = gs_num_rows; i-- > 0; ) {
+ // NOTE: we cannot directly swap the rows, since they might have
+ // different capacities (besides possibly having different sizes):
+ // thus, we steal one coefficient at a time.
+ Generator& new_g = gen_sys[old_num_rows + i];
+ Generator& old_g = gs[i];
+ if (old_g.is_line())
+ new_g.set_is_line();
+ for (dimension_type j = gs_num_columns; j-- > 0; )
+ std::swap(new_g[j], old_g[j]);
+ }
+
+ if (adding_pending)
+ set_generators_pending();
+ else {
+ // The newly added ones are not pending generators.
+ gen_sys.unset_pending_rows();
+ // They have been simply appended.
+ gen_sys.set_sorted(false);
+ // Constraints are not up-to-date and generators are not minimized.
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+ }
+ assert(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);
+}
+
+bool
+PPL::Polyhedron::add_recycled_generators_and_minimize(Generator_System& gs) {
+ // Topology compatibility check.
+ if (is_necessarily_closed() && gs.has_closure_points())
+ throw_topology_incompatible("add_recycled_generators_and_minimize(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_and_minimize(gs)",
+ "gs", gs);
+
+ // Adding no generators is equivalent to just requiring minimization.
+ if (gs.num_rows() == 0)
+ return minimize();
+
+ // 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_and_minimize(gs)",
+ "gs");
+ status.set_zero_dim_univ();
+ assert(OK(true));
+ return true;
+ }
+
+ // Adjust `gs' to the right topology.
+ // NOTE: we already checked for topology compatibility;
+ // also, we do NOT adjust dimensions now, so that we will
+ // spend less time to sort rows.
+ gs.adjust_topology_and_space_dimension(topology(), gs_space_dim);
+
+ // For NNC polyhedra, each point must be matched by
+ // the corresponding closure point.
+ if (!is_necessarily_closed())
+ gs.add_corresponding_closure_points();
+
+ // `gs' has to be fully sorted, thus it cannot have pending rows.
+ if (gs.num_pending_rows() > 0) {
+ gs.unset_pending_rows();
+ gs.sort_rows();
+ }
+ else if (!gs.is_sorted())
+ gs.sort_rows();
+
+ // Now adjusting dimensions (topology already adjusted).
+ // NOTE: sortedness is preserved.
+ gs.adjust_topology_and_space_dimension(topology(), space_dim);
+
+ if (minimize()) {
+ obtain_sorted_generators_with_sat_g();
+ // This call to `add_and_minimize(...)' cannot return `false'.
+ add_and_minimize(false, gen_sys, con_sys, sat_g, gs);
+ clear_sat_c_up_to_date();
+ }
+ else {
+ // The polyhedron was empty: check if `gs' contains a point.
+ if (!gs.has_points())
+ throw_invalid_generators("add_recycled_generators_and_minimize(gs)",
+ "gs");
+ // `gs' has a point: the polyhedron is no longer empty
+ // and generators are up-to-date.
+ std::swap(gen_sys, gs);
+ clear_empty();
+ set_generators_up_to_date();
+ // This call to `minimize()' cannot return `false'.
+ minimize();
+ }
+ assert(OK(true));
+ return true;
+}
+
+bool
+PPL::Polyhedron::add_generators_and_minimize(const Generator_System& gs) {
+ // TODO: this is just an executable specification.
+ Generator_System gs_copy = gs;
+ return add_recycled_generators_and_minimize(gs_copy);
+}
+
+void
+PPL::Polyhedron::add_congruences(const Congruence_System& cgs) {
+ // Dimension-compatibility check:
+ // the dimension of `cgs' can not be greater than space_dim.
+ 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)
+ if (i->is_equality()) {
+ Linear_Expression le(*i);
+ Constraint c(le, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ // FIXME: Steal the row in c when adding it to cs.
+ cs.insert(c);
+ inserted = true;
+ }
+ // 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::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).
+ assert(!x.has_pending_generators() && x.constraints_are_up_to_date());
+ 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.add_pending_rows(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.add_rows(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();
+ }
+ assert(x.OK() && y.OK());
+}
+
+bool
+PPL::Polyhedron::intersection_assign_and_minimize(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("intersection_assign_and_minimize(y)",
+ "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("intersection_assign_and_minimize(y)",
+ "y", y);
+
+ // If one of the two polyhedra is empty, the intersection is empty.
+ if (x.marked_empty())
+ return false;
+ if (y.marked_empty()) {
+ x.set_empty();
+ return false;
+ }
+
+ // 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 true;
+
+ // `x' must be minimized and have sorted constraints.
+ // `minimize()' will process any pending constraints or generators.
+ if (!x.minimize())
+ // We have just discovered that `x' is empty.
+ return false;
+ x.obtain_sorted_constraints_with_sat_c();
+
+ // `y' must have updated, possibly pending constraints.
+ if (y.has_pending_generators())
+ y.process_pending_generators();
+ else if (!y.constraints_are_up_to_date())
+ y.update_constraints();
+
+ bool empty;
+ if (y.con_sys.num_pending_rows() > 0) {
+ // Integrate `y.con_sys' as pending constraints of `x',
+ // sort them in place and then call `add_and_minimize()'.
+ x.con_sys.add_pending_rows(y.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();
+ assert(OK(true));
+ return true;
+ }
+ empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c);
+ }
+ else {
+ y.obtain_sorted_constraints();
+ empty = add_and_minimize(true, x.con_sys, x.gen_sys, x.sat_c, y.con_sys);
+ }
+
+ if (empty)
+ x.set_empty();
+ else {
+ // On exit of the function `intersection_assign_and_minimize()'
+ // the polyhedron is up-to-date and `sat_c' is meaningful.
+ x.set_sat_c_up_to_date();
+ x.clear_sat_g_up_to_date();
+ }
+ assert(x.OK(!empty));
+ return !empty;
+}
+
+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).
+ assert(!x.has_pending_constraints() && x.generators_are_up_to_date());
+ 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.add_pending_rows(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.add_rows(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.
+ assert(x.OK(true) && y.OK(true));
+}
+
+bool
+PPL::Polyhedron::poly_hull_assign_and_minimize(const Polyhedron& y) {
+ Polyhedron& x = *this;
+ // Topology compatibility check.
+ if (x.topology() != y.topology())
+ throw_topology_incompatible("poly_hull_assign_and_minimize(y)", "y", y);
+ // Dimension-compatibility check.
+ if (x.space_dim != y.space_dim)
+ throw_dimension_incompatible("poly_hull_assign_and_minimize(y)", "y", y);
+
+ // The poly-hull of a polyhedron `p' with an empty polyhedron is `p'.
+ if (y.marked_empty())
+ return minimize();
+ if (x.marked_empty()) {
+ x = y;
+ return minimize();
+ }
+
+ // 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 true;
+
+ // `x' must have minimized constraints and generators.
+ // `minimize()' will process any pending constraints or generators.
+ if (!x.minimize()) {
+ // We have just discovered that `x' is empty.
+ x = y;
+ return minimize();
+ }
+ // x must have `sat_g' up-to-date and sorted generators.
+ x.obtain_sorted_generators_with_sat_g();
+
+ // `y' must have updated, possibly pending generators.
+ if ((y.has_pending_constraints() && !y.process_pending_constraints())
+ || (!y.generators_are_up_to_date() && !y.update_generators()))
+ // We have just discovered that `y' is empty
+ // (and we know that `x' is not empty).
+ return true;
+
+ if (y.gen_sys.num_pending_rows() > 0) {
+ // Integrate `y.gen_sys' as pending generators of `x',
+ // sort them in place and then call `add_and_minimize()'.
+ x.gen_sys.add_pending_rows(y.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();
+ assert(OK(true) && y.OK());
+ return true;
+ }
+ add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g);
+ }
+ else {
+ y.obtain_sorted_generators();
+ add_and_minimize(false, x.gen_sys, x.con_sys, x.sat_g, y.gen_sys);
+ }
+ x.clear_sat_c_up_to_date();
+
+ assert(x.OK(true) && y.OK());
+ return 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;
+ }
+
+ Polyhedron new_polyhedron(topology(), x.space_dim, EMPTY);
+
+ // Being lazy here is only harmful.
+ // `minimize()' will process any pending constraints or generators.
+ x.minimize();
+ y.minimize();
+
+ 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;
+ assert(!c.is_tautological());
+ 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 = Linear_Expression(c);
+ switch (c.type()) {
+ case Constraint::NONSTRICT_INEQUALITY:
+ if (is_necessarily_closed())
+ z.add_constraint(e <= 0);
+ else
+ z.add_constraint(e < 0);
+ break;
+ case Constraint::STRICT_INEQUALITY:
+ z.add_constraint(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.add_constraint(e < 0);
+ new_polyhedron.poly_hull_assign(w);
+ z.add_constraint(e > 0);
+ }
+ break;
+ }
+ new_polyhedron.poly_hull_assign(z);
+ }
+ *this = new_polyhedron;
+
+ assert(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_space_dim, expr, denominator);
+ else
+ gen_sys.affine_image(var_space_dim, -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;
+ if (expr[var_space_dim] > 0) {
+ inverse = -expr;
+ inverse[var_space_dim] = denominator;
+ con_sys.affine_preimage(var_space_dim, inverse, expr[var_space_dim]);
+ }
+ 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[var_space_dim] = denominator;
+ neg_assign(inverse[var_space_dim]);
+ con_sys.affine_preimage(var_space_dim, inverse, -expr[var_space_dim]);
+ }
+ }
+ }
+ 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_space_dim, expr, denominator);
+ else
+ gen_sys.affine_image(var_space_dim, -expr, -denominator);
+
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ }
+ }
+ assert(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_space_dim, expr, denominator);
+ else
+ con_sys.affine_preimage(var_space_dim, -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;
+ if (expr[var_space_dim] > 0) {
+ inverse = -expr;
+ inverse[var_space_dim] = denominator;
+ gen_sys.affine_image(var_space_dim, inverse, expr[var_space_dim]);
+ }
+ 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[var_space_dim] = denominator;
+ neg_assign(inverse[var_space_dim]);
+ gen_sys.affine_image(var_space_dim, inverse, -expr[var_space_dim]);
+ }
+ }
+ }
+ 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_space_dim, expr, denominator);
+ else
+ con_sys.affine_preimage(var_space_dim, -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();
+ }
+ assert(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)",
+ "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)",
+ "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_THAN_OR_EQUAL,
+ ub_expr,
+ denominator);
+ if (denominator > 0)
+ add_constraint(lb_expr <= denominator*var);
+ else
+ add_constraint(denominator*var <= lb_expr);
+ }
+ else if (ub_expr.coefficient(var) == 0) {
+ // Here `var' only occurs in `lb_expr'.
+ generalized_affine_image(var,
+ GREATER_THAN_OR_EQUAL,
+ lb_expr,
+ denominator);
+ if (denominator > 0)
+ add_constraint(denominator*var <= ub_expr);
+ else
+ add_constraint(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 = Variable(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `ub_expr'.
+ // (we force minimization because we will need the generators).
+ add_constraint_and_minimize(denominator*new_var == ub_expr);
+ // Apply the affine lower bound.
+ generalized_affine_image(var,
+ GREATER_THAN_OR_EQUAL,
+ lb_expr,
+ denominator);
+ // Now apply the affine upper bound, as recorded in `new_var'
+ // (we force minimization because we will need the generators).
+ if (denominator > 0)
+ add_constraint_and_minimize(var <= new_var);
+ else
+ add_constraint_and_minimize(new_var <= var);
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ assert(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)",
+ "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)",
+ "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) {
+ add_constraint(lb_expr <= denominator*var);
+ add_constraint(denominator*var <= ub_expr);
+ }
+ else {
+ add_constraint(ub_expr <= denominator*var);
+ add_constraint(denominator*var <= lb_expr);
+ }
+ // Any image of an empty polyhedron is empty.
+ // Note: DO check for emptyness here, as we will later add a line.
+ if (is_empty())
+ return;
+ add_generator(line(var));
+ }
+ else {
+ // Here `var' occurs in `lb_expr' or `ub_expr'.
+ // To ease the computation, add an additional dimension.
+ const Variable new_var = Variable(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Swap dimensions `var' and `new_var'.
+ std::vector<dimension_type> swapping_cycle;
+ swapping_cycle.push_back(var_space_dim);
+ swapping_cycle.push_back(space_dim);
+ swapping_cycle.push_back(0);
+ if (constraints_are_up_to_date())
+ con_sys.permute_columns(swapping_cycle);
+ if (generators_are_up_to_date())
+ gen_sys.permute_columns(swapping_cycle);
+ // Constrain the new dimension as dictated by `lb_expr' and `ub_expr'.
+ // (we force minimization because we will need the generators).
+ if (denominator > 0) {
+ add_constraint(lb_expr <= denominator*new_var);
+ add_constraint(denominator*new_var <= ub_expr);
+ }
+ else {
+ add_constraint(ub_expr <= denominator*new_var);
+ add_constraint(denominator*new_var <= lb_expr);
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+ }
+ assert(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");
+
+ // 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 emptyness here, as we will later add a ray.
+ if (is_empty())
+ return;
+
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ add_generator(ray(-var));
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_generator(ray(var));
+ break;
+ case LESS_THAN:
+ // Intentionally fall through.
+ case GREATER_THAN:
+ {
+ // The relation symbol is strict.
+ assert(!is_necessarily_closed());
+ // While adding the ray, we minimize the generators
+ // in order to avoid adding too many redundant generators later.
+ add_generator_and_minimize(ray(relsym == GREATER_THAN ? var : -var));
+ // 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.
+ const dimension_type eps_index = space_dim + 1;
+ for (dimension_type i = gen_sys.num_rows(); i-- > 0; )
+ if (gen_sys[i].is_point()) {
+ Generator& g = gen_sys[i];
+ // Add a `var'-displaced copy of `g' to the generator system.
+ gen_sys.add_row(g);
+ if (relsym == GREATER_THAN)
+ ++gen_sys[gen_sys.num_rows()-1][var_space_dim];
+ else
+ --gen_sys[gen_sys.num_rows()-1][var_space_dim];
+ // Transform `g' into a closure point.
+ g[eps_index] = 0;
+ }
+ clear_constraints_up_to_date();
+ clear_generators_minimized();
+ gen_sys.set_sorted(false);
+ clear_sat_c_up_to_date();
+ clear_sat_g_up_to_date();
+ }
+ break;
+ case EQUAL:
+ // This case was already dealt with before.
+ throw std::runtime_error("PPL internal error");
+ }
+ assert(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");
+
+ // 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_THAN_OR_EQUAL:
+ reversed_relsym = GREATER_THAN_OR_EQUAL;
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ reversed_relsym = LESS_THAN_OR_EQUAL;
+ break;
+ case GREATER_THAN:
+ reversed_relsym = LESS_THAN;
+ break;
+ default:
+ // The EQUAL case has been already dealt with.
+ throw std::runtime_error("PPL internal error");
+ 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;
+ Coefficient 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 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:
+ add_constraint(denominator*var < expr);
+ break;
+ case LESS_THAN_OR_EQUAL:
+ add_constraint(denominator*var <= expr);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(denominator*var >= expr);
+ break;
+ case GREATER_THAN:
+ add_constraint(denominator*var > expr);
+ break;
+ case EQUAL:
+ // We already dealt with this case.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ // If the shrunk polyhedron is empty, its preimage is empty too.
+ // Note: DO check for emptyness here, as we will later add a line.
+ if (is_empty())
+ return;
+ add_generator(line(var));
+ assert(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");
+
+ // 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'.
+ for ( ; lhs_space_dim > 0; lhs_space_dim--)
+ if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0)
+ break;
+ // 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:
+ add_constraint(lhs < rhs);
+ break;
+ case LESS_THAN_OR_EQUAL:
+ add_constraint(lhs <= rhs);
+ break;
+ case EQUAL:
+ add_constraint(lhs == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= rhs);
+ break;
+ case GREATER_THAN:
+ add_constraint(lhs > rhs);
+ 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;
+ bool lhs_vars_intersects_rhs_vars = false;
+ for (dimension_type i = lhs_space_dim; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0) {
+ new_lines.insert(line(Variable(i)));
+ if (rhs.coefficient(Variable(i)) != 0)
+ lhs_vars_intersects_rhs_vars = true;
+ }
+
+ if (lhs_vars_intersects_rhs_vars) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var = Variable(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).
+ if (add_constraint_and_minimize(new_var == rhs)) {
+ // Cylindrificate on all the variables occurring in the left hand side
+ // (we force minimization because we will need the constraints).
+ add_recycled_generators_and_minimize(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:
+ add_constraint_and_minimize(lhs < new_var);
+ break;
+ case LESS_THAN_OR_EQUAL:
+ add_constraint_and_minimize(lhs <= new_var);
+ break;
+ case EQUAL:
+ add_constraint_and_minimize(lhs == new_var);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint_and_minimize(lhs >= new_var);
+ break;
+ case GREATER_THAN:
+ add_constraint_and_minimize(lhs > new_var);
+ 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 emptyness here, as we will add lines.
+ if (is_empty())
+ return;
+
+ // Cylindrificate on all the variables occurring in the left hand side
+ // (we force minimization because we will need the constraints).
+ add_recycled_generators_and_minimize(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:
+ add_constraint(lhs < rhs);
+ break;
+ case LESS_THAN_OR_EQUAL:
+ add_constraint(lhs <= rhs);
+ break;
+ case EQUAL:
+ add_constraint(lhs == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= rhs);
+ break;
+ case GREATER_THAN:
+ add_constraint(lhs > rhs);
+ break;
+ }
+ }
+ assert(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");
+
+ // 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'.
+ for ( ; lhs_space_dim > 0; lhs_space_dim--)
+ if (lhs.coefficient(Variable(lhs_space_dim - 1)) != 0)
+ break;
+
+ // 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;
+ bool lhs_vars_intersects_rhs_vars = false;
+ for (dimension_type i = lhs_space_dim; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0) {
+ new_lines.insert(line(Variable(i)));
+ if (rhs.coefficient(Variable(i)) != 0)
+ lhs_vars_intersects_rhs_vars = true;
+ }
+
+ if (lhs_vars_intersects_rhs_vars) {
+ // Some variables in `lhs' also occur in `rhs'.
+ // To ease the computation, we add an additional dimension.
+ const Variable new_var = Variable(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).
+ if (add_constraint_and_minimize(new_var == lhs)) {
+ // Cylindrificate on all the variables occurring in the left hand side
+ // (we force minimization because we will need the constraints).
+ add_recycled_generators_and_minimize(new_lines);
+
+ // Constrain the new dimension so that it is related to
+ // the right hand side as dictated by `relsym'
+ // (we force minimization because we will need the generators).
+ switch (relsym) {
+ case LESS_THAN:
+ add_constraint_and_minimize(new_var < rhs);
+ break;
+ case LESS_THAN_OR_EQUAL:
+ add_constraint_and_minimize(new_var <= rhs);
+ break;
+ case EQUAL:
+ add_constraint_and_minimize(new_var == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint_and_minimize(new_var >= rhs);
+ break;
+ case GREATER_THAN:
+ add_constraint_and_minimize(new_var > rhs);
+ 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:
+ add_constraint(lhs < rhs);
+ break;
+ case LESS_THAN_OR_EQUAL:
+ add_constraint(lhs <= rhs);
+ break;
+ case EQUAL:
+ add_constraint(lhs == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= rhs);
+ break;
+ case GREATER_THAN:
+ add_constraint(lhs > rhs);
+ break;
+ }
+ // Any image of an empty polyhedron is empty.
+ // Note: DO check for emptyness here, as we will add lines.
+ if (is_empty())
+ return;
+ // Cylindrificate on all the variables occurring in `lhs'.
+ add_recycled_generators(new_lines);
+ }
+ assert(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;
+ dimension_type gs_num_rows = gs.num_rows();
+
+ if (!x.is_necessarily_closed())
+ // `x' and `y' are NNC polyhedra.
+ for (dimension_type i = gs_num_rows; i-- > 0; )
+ switch (gs[i].type()) {
+ case Generator::POINT:
+ // The points of `gs' can be erased,
+ // since their role can be played by closure points.
+ --gs_num_rows;
+ std::swap(gs[i], gs[gs_num_rows]);
+ break;
+ case Generator::CLOSURE_POINT:
+ {
+ Generator& cp = gs[i];
+ // If it is the origin, erase it.
+ if (cp.all_homogeneous_terms_are_zero()) {
+ --gs_num_rows;
+ std::swap(cp, gs[gs_num_rows]);
+ }
+ // Otherwise, transform the closure point into a ray.
+ else {
+ cp[0] = 0;
+ // Enforce normalization.
+ cp.normalize();
+ }
+ }
+ break;
+ default:
+ // 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; )
+ switch (gs[i].type()) {
+ case Generator::POINT:
+ {
+ Generator& p = gs[i];
+ // If it is the origin, erase it.
+ if (p.all_homogeneous_terms_are_zero()) {
+ --gs_num_rows;
+ std::swap(p, gs[gs_num_rows]);
+ }
+ // Otherwise, transform the point into a ray.
+ else {
+ p[0] = 0;
+ // Enforce normalization.
+ p.normalize();
+ }
+ }
+ break;
+ default:
+ // For rays and lines, nothing to be done.
+ break;
+ }
+ // 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.erase_to_end(gs_num_rows);
+ gs.unset_pending_rows();
+
+ // `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.add_pending_rows(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();
+ }
+ assert(x.OK(true) && y.OK(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()) {
+ const dimension_type eps_index = space_dim + 1;
+ 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[i];
+ if (c[eps_index] < 0 && !c.is_tautological()) {
+ c[eps_index] = 0;
+ // Enforce normalization.
+ c.normalize();
+ changed = true;
+ }
+ }
+ 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.
+ 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();
+ }
+ }
+ assert(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_and_minimize(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 for well-formedness.
+ assert(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();
+}
+
+/*! \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_widenings.cc b/src/Polyhedron_widenings.cc
new file mode 100644
index 0000000..49bf651
--- /dev/null
+++ b/src/Polyhedron_widenings.cc
@@ -0,0 +1,862 @@
+/* Polyhedron class implementation
+ (non-inline widening-related member functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Polyhedron.defs.hh"
+
+#include "BHRZ03_Certificate.defs.hh"
+#include "Bounding_Box.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cassert>
+#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.
+ assert(topology() == y.topology()
+ && topology() == cs_selection.topology()
+ && space_dim == y.space_dim);
+ assert(!marked_empty()
+ && !has_pending_constraints()
+ && generators_are_up_to_date());
+ 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').
+ assert(topology() == y.topology()
+ && topology() == cs_selected.topology()
+ && topology() == cs_not_selected.topology());
+ assert(space_dim == y.space_dim);
+ assert(!marked_empty()
+ && !has_pending_generators()
+ && constraints_are_up_to_date());
+ assert(!y.marked_empty()
+ && !y.has_something_pending()
+ && y.constraints_are_minimized()
+ && y.generators_are_up_to_date());
+
+ // Obtain a sorted copy of `y.sat_g'.
+ if (!y.sat_g_is_up_to_date())
+ y.update_sat_g();
+ Saturation_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;
+ dimension_type num_rows = y_cs.num_rows();
+ for (dimension_type i = 0; i < num_rows; ++i)
+ if (y_cs[i].is_tautological()) {
+ --num_rows;
+ std::swap(tmp_sat_g[i], tmp_sat_g[num_rows]);
+ }
+ tmp_sat_g.rows_erase_to_end(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'.
+
+ // CHECK ME: 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() bit.
+ Saturation_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'.
+ assert(sp_sgn >= 0);
+ 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 tpl = x.topology();
+ if (tpl != 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);
+
+#ifndef NDEBUG
+ {
+ // We assume that y is contained in or equal to x.
+ const Polyhedron x_copy = x;
+ const Polyhedron y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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);
+ if (!yy.intersection_assign_and_minimize(x))
+ // `y' 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(tpl);
+ 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(tpl, 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.
+ std::swap(x, CH78);
+ assert(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(tpl);
+ Constraint_System x_minus_H79_cs(tpl);
+ x.select_H79_constraints(y, H79_cs, x_minus_H79_cs);
+
+ if (x_minus_H79_cs.num_rows() == 0)
+ // 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(tpl, 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.
+ std::swap(x, H79);
+ assert(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);
+
+#ifndef NDEBUG
+ {
+ // We assume that y is contained in or equal to x.
+ const Polyhedron x_copy = x;
+ const Polyhedron y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ 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_constraints(new_cs);
+ assert(OK());
+}
+
+void
+PPL::Polyhedron::bounded_H79_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ const dimension_type space_dim = space_dimension();
+ Bounding_Box x_box(space_dim);
+ Bounding_Box y_box(space_dim);
+ shrink_bounding_box(x_box, ANY_COMPLEXITY);
+ y.shrink_bounding_box(y_box, ANY_COMPLEXITY);
+ x_box.CC76_widening_assign(y_box);
+ limited_H79_extrapolation_assign(y, cs, tp);
+ // TODO: see if some copies can be avoided.
+ // add_recycled_constraints(x_box.constraints());
+ add_constraints(x_box.constraints());
+}
+
+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'.
+ assert(x.topology() == y.topology()
+ && x.topology() == H79.topology()
+ && x.topology() == x_minus_H79_cs.topology());
+ assert(x.space_dim == y.space_dim
+ && x.space_dim == H79.space_dim
+ && x.space_dim == x_minus_H79_cs.space_dimension());
+ assert(!x.marked_empty() && !x.has_something_pending()
+ && x.constraints_are_minimized() && x.generators_are_minimized());
+ assert(!y.marked_empty() && !y.has_something_pending()
+ && y.constraints_are_minimized() && y.generators_are_minimized());
+ 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 tpl = x.topology();
+ Constraint_System combining_cs(tpl);
+ Constraint_System new_cs(tpl);
+
+ // 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]);
+ }
+
+ 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_and_minimize(new_cs);
+
+ // 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.
+ std::swap(x, result);
+ assert(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'.
+ assert(x.topology() == y.topology()
+ && x.topology() == H79.topology());
+ assert(x.space_dim == y.space_dim
+ && x.space_dim == H79.space_dim);
+ assert(!x.marked_empty() && !x.has_something_pending()
+ && x.constraints_are_minimized() && x.generators_are_minimized());
+ assert(!y.marked_empty() && !y.has_something_pending()
+ && y.constraints_are_minimized() && y.generators_are_minimized());
+ 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; ) {
+ 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)) {
+ 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_and_minimize(candidate_rays);
+ result.intersection_assign_and_minimize(H79);
+
+ // 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.
+ std::swap(x, result);
+ assert(x.OK(true));
+ return true;
+ }
+ else
+ // The technique was unsuccessful.
+ return false;
+}
+
+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'.
+ assert(x.topology() == y.topology()
+ && x.topology() == H79.topology());
+ assert(x.space_dim == y.space_dim
+ && x.space_dim == H79.space_dim);
+ assert(!x.marked_empty() && !x.has_something_pending()
+ && x.constraints_are_minimized() && x.generators_are_minimized());
+ assert(!y.marked_empty() && !y.has_something_pending()
+ && y.constraints_are_minimized() && y.generators_are_minimized());
+ 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;
+ TEMP_INTEGER(tmp);
+ 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'.
+ std::deque<bool> considered(x.space_dim + 1);
+ for (dimension_type k = 1; k < x.space_dim; ++k)
+ if (!considered[k])
+ for (dimension_type h = k + 1; h <= x.space_dim; ++h)
+ if (!considered[h]) {
+ tmp = x_g[k] * y_g[h];
+ // The following line optimizes the computation of
+ // tmp -= x_g[h] * y_g[k];
+ sub_mul_assign(tmp, x_g[h], y_g[k]);
+ const int clockwise
+ = sgn(tmp);
+ const int first_or_third_quadrant
+ = sgn(x_g[k]) * sgn(x_g[h]);
+ switch (clockwise * first_or_third_quadrant) {
+ case -1:
+ new_ray[k] = 0;
+ considered[k] = true;
+ break;
+ case 1:
+ new_ray[h] = 0;
+ considered[h] = true;
+ break;
+ default:
+ break;
+ }
+ }
+ new_ray.normalize();
+ candidate_rays.insert(new_ray);
+ }
+ }
+ }
+ }
+
+ // If there are no candidate rays, we cannot obtain stabilization.
+ if (candidate_rays.num_rows() == 0)
+ return false;
+
+ // Be non-intrusive.
+ Polyhedron result = x;
+ // Add to `result' the rays in `candidate_rays'
+ result.add_recycled_generators_and_minimize(candidate_rays);
+ // Intersect with `H79'.
+ result.intersection_assign_and_minimize(H79);
+
+ // Check for stabilization with respect to `y' and improvement over `H79'.
+ if (y_cert.is_stabilizing(result) && !result.contains(H79)) {
+ // The technique was successful.
+ std::swap(x, result);
+ assert(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);
+
+#ifndef NDEBUG
+ {
+ // We assume that y is contained in or equal to x.
+ const Polyhedron x_copy = x;
+ const Polyhedron y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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;
+
+ // `x.con_sys' and `x.gen_sys' should be in minimal form.
+ x.minimize();
+
+ // `y.con_sys' and `y.gen_sys' should be in minimal form.
+ 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);
+ if (!yy.intersection_assign_and_minimize(x))
+ // `y' is empty: the result is `x'.
+ return;
+ }
+
+ // Compute certificate info for polyhedron `y'.
+ 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)) {
+ assert(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);
+ assert(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 tpl = x.topology();
+ Constraint_System H79_cs(tpl);
+ Constraint_System x_minus_H79_cs(tpl);
+ 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.
+ assert(x_minus_H79_cs.num_rows() > 0);
+ // Be careful to obtain the right space dimension
+ // (because `H79_cs' may be empty).
+ Polyhedron H79(tpl, x.space_dim, UNIVERSE);
+ H79.add_recycled_constraints_and_minimize(H79_cs);
+
+ // 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;
+
+ assert(H79.OK() && x.OK() && y.OK());
+
+ if (x.BHRZ03_evolving_points(y, y_cert, H79))
+ return;
+
+ assert(H79.OK() && x.OK() && y.OK());
+
+ if (x.BHRZ03_evolving_rays(y, y_cert, H79))
+ return;
+
+ assert(H79.OK() && x.OK() && y.OK());
+
+ // No previous technique was successful: fall back to the H79 widening.
+ std::swap(x, H79);
+ assert(x.OK(true));
+
+#ifndef NDEBUG
+ // The H79 widening is always stabilizing.
+ x.minimize();
+ assert(y_cert.is_stabilizing(x));
+#endif
+}
+
+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);
+
+#ifndef NDEBUG
+ {
+ // We assume that y is contained in or equal to x.
+ const Polyhedron x_copy = x;
+ const Polyhedron y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ 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_constraints(new_cs);
+ assert(OK());
+}
+
+void
+PPL::Polyhedron
+::bounded_BHRZ03_extrapolation_assign(const Polyhedron& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ const dimension_type space_dim = space_dimension();
+ Bounding_Box x_box(space_dim);
+ Bounding_Box y_box(space_dim);
+ shrink_bounding_box(x_box, ANY_COMPLEXITY);
+ y.shrink_bounding_box(y_box, ANY_COMPLEXITY);
+ x_box.CC76_widening_assign(y_box);
+ limited_BHRZ03_extrapolation_assign(y, cs, tp);
+ // TODO: see if some copies can be avoided.
+ // add_recycled_constraints(x_box.constraints());
+ add_constraints(x_box.constraints());
+}
diff --git a/src/Powerset.defs.hh b/src/Powerset.defs.hh
new file mode 100644
index 0000000..6600a99
--- /dev/null
+++ b/src/Powerset.defs.hh
@@ -0,0 +1,620 @@
+/* Powerset class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Powerset_defs_hh
+#define PPL_Powerset_defs_hh
+
+#include "Powerset.types.hh"
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! 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 templatic 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 Element
+ //@{
+
+ /*! \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 Element
+
+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;
+
+ class omega_iterator;
+ class omega_const_iterator;
+
+ /*! \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 omega_iterator iterator;
+ //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+ typedef omega_const_iterator 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;
+
+ //! Returns <CODE>true</CODE> if and only if there are no disjuncts.
+ 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 Element
+ //@{
+
+ //! The assignment operator.
+ Powerset& operator=(const Powerset& y);
+
+ //! Swaps \p *this with \p y.
+ void 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);
+
+ //! 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.
+ */
+ iterator add_non_bottom_disjunct(const D& d,
+ iterator first,
+ iterator last);
+
+ /*! \brief
+ Adds to \p *this the disjunct \p d,
+ assuming \p d is not the bottom element.
+ */
+ void add_non_bottom_disjunct(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);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+ This class implements a read-only bidirectional iterator
+ on the sequence of disjuncts.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_const_iterator {
+protected:
+ //! The type of the underlying %const_iterator.
+ typedef typename Powerset::Sequence::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.
+ omega_const_iterator(const Base& b);
+
+ 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.
+ omega_const_iterator();
+
+ //! Copy constructor.
+ omega_const_iterator(const omega_const_iterator& y);
+
+ //! Constructs from the corresponding non-const iterator.
+ omega_const_iterator(const omega_iterator& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ omega_const_iterator& operator++();
+
+ //! Postfix increment operator.
+ omega_const_iterator operator++(int);
+
+ //! Prefix decrement operator.
+ omega_const_iterator& operator--();
+
+ //! Postfix decrement operator.
+ omega_const_iterator operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const omega_const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const omega_const_iterator& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+ This class implements a <EM>read-only</EM> bidirectional iterator
+ on the sequence of disjuncts. That is, by using an instance of
+ this iterator class it is not possible to overwrite the disjuncts
+ contained in a Powerset element. However, using such an instance
+ allows for the removal of disjuncts by using methods
+ <CODE>Powerset::drop_disjunct(iterator position)</CODE> and
+ <CODE>Powerset::drop_disjuncts(iterator first, iterator last)</CODE>.
+ Such a policy is needed to allow for a reliable use of the Boolean
+ flag <CODE>Powerset::reduced</CODE>.
+
+ \note
+ For any developers' need, (low-level) iterators on the sequence of
+ disjuncts are still available by accessing the protected member
+ <CODE>Powerset::sequence</CODE>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_iterator {
+protected:
+ //! The type of the underlying mutable iterator.
+ typedef typename Powerset::Sequence::iterator Base;
+
+ //! A shortcut for naming the const_iterator traits.
+ typedef typename
+ std::iterator_traits<typename Powerset::Sequence::const_iterator> Traits;
+
+ //! A (mutable) iterator on the sequence of elements.
+ Base base;
+
+ //! Constructs from the lower-level iterator.
+ omega_iterator(const Base& b);
+
+ friend class Powerset;
+ friend Powerset<D>::omega_const_iterator
+ ::omega_const_iterator(const omega_iterator& y);
+
+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.
+ omega_iterator();
+
+ //! Copy constructor.
+ omega_iterator(const omega_iterator& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect access operator.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ omega_iterator& operator++();
+
+ //! Postfix increment operator.
+ omega_iterator operator++(int);
+
+ //! Prefix decrement operator.
+ omega_iterator& operator--();
+
+ //! Postfix decrement operator.
+ omega_iterator operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const omega_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const omega_iterator& 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 Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& 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 Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+void swap(Parma_Polyhedra_Library::Powerset<D>& x,
+ Parma_Polyhedra_Library::Powerset<D>& y);
+
+} // namespace std
+
+#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..8085fbe
--- /dev/null
+++ b/src/Powerset.inlines.hh
@@ -0,0 +1,399 @@
+/* Powerset class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Powerset_inlines_hh
+#define PPL_Powerset_inlines_hh 1
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator()
+ : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const omega_iterator& y)
+ : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const Base& b)
+ : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::reference
+Powerset<D>::omega_iterator::operator*() const {
+ return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::pointer
+Powerset<D>::omega_iterator::operator->() const {
+ return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator++(int) {
+ omega_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator--(int) {
+ omega_iterator tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator==(const omega_iterator& y) const {
+ return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator!=(const omega_iterator& y) const {
+ return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator()
+ : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_const_iterator& y)
+ : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator(const Base& b)
+ : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::reference
+Powerset<D>::omega_const_iterator::operator*() const {
+ return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::pointer
+Powerset<D>::omega_const_iterator::operator->() const {
+ return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator++(int) {
+ omega_const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator--(int) {
+ omega_const_iterator tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator==(const omega_const_iterator& y) const {
+ return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator!=(const omega_const_iterator& y) const {
+ return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_iterator& y)
+ : base(y.base) {
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& y) {
+ return Powerset<D>::omega_const_iterator(x).operator==(y);
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& y) {
+ return !(x == y);
+}
+
+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>::swap(Powerset& y) {
+ std::swap(sequence, y.sequence);
+ std::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(true) {
+ if (!d.is_bottom())
+ sequence.push_back(d);
+ assert(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct(const D& d) {
+ assert(!d.is_bottom());
+ add_non_bottom_disjunct(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+ if (!d.is_bottom())
+ add_non_bottom_disjunct(d);
+}
+
+/*! \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 memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+inline void
+swap(Parma_Polyhedra_Library::Powerset<D>& x,
+ Parma_Polyhedra_Library::Powerset<D>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Powerset_inlines_hh)
diff --git a/src/Powerset.templates.hh b/src/Powerset.templates.hh
new file mode 100644
index 0000000..3fce827
--- /dev/null
+++ b/src/Powerset.templates.hh
@@ -0,0 +1,302 @@
+/* Powerset class implementation: non-inline template functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Powerset_templates_hh
+#define PPL_Powerset_templates_hh 1
+
+#include <algorithm>
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+ 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;
+
+ assert(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 && xi != x.end()) {
+ // Hurry up!
+ x.collapse(xi.base);
+ break;
+ }
+ }
+ reduced = true;
+ assert(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+ 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);
+ }
+ assert(OK());
+ 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(const D& d,
+ iterator first,
+ iterator last) {
+ 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);
+ 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> yy = y;
+ for (typename Powerset<D>::const_iterator xi = x.begin(),
+ x_end = x.end(); xi != x_end; ++xi) {
+ typename Powerset<D>::iterator yyi = yy.begin();
+ typename Powerset<D>::iterator yy_end = yy.end();
+ yyi = std::find(yyi, yy_end, *xi);
+ if (yyi == yy_end)
+ return false;
+ else
+ yy.drop_disjunct(yyi);
+ }
+ 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.
+ std::swap(sequence, new_sequence);
+ reduced = false;
+}
+
+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(*i, old_begin, old_end);
+}
+
+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++ << " }";
+ 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..4198773
--- /dev/null
+++ b/src/Powerset.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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..6b8f2d4
--- /dev/null
+++ b/src/Ptr_Iterator.defs.hh
@@ -0,0 +1,171 @@
+/* Ptr_Iterator class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 Q, typename R>
+bool operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+typename Ptr_Iterator<Q>::difference_type operator-(const Ptr_Iterator<Q>& x,
+ const Ptr_Iterator<R>& 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 // 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..dc886b8
--- /dev/null
+++ b/src/Ptr_Iterator.inlines.hh
@@ -0,0 +1,188 @@
+/* Ptr_Iterator class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Ptr_Iterator_inlines_hh
+#define PPL_Ptr_Iterator_inlines_hh 1
+
+#include <algorithm>
+#include <cassert>
+
+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>& y)
+ : p(y.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..3d7b646
--- /dev/null
+++ b/src/Ptr_Iterator.types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Result.defs.hh b/src/Result.defs.hh
new file mode 100644
index 0000000..e0c5073
--- /dev/null
+++ b/src/Result.defs.hh
@@ -0,0 +1,118 @@
+/* Result enum and supporting function declarations.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Result_defs_hh
+#define PPL_Result_defs_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+
+ VC_MASK = 48,
+
+ //! \hideinitializer Ordinary result class.
+ VC_NORMAL = 0,
+
+ //! \hideinitializer The computed result is inexact and rounded up.
+ V_LT = 1,
+
+ //! \hideinitializer The computed result is inexact and rounded down.
+ V_GT = 2,
+
+ //! \hideinitializer The computed result is exact.
+ V_EQ = 4,
+
+ //! \hideinitializer The computed result is inexact.
+ V_NE = V_LT | V_GT,
+
+ //! \hideinitializer The computed result may be inexact and rounded up.
+ V_LE = V_EQ | V_LT,
+
+ //! \hideinitializer The computed result may be inexact and rounded down.
+ V_GE = V_EQ | V_GT,
+
+ //! \hideinitializer The computed result may be inexact.
+ V_LGE = V_LT | V_EQ | V_GT,
+
+ //! \hideinitializer Negative infinity unrepresentable result class.
+ VC_MINUS_INFINITY = 16,
+
+ //! \hideinitializer A negative overflow occurred.
+ V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT,
+
+ //! \hideinitializer Positive infinity unrepresentable result class.
+ VC_PLUS_INFINITY = 32,
+
+ //! \hideinitializer A positive overflow occurred.
+ V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT,
+
+ //! \hideinitializer Not a number result class.
+ VC_NAN = 48,
+
+ //! \hideinitializer Converting from unknown string.
+ V_CVT_STR_UNK = 49,
+
+ //! \hideinitializer Dividing by zero.
+ V_DIV_ZERO = 50,
+
+ //! \hideinitializer Adding two infinities having opposite signs.
+ V_INF_ADD_INF = 51,
+
+ //! \hideinitializer Dividing two infinities.
+ V_INF_DIV_INF = 52,
+
+ //! \hideinitializer Taking the modulus of an infinity.
+ V_INF_MOD = 53,
+
+ //! \hideinitializer Multiplying an infinity by zero.
+ V_INF_MUL_ZERO = 54,
+
+ //! \hideinitializer Subtracting two infinities having the same sign.
+ V_INF_SUB_INF = 55,
+
+ //! \hideinitializer Computing a remainder modulo zero.
+ V_MOD_ZERO = 56,
+
+ //! \hideinitializer Taking the square root of a negative number.
+ V_SQRT_NEG = 57,
+
+ //! \hideinitializer Unknown result due to intermediate negative overflow.
+ V_UNKNOWN_NEG_OVERFLOW = 58,
+
+ //! \hideinitializer Unknown result due to intermediate positive overflow.
+ V_UNKNOWN_POS_OVERFLOW = 59,
+
+ //! \hideinitializer Unordered comparison.
+ V_UNORD_COMP = 60
+};
+
+bool is_special(Result r);
+Result classify(Result r);
+Result sign(Result r);
+
+} // 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..3ff1a97
--- /dev/null
+++ b/src/Result.inlines.hh
@@ -0,0 +1,60 @@
+/* Result supporting functions implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Result_inlines_hh
+#define PPL_Result_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline Result
+classify(Result r) {
+ return static_cast<Result>(r & VC_MASK);
+}
+
+inline bool
+is_special(Result r) {
+ return classify(r) != VC_NORMAL;
+}
+
+inline Result
+sign(Result r) {
+ switch (r) {
+ case V_LT:
+ case V_EQ:
+ case V_GT:
+ case VC_NAN:
+ return r;
+ case VC_MINUS_INFINITY:
+ return V_LT;
+ case VC_PLUS_INFINITY:
+ return V_GT;
+ default:
+ assert(false);
+ return VC_NAN;
+ }
+}
+
+} // 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..6f44dd2
--- /dev/null
+++ b/src/Rounding_Dir.defs.hh
@@ -0,0 +1,70 @@
+/* Declaration of Rounding_Dir and related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 = FPU_DOWNWARD,
+
+ /*! \hideinitializer
+ Round toward \f$+\infty\f$.
+ */
+ ROUND_UP = FPU_UPWARD,
+
+ /*! \hideinitializer
+ Rounding is delegated to lower level. Result info is evaluated lazily.
+ */
+ ROUND_IGNORE = -1,
+ ROUND_NATIVE = ROUND_IGNORE,
+
+ /*! \hideinitializer
+ Rounding is not needed: client code must ensure the operation is exact.
+ */
+ ROUND_NOT_NEEDED = -2,
+
+ ROUND_DIRECT = ROUND_UP,
+ ROUND_INVERSE = ROUND_DOWN
+};
+
+/*! \brief
+ Returns the inverse rounding mode of \p dir,
+ <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+} // 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..2304410
--- /dev/null
+++ b/src/Rounding_Dir.inlines.hh
@@ -0,0 +1,48 @@
+/* Inline functions operating on enum Rounding_Dir values.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Rounding_Dir_inlines_hh
+#define PPL_Rounding_Dir_inlines_hh 1
+
+#include "Rounding_Dir.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Parma_Polyhedra_Library::Rounding_Dir */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+ switch (dir) {
+ case ROUND_UP:
+ return ROUND_DOWN;
+ case ROUND_DOWN:
+ return ROUND_UP;
+ case ROUND_IGNORE:
+ return ROUND_IGNORE;
+ default:
+ assert(false);
+ return ROUND_IGNORE;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Rounding_Dir_inlines_hh)
diff --git a/src/Row.cc b/src/Row.cc
new file mode 100644
index 0000000..5f10255
--- /dev/null
+++ b/src/Row.cc
@@ -0,0 +1,282 @@
+/* Row class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Row.defs.hh"
+#include "Coefficient.defs.hh"
+#include <iostream>
+#include <iomanip>
+#include <cassert>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Row_Impl_Handler::
+Impl::expand_within_capacity(const dimension_type new_size) {
+ assert(size() <= new_size && new_size <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ // vec_[0] is already constructed.
+ if (size() == 0 && new_size > 0)
+ bump_size();
+#endif
+ for (dimension_type i = size(); i < new_size; ++i) {
+ new (&vec_[i]) Coefficient();
+ bump_size();
+ }
+}
+
+void
+PPL::Row_Impl_Handler::Impl::shrink(dimension_type new_size) {
+ const dimension_type old_size = size();
+ assert(new_size <= old_size);
+ // Since ~Coefficient() does not throw exceptions, nothing here does.
+ set_size(new_size);
+#if !CXX_SUPPORTS_FLEXIBLE_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].~Coefficient();
+}
+
+void
+PPL::Row_Impl_Handler::Impl::copy_construct_coefficients(const Impl& y) {
+ const dimension_type y_size = y.size();
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ for (dimension_type i = 0; i < y_size; ++i) {
+ new (&vec_[i]) Coefficient(y.vec_[i]);
+ bump_size();
+ }
+#else
+ assert(y_size > 0);
+ if (y_size > 0) {
+ vec_[0] = y.vec_[0];
+ bump_size();
+ for (dimension_type i = 1; i < y_size; ++i) {
+ new (&vec_[i]) Coefficient(y.vec_[i]);
+ bump_size();
+ }
+ }
+#endif
+}
+
+void
+PPL::Row::normalize() {
+ Row& x = *this;
+ // Compute the GCD of all the coefficients.
+ const dimension_type sz = size();
+ dimension_type i = sz;
+ TEMP_INTEGER(gcd);
+ while (i > 0) {
+ const Coefficient& 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) {
+ const Coefficient& 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::Row::Flags::ascii_dump(std::ostream& s) const {
+ s << "0x";
+ std::istream::fmtflags f = s.setf(std::istream::hex);
+ std::streamsize sz = s.width(2*sizeof(Flags::base_type));
+ std::ostream::char_type ch = s.fill('0');
+ s << bits;
+ s.fill(ch);
+ s.width(sz);
+ s.flags(f);
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row::Flags);
+
+bool
+PPL::Row::Flags::ascii_load(std::istream& s) {
+ std::string str;
+ std::streamsize sz = s.width(2);
+ if (!(s >> str) || (str.compare("0x") != 0))
+ return false;
+ s.width(sz);
+ std::istream::fmtflags f = s.setf(std::istream::hex);
+ bool r = s >> bits;
+ s.flags(f);
+ return r;
+}
+
+void
+PPL::Row::ascii_dump(std::ostream& s) const {
+ const Row& x = *this;
+ const dimension_type x_size = x.size();
+ for (dimension_type i = 0; i < x_size; ++i)
+ s << x[i] << ' ';
+ s << "f ";
+ flags().ascii_dump(s);
+ s << "\n";
+}
+
+PPL_OUTPUT_DEFINITIONS_ASCII_ONLY(Row);
+
+bool
+PPL::Row::ascii_load(std::istream& s) {
+ Row& x = *this;
+ std::string str;
+ const dimension_type x_size = x.size();
+ for (dimension_type col = 0; col < x_size; ++col)
+ if (!(s >> x[col]))
+ return false;
+ if (!(s >> str) || (str.compare("f") != 0))
+ return false;
+ return flags().ascii_load(s);
+}
+
+PPL::memory_size_type
+PPL::Row_Impl_Handler::Impl::external_memory_in_bytes() const {
+ memory_size_type n = 0;
+ for (dimension_type i = size(); i-- > 0; )
+ n += PPL::external_memory_in_bytes(vec_[i]);
+ return n;
+}
+
+bool
+PPL::Row::OK(const dimension_type row_size,
+ const dimension_type
+#if EXTRA_ROW_DEBUG
+ row_capacity
+#endif
+ ) const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ bool is_broken = false;
+#if EXTRA_ROW_DEBUG
+# if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ if (capacity_ == 0) {
+ cerr << "Illegal row capacity: is 0, should be at least 1"
+ << endl;
+ is_broken = true;
+ }
+ else if (capacity_ == 1 && row_capacity == 0)
+ // This is fine.
+ ;
+ else
+# endif
+ if (capacity_ > max_size()) {
+ cerr << "Row capacity exceeds the maximum allowed size:"
+ << endl
+ << "is " << capacity_
+ << ", should be less than or equal to " << max_size() << "."
+ << endl;
+ is_broken = true;
+ }
+ if (capacity_ != row_capacity) {
+ cerr << "Row capacity mismatch: is " << capacity_
+ << ", should be " << row_capacity << "."
+ << endl;
+ is_broken = true;
+ }
+#endif
+ if (size() > max_size()) {
+#ifndef NDEBUG
+ cerr << "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 (size() != row_size) {
+#ifndef NDEBUG
+ cerr << "Row size mismatch: is " << size()
+ << ", should be " << row_size << "."
+ << endl;
+#endif
+ is_broken = true;
+ }
+#if EXTRA_ROW_DEBUG
+ if (capacity_ < size()) {
+#ifndef NDEBUG
+ cerr << "Row is completely broken: capacity is " << capacity_
+ << ", size is " << size() << "."
+ << endl;
+#endif
+ is_broken = true;
+ }
+#endif
+ return !is_broken;
+}
+
+/*! \relates Parma_Polyhedra_Library::Row */
+bool
+PPL::operator==(const Row& x, const Row& y) {
+ const dimension_type x_size = x.size();
+ const dimension_type y_size = y.size();
+ if (x_size != y_size)
+ return false;
+
+ if (x.flags() != y.flags())
+ return false;
+
+ for (dimension_type i = x_size; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+
+ return true;
+}
diff --git a/src/Row.defs.hh b/src/Row.defs.hh
new file mode 100644
index 0000000..c3ca460
--- /dev/null
+++ b/src/Row.defs.hh
@@ -0,0 +1,496 @@
+/* Row class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Row_defs_hh
+#define PPL_Row_defs_hh 1
+
+#include "Row.types.hh"
+#include "globals.defs.hh"
+#include "Coefficient.defs.hh"
+#include <vector>
+#include <limits>
+
+#ifndef EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+ \brief
+ Enables extra debugging information for class Row.
+
+ \ingroup PPL_CXX_interface
+ When <CODE>EXTRA_ROW_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+ each instance of the class Row carries its own capacity; this enables
+ extra consistency checks to be performed.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler {
+public:
+ //! Default constructor.
+ Row_Impl_Handler();
+
+ //! Destructor.
+ ~Row_Impl_Handler();
+
+ class Impl;
+
+ //! A pointer to the actual implementation.
+ Impl* impl;
+
+#if EXTRA_ROW_DEBUG
+ //! The capacity of \p impl (only available during debugging).
+ dimension_type capacity_;
+#endif // EXTRA_ROW_DEBUG
+
+private:
+ //! Private and unimplemented: copy construction is not allowed.
+ Row_Impl_Handler(const Row_Impl_Handler&);
+
+ //! Private and unimplemented: copy assignment is not allowed.
+ Row_Impl_Handler& operator=(const Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row : private Row_Impl_Handler {
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Wrapper class to represent a set of flags with bits in a native
+ unsigned integral type.
+ \ingroup PPL_CXX_interface
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ class Flags {
+ public:
+ //! Constructs an object with all the flags unset.
+ Flags();
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+ bool operator==(const Flags& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are different.
+ */
+ bool operator!=(const Flags& y) const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Flags representation from \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by
+ \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump.
+ */
+ bool ascii_load(std::istream& s);
+
+ protected:
+ //! A native integral type holding the bits that encode the flags.
+ typedef unsigned int base_type;
+
+ //! Index of the first bit derived classes can use.
+ static const unsigned first_free_bit = 0;
+
+ //! Total number of bits that can be stored.
+ static const unsigned num_bits = std::numeric_limits<base_type>::digits;
+
+ //! Constructs an object with flags set as in \p n.
+ explicit Flags(base_type n);
+
+ //! Returns the integer encoding \p *this.
+ base_type get_bits() const;
+
+ //! Sets the bits in \p mask.
+ void set_bits(base_type mask);
+
+ //! Resets the bits in \p mask.
+ void reset_bits(base_type mask);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the bits
+ in \p mask are set.
+ */
+ bool test_bits(base_type mask) const;
+
+ private:
+ //! The integer encoding \p *this.
+ base_type bits;
+
+ friend class Row;
+ };
+
+ //! Pre-constructs a row: construction must be completed by construct().
+ Row();
+
+ //! \name Post-constructors
+ //@{
+ //! Constructs properly a default-constructed element.
+ /*!
+ Builds a row with size and capacity \p sz and flags \p f.
+ */
+ void construct(dimension_type sz, Flags f);
+
+ //! Constructs properly a default-constructed element.
+ /*!
+ \param sz
+ The size of the row that will be constructed;
+
+ \param capacity
+ The capacity of the row that will be constructed;
+
+ \param f
+ Flags for 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.
+ The row flags are set to \p f.
+ */
+ void construct(dimension_type sz, dimension_type capacity, Flags f);
+ //@} // Post-constructors
+
+ //! Tight constructor: resizing may require reallocation.
+ /*!
+ Constructs a row with size and capacity \p sz, and flags \p f.
+ */
+ Row(dimension_type sz, Flags f);
+
+ //! 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;
+
+ \param f
+ Flags for 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.
+ The row flags are set to \p f.
+ */
+ Row(dimension_type sz, dimension_type capacity, Flags f);
+
+ //! Ordinary copy constructor.
+ Row(const Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to
+ the size of \p y.
+ */
+ Row(const 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.
+ */
+ Row(const Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~Row();
+
+ //! Assignment operator.
+ Row& operator=(const Row& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Row& y);
+
+ //! Assigns the implementation of \p y to \p *this.
+ /*!
+ To be used with extra care, since it may easily cause memory leaks
+ or undefined behavior.
+ */
+ void assign(Row& y);
+
+ /*! \brief
+ Allocates memory for a default constructed Row object, setting
+ flags to \p f and 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 Row object is zero.
+ */
+ void allocate(dimension_type capacity, Flags f);
+
+ //! 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 a const reference to the flags of \p *this.
+ const Flags& flags() const;
+
+ //! Returns a non-const reference to the flags of \p *this.
+ Flags& flags();
+
+ //! Returns the size() of the largest possible 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();
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Row representation at \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by \ref ascii_dump.
+ */
+ 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(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+ //! Exception-safe copy construction mechanism for coefficients.
+ void copy_construct_coefficients(const Row& y);
+
+#if EXTRA_ROW_DEBUG
+ //! Returns the capacity of the row (only available during debugging).
+ dimension_type capacity() const;
+#endif // EXTRA_ROW_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Row */
+bool operator==(const Row& x, const Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Row */
+bool operator!=(const Row& x, const Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Row& x,
+ Parma_Polyhedra_Library::Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Row>::iterator y);
+
+} // namespace std
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The actual implementation of a Row object.
+/*! \ingroup PPL_CXX_interface
+ The class Row_Impl_Handler::Impl provides the implementation of Row
+ objects and, in particular, of the corresponding memory allocation
+ functions.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler::Impl {
+public:
+ //! \name Custom allocator and deallocator
+ //@{
+
+ /*! \brief
+ Allocates a chunk of memory able to contain \p capacity Coefficient 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);
+ //@} // Custom allocator and deallocator
+
+ //! Constructor.
+ Impl(Row::Flags f);
+
+ //! 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);
+
+ //! Returns the size() of the largest possible Impl.
+ static dimension_type max_size();
+
+ //! \name Flags accessors
+ //@{
+ //! Returns a const reference to the flags of \p *this.
+ const Row::Flags& flags() const;
+
+ //! Returns a non-const reference to the flags of \p *this.
+ Row::Flags& flags();
+ //@} // Flags accessors
+
+ //! \name Size accessors
+ //@{
+ //! Returns the actual size of \p this.
+ dimension_type size() const;
+
+ //! Sets to \p new_size the actual size of \p *this.
+ void set_size(dimension_type new_size);
+
+ //! Increment the size of \p *this by 1.
+ void bump_size();
+ //@} // Size accessors
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the element of \p *this indexed by \p k.
+ Coefficient& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of \p *this indexed by \p k.
+ Coefficient_traits::const_reference operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ /*! \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:
+ //! The number of coefficients in the row.
+ dimension_type size_;
+
+ //! The flags of this row.
+ Row::Flags flags_;
+
+ //! The vector of coefficients.
+ Coefficient vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ 1
+#endif
+ ];
+
+ //! Private and unimplemented: default construction is not allowed.
+ Impl();
+
+ //! Private and unimplemented: copy construction is not allowed.
+ Impl(const Impl& y);
+
+ //! Private and unimplemented: assignment is not allowed.
+ Impl& operator=(const Impl&);
+};
+
+#include "Row.inlines.hh"
+
+#endif // !defined(PPL_Row_defs_hh)
diff --git a/src/Row.inlines.hh b/src/Row.inlines.hh
new file mode 100644
index 0000000..a850267
--- /dev/null
+++ b/src/Row.inlines.hh
@@ -0,0 +1,404 @@
+/* Row class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Row_inlines_hh
+#define PPL_Row_inlines_hh 1
+
+#include "globals.defs.hh"
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Row::Flags::Flags()
+ : bits(0) {
+}
+
+inline
+Row::Flags::Flags(base_type n)
+ : bits(n) {
+}
+
+inline Row::Flags::base_type
+Row::Flags::get_bits() const {
+ return bits;
+}
+
+inline void
+Row::Flags::set_bits(const base_type mask) {
+ bits |= mask;
+}
+
+inline void
+Row::Flags::reset_bits(const base_type mask) {
+ bits &= ~mask;
+}
+
+inline bool
+Row::Flags::test_bits(const base_type mask) const {
+ return (bits & mask) == mask;
+}
+
+inline bool
+Row::Flags::operator==(const Flags& y) const {
+ base_type mask = low_bits_mask<base_type>(first_free_bit);
+ return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Row::Flags::operator!=(const Flags& y) const {
+ return !operator==(y);
+}
+
+inline void*
+Row_Impl_Handler::Impl::operator new(const size_t fixed_size,
+ const dimension_type capacity) {
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ return ::operator new(fixed_size + capacity*sizeof(Coefficient));
+#else
+ assert(capacity >= 1);
+ return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient));
+#endif
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p) {
+ ::operator delete(p);
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) {
+ ::operator delete(p);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::max_size() {
+ return size_t(-1)/sizeof(Coefficient);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::size() const {
+ return size_;
+}
+
+inline void
+Row_Impl_Handler::Impl::set_size(const dimension_type new_size) {
+ size_ = new_size;
+}
+
+inline void
+Row_Impl_Handler::Impl::bump_size() {
+ ++size_;
+}
+
+inline
+Row_Impl_Handler::Impl::Impl(const Row::Flags f)
+ : size_(0), flags_(f) {
+}
+
+inline
+Row_Impl_Handler::Impl::~Impl() {
+ shrink(0);
+}
+
+inline const Row::Flags&
+Row_Impl_Handler::Impl::flags() const {
+ return flags_;
+}
+
+inline Row::Flags&
+Row_Impl_Handler::Impl::flags() {
+ return flags_;
+}
+
+inline Coefficient&
+Row_Impl_Handler::Impl::operator[](const dimension_type k) {
+ assert(k < size());
+ return vec_[k];
+}
+
+inline Coefficient_traits::const_reference
+Row_Impl_Handler::Impl::operator[](const dimension_type k) const {
+ assert(k < size());
+ return vec_[k];
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const {
+ return
+ sizeof(*this)
+ + capacity*sizeof(Coefficient)
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ - 1*sizeof(Coefficient)
+#endif
+ + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Row_Impl_Handler::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_);
+}
+
+inline dimension_type
+Row::max_size() {
+ return Impl::max_size();
+}
+
+inline dimension_type
+Row::size() const {
+ return impl->size();
+}
+
+inline const Row::Flags&
+Row::flags() const {
+ return impl->flags();
+}
+
+inline Row::Flags&
+Row::flags() {
+ return impl->flags();
+}
+
+#if EXTRA_ROW_DEBUG
+inline dimension_type
+Row::capacity() const {
+ return capacity_;
+}
+#endif
+
+inline
+Row_Impl_Handler::Row_Impl_Handler()
+ : impl(0) {
+#if EXTRA_ROW_DEBUG
+ capacity_ = 0;
+#endif
+}
+
+inline
+Row_Impl_Handler::~Row_Impl_Handler() {
+ delete impl;
+}
+
+inline
+Row::Row()
+ : Row_Impl_Handler() {
+}
+
+inline void
+Row::allocate(
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ const
+#endif
+ dimension_type capacity,
+ const Flags f) {
+ assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ if (capacity == 0)
+ ++capacity;
+#endif
+ assert(impl == 0);
+ impl = new (capacity) Impl(f);
+#if EXTRA_ROW_DEBUG
+ assert(capacity_ == 0);
+ capacity_ = capacity;
+#endif
+}
+
+inline void
+Row::expand_within_capacity(const dimension_type new_size) {
+ assert(impl);
+#if EXTRA_ROW_DEBUG
+ assert(new_size <= capacity_);
+#endif
+ impl->expand_within_capacity(new_size);
+}
+
+inline void
+Row::copy_construct_coefficients(const Row& y) {
+ assert(impl && y.impl);
+#if EXTRA_ROW_DEBUG
+ assert(y.size() <= capacity_);
+#endif
+ impl->copy_construct_coefficients(*(y.impl));
+}
+
+inline void
+Row::construct(const dimension_type sz,
+ const dimension_type capacity,
+ const Flags f) {
+ assert(sz <= capacity && capacity <= max_size());
+ allocate(capacity, f);
+ expand_within_capacity(sz);
+}
+
+inline void
+Row::construct(const dimension_type sz, const Flags f) {
+ construct(sz, sz, f);
+}
+
+inline
+Row::Row(const dimension_type sz,
+ const dimension_type capacity,
+ const Flags f)
+ : Row_Impl_Handler() {
+ construct(sz, capacity, f);
+}
+
+inline
+Row::Row(const dimension_type sz, const Flags f)
+ : Row_Impl_Handler() {
+ construct(sz, f);
+}
+
+inline
+Row::Row(const Row& y)
+ : Row_Impl_Handler() {
+ if (y.impl) {
+ allocate(compute_capacity(y.size(), max_size()), y.flags());
+ copy_construct_coefficients(y);
+ }
+}
+
+inline
+Row::Row(const Row& y,
+ const dimension_type capacity)
+ : Row_Impl_Handler() {
+ assert(y.impl);
+ assert(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity, y.flags());
+ copy_construct_coefficients(y);
+}
+
+inline
+Row::Row(const Row& y,
+ const dimension_type sz,
+ const dimension_type capacity)
+ : Row_Impl_Handler() {
+ assert(y.impl);
+ assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+ allocate(capacity, y.flags());
+ copy_construct_coefficients(y);
+ expand_within_capacity(sz);
+}
+
+inline
+Row::~Row() {
+}
+
+inline void
+Row::shrink(const dimension_type new_size) {
+ assert(impl);
+ impl->shrink(new_size);
+}
+
+inline void
+Row::swap(Row& y) {
+ std::swap(impl, y.impl);
+#if EXTRA_ROW_DEBUG
+ std::swap(capacity_, y.capacity_);
+#endif
+}
+
+inline void
+Row::assign(Row& y) {
+ impl = y.impl;
+#if EXTRA_ROW_DEBUG
+ capacity_ = y.capacity_;
+#endif
+}
+
+inline Row&
+Row::operator=(const Row& y) {
+ // Copy-construct `tmp' from `y'.
+ Row tmp(y);
+ // Swap the implementation of `*this' with the one of `tmp'.
+ swap(tmp);
+ // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+ return *this;
+}
+
+inline Coefficient&
+Row::operator[](const dimension_type k) {
+ assert(impl);
+ return (*impl)[k];
+}
+
+inline Coefficient_traits::const_reference
+Row::operator[](const dimension_type k) const {
+ assert(impl);
+ return (*impl)[k];
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes(dimension_type capacity) const {
+ return impl->total_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes(dimension_type capacity) const {
+ return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes() const {
+#if EXTRA_ROW_DEBUG
+ return impl->total_memory_in_bytes(capacity_);
+#else
+ return impl->total_memory_in_bytes();
+#endif
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Row */
+inline bool
+operator!=(const Row& x, const Row& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Row_inlines_hh)
diff --git a/src/Row.types.hh b/src/Row.types.hh
new file mode 100644
index 0000000..3a7fb38
--- /dev/null
+++ b/src/Row.types.hh
@@ -0,0 +1,22 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Row_types_hh
+#define PPL_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Row_Impl_Handler;
+class Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Row_types_hh)
diff --git a/src/Saturation_Matrix.cc b/src/Saturation_Matrix.cc
new file mode 100644
index 0000000..f3ab2b4
--- /dev/null
+++ b/src/Saturation_Matrix.cc
@@ -0,0 +1,227 @@
+/* Saturation_Matrix class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Saturation_Matrix.defs.hh"
+#include "globals.defs.hh"
+#include <iostream>
+#include <string>
+
+#include "swapping_sort.icc"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Saturation_Matrix&
+PPL::Saturation_Matrix::operator=(const Saturation_Matrix& y){
+ rows = y.rows;
+ row_size = y.row_size;
+ assert(OK());
+ return *this;
+}
+
+void
+PPL::Saturation_Matrix::sort_rows() {
+ typedef std::vector<Saturation_Row>::iterator Iter;
+ // Sorting without removing duplicates.
+ Iter first = rows.begin();
+ Iter last = rows.end();
+ swapping_sort(first, last, Saturation_Row_Less_Than());
+ // Moving all the duplicate elements at the end of the vector.
+ Iter new_last = swapping_unique(first, last);
+ // Removing duplicates.
+ rows.erase(new_last, last);
+ assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::add_row(const Saturation_Row& row) {
+ const dimension_type new_rows_size = rows.size() + 1;
+ if (rows.capacity() < new_rows_size) {
+ // Reallocation will take place.
+ std::vector<Saturation_Row> new_rows;
+ new_rows.reserve(compute_capacity(new_rows_size, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_rows_size, Saturation_Row());
+ // Put the new row in place.
+ dimension_type i = new_rows_size-1;
+ new_rows[i] = row;
+ // Steal the old rows.
+ while (i-- > 0)
+ new_rows[i].swap(rows[i]);
+ // Put the new rows into place.
+ std::swap(rows, new_rows);
+ }
+ else
+ // Reallocation will NOT take place: append a new empty row.
+ rows.push_back(row);
+ assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::transpose() {
+ const Saturation_Matrix& x = *this;
+ const dimension_type nrows = num_rows();
+ const dimension_type ncols = num_columns();
+ Saturation_Matrix tmp(ncols, nrows);
+ for (dimension_type i = nrows; i-- > 0; )
+ for (unsigned long j = x[i].last(); j != ULONG_MAX; j = x[i].prev(j))
+ tmp[j].set(i);
+ swap(tmp);
+ assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::transpose_assign(const Saturation_Matrix& y) {
+ const dimension_type y_nrows = y.num_rows();
+ const dimension_type y_ncols = y.num_columns();
+ Saturation_Matrix tmp(y_ncols, y_nrows);
+ for (dimension_type i = y_nrows; i-- > 0; )
+ for (unsigned long j = y[i].last(); j != ULONG_MAX; j = y[i].prev(j))
+ tmp[j].set(i);
+ swap(tmp);
+ assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::resize(dimension_type new_n_rows,
+ dimension_type new_n_columns) {
+ 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);
+ Saturation_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<Saturation_Row> new_rows;
+ new_rows.reserve(compute_capacity(new_n_rows, max_num_rows()));
+ new_rows.insert(new_rows.end(), new_n_rows, Saturation_Row());
+ // Steal the old rows.
+ for (dimension_type i = old_num_rows; i-- > 0; )
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::swap(rows, new_rows);
+ }
+ else
+ // Reallocation will NOT take place.
+ rows.insert(rows.end(), new_n_rows - old_num_rows, Saturation_Row());
+ }
+ else if (new_n_rows < old_num_rows)
+ // Drop some rows.
+ rows.erase(rows.begin() + new_n_rows, rows.end());
+
+ assert(OK());
+}
+
+void
+PPL::Saturation_Matrix::ascii_dump(std::ostream& s) const {
+ const Saturation_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(Saturation_Matrix);
+
+bool
+PPL::Saturation_Matrix::ascii_load(std::istream& s) {
+ Saturation_Matrix& x = *this;
+ dimension_type nrows;
+ dimension_type ncols;
+ std::string str;
+ if (!(s >> nrows))
+ return false;
+ if (!(s >> str))
+ 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)
+ x[i].set(j);
+ else
+ x[i].clear(j);
+ }
+ // Check for well-formedness.
+ assert(OK());
+ return true;
+}
+
+PPL::memory_size_type
+PPL::Saturation_Matrix::external_memory_in_bytes() const {
+ memory_size_type n = rows.capacity() * sizeof(Row);
+ for (dimension_type i = num_rows(); i-- > 0; )
+ n += rows[i].external_memory_in_bytes();
+ return n;
+}
+
+bool
+PPL::Saturation_Matrix::OK() const {
+#ifndef NDEBUG
+ using std::endl;
+ using std::cerr;
+#endif
+
+ const Saturation_Matrix& x = *this;
+ for (dimension_type i = num_rows(); i-- > 1; ) {
+ const Saturation_Row& row = x[i];
+ if (!row.OK())
+ return false;
+ else if (row.last() != ULONG_MAX && row.last() >= row_size) {
+#ifndef NDEBUG
+ cerr << "Saturation_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::Saturation_Matrix::check_sorted() const {
+ const Saturation_Matrix& x = *this;
+ for (dimension_type i = num_rows(); i-- > 1; )
+ if (compare(x[i-1], x[i]) > 0)
+ return false;
+ return true;
+}
+#endif
diff --git a/src/Saturation_Matrix.defs.hh b/src/Saturation_Matrix.defs.hh
new file mode 100644
index 0000000..264c3c8
--- /dev/null
+++ b/src/Saturation_Matrix.defs.hh
@@ -0,0 +1,177 @@
+/* Saturation_Matrix class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Matrix_defs_hh
+#define PPL_Saturation_Matrix_defs_hh 1
+
+#include "Saturation_Matrix.types.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Row.defs.hh"
+#include <vector>
+#include <iosfwd>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A saturation matrix.
+/*! \ingroup PPL_CXX_interface
+ A saturation matrix is used to encode the relation between the
+ generators and the constraints of a polyhedron: if a generator
+ saturates a constraint the corresponding element of the saturation
+ matrix is \f$0\f$, otherwise (i.e., if the generator satisfies but
+ does not saturate the constraint) the corresponding element is \f$1\f$.
+ \note
+ since the constraints and generators are taken from the same polyhedron
+ description, it cannot be the case that a generator <EM>violates</EM>
+ a constraint.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Saturation_Matrix {
+public:
+ //! Default constructor.
+ Saturation_Matrix();
+
+ /*! \brief
+ Construct a saturation matrix with \p n_rows rows
+ and \p n_columns columns.
+ */
+ Saturation_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+ //! Copy-constructor.
+ Saturation_Matrix(const Saturation_Matrix& y);
+
+ //! Destructor.
+ ~Saturation_Matrix();
+
+ //! Assignment operator.
+ Saturation_Matrix& operator=(const Saturation_Matrix& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Saturation_Matrix& y);
+
+ //! Subscript operator.
+ Saturation_Row& operator[](dimension_type k);
+
+ //! Constant subscript operator.
+ const Saturation_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 Saturation_Matrix& y);
+
+ //! Returns the maximum number of rows of a Saturation_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 saturation matrix (this ensures better efficiency),
+ tells whether it contains the given row.
+ */
+ bool sorted_contains(const Saturation_Row& row) const;
+
+ //! Adds \p row to \p *this.
+ void add_row(const Saturation_Row& row);
+
+ //! Erases the rows from the \p first_to_erase -th to the last one.
+ void rows_erase_to_end(dimension_type first_to_erase);
+
+ //! Erases the columns from the \p first_to_erase -th to the last one.
+ void columns_erase_to_end(dimension_type first_to_erase);
+
+ //! 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 \ref ascii_dump)
+ 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<Saturation_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 Saturation_Row_Less_Than {
+ bool operator()(const Saturation_Row& x, const Saturation_Row& y) const;
+ };
+
+ friend
+ void Parma_Polyhedra_Library::
+ Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat);
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+ Parma_Polyhedra_Library::Saturation_Matrix& y);
+
+} // namespace std
+
+#include "Saturation_Matrix.inlines.hh"
+
+#endif // !defined(PPL_Saturation_Matrix_defs_hh)
diff --git a/src/Saturation_Matrix.inlines.hh b/src/Saturation_Matrix.inlines.hh
new file mode 100644
index 0000000..ad7b477
--- /dev/null
+++ b/src/Saturation_Matrix.inlines.hh
@@ -0,0 +1,145 @@
+/* Saturation_Matrix class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Matrix_inlines_hh
+#define PPL_Saturation_Matrix_inlines_hh 1
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Matrix::Saturation_Matrix()
+ : rows(),
+ row_size(0) {
+}
+
+inline dimension_type
+Saturation_Matrix::max_num_rows() {
+ return std::vector<Saturation_Row>().max_size();
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const dimension_type n_rows,
+ const dimension_type n_columns)
+ : rows(n_rows),
+ row_size(n_columns) {
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const Saturation_Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size) {
+}
+
+inline
+Saturation_Matrix::~Saturation_Matrix() {
+}
+
+inline void
+Saturation_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
+ // The first row to be erased cannot be greater
+ // than the actual number of the rows of the matrix.
+ assert(first_to_erase <= rows.size());
+ if (first_to_erase < rows.size())
+ rows.erase(rows.begin() + first_to_erase, rows.end());
+ assert(OK());
+}
+
+inline void
+Saturation_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
+ // The first column to be erased cannot be greater
+ // than the actual number of the columns of the matrix.
+ assert(first_to_erase <= row_size);
+ row_size = first_to_erase;
+ assert(OK());
+}
+
+inline void
+Saturation_Matrix::swap(Saturation_Matrix& y) {
+ std::swap(row_size, y.row_size);
+ std::swap(rows, y.rows);
+}
+
+inline Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline const Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) const {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline dimension_type
+Saturation_Matrix::num_columns() const {
+ return row_size;
+}
+
+inline dimension_type
+Saturation_Matrix::num_rows() const {
+ return rows.size();
+}
+
+inline void
+Saturation_Matrix::clear() {
+ // Clear `rows' and minimize its capacity.
+ std::vector<Saturation_Row>().swap(rows);
+ row_size = 0;
+}
+
+inline memory_size_type
+Saturation_Matrix::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Saturation_Matrix::Saturation_Row_Less_Than::
+operator()(const Saturation_Row& x, const Saturation_Row& y) const {
+ return compare(x, y) < 0;
+}
+
+inline bool
+Saturation_Matrix::sorted_contains(const Saturation_Row& row) const {
+ assert(check_sorted());
+ return std::binary_search(rows.begin(), rows.end(), row,
+ Saturation_Row_Less_Than());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+ Parma_Polyhedra_Library::Saturation_Matrix& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Saturation_Matrix_inlines_hh)
diff --git a/src/Saturation_Matrix.types.hh b/src/Saturation_Matrix.types.hh
new file mode 100644
index 0000000..489b6ea
--- /dev/null
+++ b/src/Saturation_Matrix.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Saturation_Matrix_types_hh
+#define PPL_Saturation_Matrix_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Saturation_Matrix_types_hh)
diff --git a/src/Saturation_Row.cc b/src/Saturation_Row.cc
new file mode 100644
index 0000000..55c2533
--- /dev/null
+++ b/src/Saturation_Row.cc
@@ -0,0 +1,347 @@
+/* Saturation_Row class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Saturation_Row.defs.hh"
+#include <cassert>
+#include <climits>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+#define BITS_PER_GMP_LIMB (SIZEOF_MP_LIMB_T*CHAR_BIT)
+
+#if !HAVE_DECL_FFS || SIZEOF_MP_LIMB_T != SIZEOF_INT
+unsigned int
+PPL::Saturation_Row::first_one(mp_limb_t w) {
+ unsigned int r = 0;
+ w = w & -w;
+#if SIZEOF_MP_LIMB_T == 8
+ if ((w & 0xffffffff) == 0) {
+ w >>= 32;
+ r += 32;
+ }
+#elif SIZEOF_MP_LIMB_T != 4
+#error "Size of mp_limb_t not supported by Saturation_Row::first_one(mp_limb_t w)."
+#endif
+ if ((w & 0xffff) == 0) {
+ w >>= 16;
+ r += 16;
+ }
+ if ((w & 0xff) == 0) {
+ w >>= 8;
+ r += 8;
+ }
+ if (w & 0xf0)
+ r += 4;
+ if (w & 0xcc)
+ r += 2;
+ if (w & 0xaa)
+ r += 1;
+ return r;
+}
+#endif // !HAVE_DECL_FFS || SIZEOF_MP_LIMB_T != SIZEOF_INT
+
+unsigned int
+PPL::Saturation_Row::last_one(mp_limb_t w) {
+ unsigned int r = 0;
+#if SIZEOF_MP_LIMB_T == 8
+ if (w & 0xffffffff00000000) {
+ w >>= 32;
+ r += 32;
+ }
+#elif SIZEOF_MP_LIMB_T != 4
+#error "Size of mp_limb_t not supported by Saturation_Row::last_one(mp_limb_t w)."
+#endif
+ if (w & 0xffff0000) {
+ w >>= 16;
+ r += 16;
+ }
+ if (w & 0xff00) {
+ w >>= 8;
+ r += 8;
+ }
+ if (w & 0xf0) {
+ w >>= 4;
+ r += 4;
+ }
+ if (w & 0xc) {
+ w >>= 2;
+ r += 2;
+ }
+ if (w & 0x2)
+ r += 1;
+ return r;
+}
+
+unsigned long
+PPL::Saturation_Row::first() const {
+ const mp_size_t vec_size = vec->_mp_size;
+ assert(vec_size >= 0);
+ mp_size_t li = 0;
+ mp_srcptr p = vec->_mp_d;
+ for (; li < vec_size; ++li, ++p) {
+ const mp_limb_t limb = *p;
+ if (limb != 0)
+ return li*BITS_PER_GMP_LIMB + first_one(limb);
+ }
+ return ULONG_MAX;
+}
+
+unsigned long
+PPL::Saturation_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.
+ //
+ // unsigned long r = mpz_scan1(vec, position);
+ // return (r == ULONG_MAX) ? -1 : r;
+
+ mp_size_t li = position / BITS_PER_GMP_LIMB;
+ const mp_size_t vec_size = vec->_mp_size;
+ assert(vec_size >= 0);
+ if (li >= vec_size)
+ return ULONG_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 & (~(mp_limb_t) 0) << (position % BITS_PER_GMP_LIMB);
+
+ while (true) {
+ if (limb != 0)
+ return li*BITS_PER_GMP_LIMB + first_one(limb);
+ ++li;
+ if (li == vec_size)
+ break;
+ ++p;
+ limb = *p;
+ }
+ return ULONG_MAX;
+}
+
+unsigned long
+PPL::Saturation_Row::last() const {
+ mp_size_t li = vec->_mp_size;
+ assert(li >= 0);
+ if (li == 0)
+ return ULONG_MAX;
+ --li;
+ const mp_srcptr p = vec->_mp_d + li;
+ const mp_limb_t limb = *p;
+ assert(limb != 0);
+ return li*BITS_PER_GMP_LIMB + last_one(limb);
+}
+
+unsigned long
+PPL::Saturation_Row::prev(unsigned long position) const {
+ if (position == 0)
+ return ULONG_MAX;
+
+ --position;
+
+ const mp_size_t vec_size = vec->_mp_size;
+ assert(vec_size > 0);
+ mp_size_t li = position / BITS_PER_GMP_LIMB;
+
+ 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
+ = (~(mp_limb_t) 0)
+ >> (BITS_PER_GMP_LIMB - 1 - position % BITS_PER_GMP_LIMB);
+ p += li;
+ limb = *p & mask;
+ }
+
+ while (true) {
+ if (limb != 0)
+ return li*BITS_PER_GMP_LIMB + last_one(limb);
+ if (li == 0)
+ break;
+ --li;
+ --p;
+ limb = *p;
+ }
+ return ULONG_MAX;
+}
+
+bool
+PPL::Saturation_Row::operator[](const unsigned long k) const {
+ const mp_size_t vec_size = vec->_mp_size;
+ assert(vec_size >= 0);
+
+ unsigned long i = k / GMP_NUMB_BITS;
+ if (i >= static_cast<unsigned long>(vec_size))
+ return false;
+
+ mp_limb_t limb = *(vec->_mp_d + i);
+ return (limb >> (k % GMP_NUMB_BITS)) & 1;
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+int
+PPL::compare(const Saturation_Row& x, const Saturation_Row& y) {
+ const mp_size_t x_size = x.vec->_mp_size;
+ assert(x_size >= 0);
+ const mp_size_t y_size = y.vec->_mp_size;
+ 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 one's 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) ? 1 : -1;
+ }
+ ++xp;
+ ++yp;
+ --size;
+ }
+ return x_size == y_size ? 0 : (x_size > y_size ? 1 : -1);
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+bool
+PPL::subset_or_equal(const Saturation_Row& x, const Saturation_Row& y) {
+ mp_size_t x_size = x.vec->_mp_size;
+ assert(x_size >= 0);
+ mp_size_t y_size = y.vec->_mp_size;
+ 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)
+ return false;
+ ++xp;
+ ++yp;
+ --x_size;
+ }
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+bool
+PPL::subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
+ bool& strict_subset) {
+ mp_size_t x_size = x.vec->_mp_size;
+ assert(x_size >= 0);
+ mp_size_t y_size = y.vec->_mp_size;
+ assert(y_size >= 0);
+ if (x_size > y_size)
+ return false;
+ strict_subset = (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)
+ return false;
+ if (!strict_subset && xl != yl)
+ strict_subset = true;
+ ++xp;
+ ++yp;
+ --x_size;
+ }
+ return true;
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+bool
+PPL::strict_subset(const Saturation_Row& x, const Saturation_Row& y) {
+ mp_size_t x_size = x.vec->_mp_size;
+ assert(x_size >= 0);
+ mp_size_t y_size = y.vec->_mp_size;
+ 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)
+ return false;
+ if (!different && xl != yl)
+ different = true;
+ ++xp;
+ ++yp;
+ --x_size;
+ }
+ return different;
+}
+
+/*! \relates Saturation_Row */
+bool
+PPL::operator==(const Saturation_Row& x, const Saturation_Row& y) {
+ const mp_size_t x_vec_size = x.vec->_mp_size;
+ assert(x_vec_size >= 0);
+ const mp_size_t y_vec_size = y.vec->_mp_size;
+ 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 Saturation_Row */
+bool
+PPL::operator!=(const Saturation_Row& x, const Saturation_Row& y) {
+ const mp_size_t x_vec_size = x.vec->_mp_size;
+ assert(x_vec_size >= 0);
+ const mp_size_t y_vec_size = y.vec->_mp_size;
+ 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::Saturation_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);
+}
diff --git a/src/Saturation_Row.defs.hh b/src/Saturation_Row.defs.hh
new file mode 100644
index 0000000..29c6d14
--- /dev/null
+++ b/src/Saturation_Row.defs.hh
@@ -0,0 +1,239 @@
+/* Saturation_Row class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Row_defs_hh
+#define PPL_Saturation_Row_defs_hh 1
+
+#include "Saturation_Row.types.hh"
+#include "globals.types.hh"
+#include <iosfwd>
+#include <gmp.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+// 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 Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Saturation_Row& x, const Saturation_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 Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Saturation_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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_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 Saturation_Row
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
+ bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool strict_subset(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic union.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void set_union(const Saturation_Row& x,
+ const Saturation_Row& y,
+ Saturation_Row& z);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row of a saturation matrix.
+/*! \ingroup PPL_CXX_interface
+ An object of this class represents a single row of a saturation matrix.
+ The saturation row corresponds to a constraint and a system of generators
+ (resp., a generator and a system of constraints) and records whether or
+ not the constraint is saturated by each one of the generators (resp.,
+ the generator saturates each one of the constraints).
+
+ The saturation relation is encoded by using a bitset, so that the
+ constraint is saturated by the \f$i\f$-th generator in the system
+ (resp., the generator saturates the \f$i\f$-th constraint in the system)
+ if and only if the \f$i\f$-th bit is not set.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Saturation_Row {
+public:
+ //! Default constructor.
+ Saturation_Row();
+
+ //! Copy-constructor.
+ Saturation_Row(const Saturation_Row& y);
+
+ //! Destructor.
+ ~Saturation_Row();
+
+ //! Assignment operator.
+ Saturation_Row& operator=(const Saturation_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Saturation_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);
+
+ //! 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();
+
+ friend int
+ Parma_Polyhedra_Library::compare(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator!=(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+ const Saturation_Row& y,
+ bool& strict_subset);
+
+ friend bool
+ Parma_Polyhedra_Library::strict_subset(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend void
+ Parma_Polyhedra_Library::set_union(const Saturation_Row& x,
+ const Saturation_Row& y,
+ Saturation_Row& z);
+
+ //! 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;
+
+ //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
+ static unsigned int first_one(mp_limb_t w);
+
+ //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
+ static unsigned int last_one(mp_limb_t w);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Row& x,
+ Parma_Polyhedra_Library::Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y);
+
+} // namespace std
+
+#include "Saturation_Row.inlines.hh"
+
+#endif // !defined(PPL_Saturation_Row_defs_hh)
diff --git a/src/Saturation_Row.inlines.hh b/src/Saturation_Row.inlines.hh
new file mode 100644
index 0000000..e8e9d4f
--- /dev/null
+++ b/src/Saturation_Row.inlines.hh
@@ -0,0 +1,136 @@
+/* Saturation_Row class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Saturation_Row_inlines_hh
+#define PPL_Saturation_Row_inlines_hh 1
+
+#include <cassert>
+// For the declaration of ffs(3).
+#include <cstring>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Row::Saturation_Row() {
+ mpz_init(vec);
+}
+
+inline
+Saturation_Row::Saturation_Row(const Saturation_Row& y) {
+ mpz_init_set(vec, y.vec);
+}
+
+inline
+Saturation_Row::~Saturation_Row() {
+ mpz_clear(vec);
+}
+
+inline Saturation_Row&
+Saturation_Row::operator=(const Saturation_Row& y) {
+ mpz_set(vec, y.vec);
+ return *this;
+}
+
+inline void
+Saturation_Row::set(const unsigned long k) {
+ mpz_setbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear(const unsigned long k) {
+ mpz_clrbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear_from(const unsigned long k) {
+ mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Saturation_Row::count_ones() const {
+ assert(vec->_mp_size >= 0);
+ return mpn_popcount(vec->_mp_d, vec->_mp_size);
+}
+
+inline bool
+Saturation_Row::empty() const {
+ return mpz_sgn(vec) == 0;
+}
+
+inline void
+Saturation_Row::swap(Saturation_Row& y) {
+ mpz_swap(vec, y.vec);
+}
+
+inline void
+Saturation_Row::clear() {
+ mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Saturation_Row::external_memory_in_bytes() const {
+ return vec[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Saturation_Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+#if HAVE_DECL_FFS && SIZEOF_MP_LIMB_T == SIZEOF_INT
+
+inline unsigned int
+Saturation_Row::first_one(mp_limb_t w) {
+ return ffs(w)-1;
+}
+
+#endif
+
+/*! \relates Saturation_Row */
+inline void
+set_union(const Saturation_Row& x, const Saturation_Row& y,
+ Saturation_Row& z) {
+ mpz_ior(z.vec, x.vec, y.vec);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Row& x,
+ Parma_Polyhedra_Library::Saturation_Row& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+#endif // !defined(PPL_Saturation_Row_inlines_hh)
diff --git a/src/Saturation_Row.types.hh b/src/Saturation_Row.types.hh
new file mode 100644
index 0000000..8a97747
--- /dev/null
+++ b/src/Saturation_Row.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_Saturation_Row_types_hh
+#define PPL_Saturation_Row_types_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Saturation_Row_types_hh)
diff --git a/src/Scalar_Products.cc b/src/Scalar_Products.cc
new file mode 100644
index 0000000..0c9dec3
--- /dev/null
+++ b/src/Scalar_Products.cc
@@ -0,0 +1,121 @@
+/* Scalar_Products class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Scalar_Products.defs.hh"
+#include "Coefficient.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Linear_Row& x, const Linear_Row& y) {
+ // Scalar product is only defined if `x' and `y' are
+ // dimension-compatible.
+ assert(x.size() <= y.size());
+ z = 0;
+ for (dimension_type i = x.size(); i-- > 0; )
+ // The following line optimizes the computation of z += x[i] * y[i].
+ add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Grid_Generator& x, const Congruence& y) {
+ // Scalar product is only defined if `x' and `y' are
+ // dimension-compatible.
+ assert(x.size() <= y.size());
+ z = 0;
+ for (dimension_type i = x.size() - 1 /* parameter divisor */; i-- > 0; )
+ // The following line optimizes the computation of z += x[i] *
+ // y[i].
+ add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::assign(Coefficient& z,
+ const Congruence& x, const Grid_Generator& y) {
+ // Scalar product is only defined if `x' and `y' are
+ // dimension-compatible.
+ assert(x.size() <= y.size());
+ z = 0;
+ for (dimension_type i = x.size() - 1; i-- > 0; )
+ // The following line optimizes the computation of z += x[i] *
+ // y[i].
+ add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+ const Linear_Row& x,
+ const Linear_Row& y) {
+ // The reduced scalar product is only defined
+ // if the topology of `x' is NNC and `y' has enough coefficients.
+ assert(!x.is_necessarily_closed());
+ assert(x.size() - 1 <= y.size());
+ z = 0;
+ for (dimension_type i = x.size() - 1; i-- > 0; )
+ // The following line optimizes the computation of z += x[i] * y[i].
+ add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::reduced_assign(Coefficient& z,
+ const Grid_Generator& x,
+ const Congruence& y) {
+ // The reduced scalar product is only defined if the topology of `x'
+ // is NNC and `y' has enough coefficients.
+ assert(x.size() <= y.size());
+ z = 0;
+ for (dimension_type i = x.size() - 1; i-- > 0; )
+ // The following line optimizes z += x[i] * y[i].
+ add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Row& x,
+ const Linear_Row& y) {
+ // Scalar product is only defined if `x' and `y' are
+ // dimension-compatible.
+ assert(x.size() <= y.size());
+ z = 0;
+ // Note the pre-decrement of `i': last iteration should be for `i == 1'.
+ for (dimension_type i = x.size(); --i > 0; )
+ // The following line optimizes the computation of z += x[i] * y[i].
+ add_mul_assign(z, x[i], y[i]);
+}
+
+void
+PPL::Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Grid_Generator& x,
+ const Congruence& y) {
+ // Scalar product is only defined if `x' and `y' are
+ // dimension-compatible.
+ assert(x.size() <= y.size());
+ z = 0;
+ // Note the pre-decrement of `i': last iteration should be for `i == 1'.
+ for (dimension_type i = x.size() - 1; --i > 0; )
+ // The following line optimizes the computation of z += x[i] * y[i].
+ add_mul_assign(z, x[i], y[i]);
+}
diff --git a/src/Scalar_Products.defs.hh b/src/Scalar_Products.defs.hh
new file mode 100644
index 0000000..c22a3f8
--- /dev/null
+++ b/src/Scalar_Products.defs.hh
@@ -0,0 +1,182 @@
+/* Scalar_Products class definition.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Scalar_Products_defs_hh
+#define PPL_Scalar_Products_defs_hh 1
+
+#include "Scalar_Products.types.hh"
+#include "Linear_Row.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_Row 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 // 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_Row& x, const Linear_Row& 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 g and \p cg and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Grid_Generator& g, 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& g);
+
+ //! Returns the sign of the scalar product between \p x and \p y.
+ static int sign(const Linear_Row& x, const Linear_Row& 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);
+
+ /*! \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_Row& x, const Linear_Row& 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& g, 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_Row& x, const Linear_Row& 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_Row& x, const Linear_Row& 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 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& g, 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_Row& x, const Linear_Row& 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);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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 (*SPS_type)(const Linear_Row&, const Linear_Row&);
+
+ //! The scalar product sign function pointer.
+ SPS_type sps_fp;
+};
+
+#include "Scalar_Products.inlines.hh"
+
+#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..95bb409
--- /dev/null
+++ b/src/Scalar_Products.inlines.hh
@@ -0,0 +1,152 @@
+/* Scalar_Products class implementation (inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Scalar_Products_inlines_hh
+#define PPL_Scalar_Products_inlines_hh 1
+
+#include "Linear_Row.defs.hh"
+#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_Row& x, const Linear_Row& y) {
+ TEMP_INTEGER(z);
+ assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) {
+ TEMP_INTEGER(z);
+ reduced_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& y) {
+ TEMP_INTEGER(z);
+ homogeneous_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+ return sign(static_cast<const Linear_Row&>(c),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+ return sign(static_cast<const Linear_Row&>(g),
+ static_cast<const Linear_Row&>(c));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+ return reduced_sign(static_cast<const Linear_Row&>(c),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+ return reduced_sign(static_cast<const Linear_Row&>(g),
+ static_cast<const Linear_Row&>(c));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Generator& g) {
+ homogeneous_assign(z,
+ static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Grid_Generator& g) {
+ homogeneous_assign(z,
+ static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Generator& g) {
+ return homogeneous_sign(static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Grid_Generator& g) {
+ return homogeneous_sign(static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+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 {
+ assert(c.space_dimension() <= g.space_dimension());
+ 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(static_cast<const Linear_Row&>(c),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+ const Constraint& c) const {
+ assert(g.space_dimension() <= c.space_dimension());
+ 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(static_cast<const Linear_Row&>(g),
+ static_cast<const Linear_Row&>(c));
+}
+
+} // 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..b363999
--- /dev/null
+++ b/src/Scalar_Products.types.hh
@@ -0,0 +1,23 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Topology.hh b/src/Topology.hh
new file mode 100644
index 0000000..1c9d7a2
--- /dev/null
+++ b/src/Topology.hh
@@ -0,0 +1,28 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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_hh
+#define PPL_Topology_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+enum Topology {
+ NECESSARILY_CLOSED = 0,
+ NOT_NECESSARILY_CLOSED = 1
+};
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Topology_hh)
diff --git a/src/Variable.cc b/src/Variable.cc
new file mode 100644
index 0000000..f6707ed
--- /dev/null
+++ b/src/Variable.cc
@@ -0,0 +1,52 @@
+/* Variable class implementation (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <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) {
+ dimension_type varid = v.id();
+ s << static_cast<char>('A' + varid % 26);
+ if (dimension_type i = varid / 26)
+ 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.defs.hh b/src/Variable.defs.hh
new file mode 100644
index 0000000..ae623c9
--- /dev/null
+++ b/src/Variable.defs.hh
@@ -0,0 +1,156 @@
+/* Variable class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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);
+
+} // 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 the <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);
+
+ //! 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;
+ };
+
+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;
+
+ //! The default output function.
+ static void default_output_function(std::ostream& s, const Variable& v);
+};
+
+#include "Variable.inlines.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! An std::set containing variables in increasing order of dimension index.
+/*! \ingroup PPL_CXX_interface */
+typedef std::set<Variable, Variable::Compare> Variables_Set;
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Variable_defs_hh)
diff --git a/src/Variable.inlines.hh b/src/Variable.inlines.hh
new file mode 100644
index 0000000..7be957c
--- /dev/null
+++ b/src/Variable.inlines.hh
@@ -0,0 +1,88 @@
+/* Variable class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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);
+}
+
+} // 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..58d4a05
--- /dev/null
+++ b/src/Variable.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/Widening_Function.defs.hh b/src/Widening_Function.defs.hh
new file mode 100644
index 0000000..4b95190
--- /dev/null
+++ b/src/Widening_Function.defs.hh
@@ -0,0 +1,126 @@
+/* Widening_Function class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+ //! The (parametric) type of a widening method.
+ typedef void (PH::* Widening_Method)(const PH&, 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()(PH& x, const PH& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH, typename CS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+ //! The (parametric) type of a limited widening method.
+ typedef void (PH::* Limited_Widening_Method)(const PH&,
+ const CS&,
+ unsigned*);
+
+ //! Constructor.
+ /*!
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+ */
+ Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CS& 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()(PH& x, const PH& 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 CS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+ \relates Polyhedra_Powerset
+
+ \param wm
+ The widening method.
+*/
+template <typename PH>
+Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+ \relates Polyhedra_Powerset
+
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+*/
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+ const CS& 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..33d254d
--- /dev/null
+++ b/src/Widening_Function.inlines.hh
@@ -0,0 +1,74 @@
+/* Widening_Function class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Widening_Function_inlines_hh
+#define PPL_Widening_Function_inlines_hh 1
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+Widening_Function<PH>::Widening_Function(Widening_Method wm)
+ : w_method(wm) {
+}
+
+template <typename PH>
+inline void
+Widening_Function<PH>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+ (x.*w_method)(y, tp);
+}
+
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CS& cs)
+ : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PH, typename CS>
+inline void
+Limited_Widening_Function<PH, CS>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+ (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) {
+ return Widening_Function<PH>(wm);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH, typename CS>
+inline Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+ const CS& cs) {
+ return Limited_Widening_Function<PH, CS>(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..2bc68b8
--- /dev/null
+++ b/src/Widening_Function.types.hh
@@ -0,0 +1,25 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 PH>
+class Widening_Function;
+
+template <typename PH, typename CS>
+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..37f0eca
--- /dev/null
+++ b/src/algorithms.hh
@@ -0,0 +1,71 @@
+/* A collection of useful convex polyhedra algorithms: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_algorithms_hh
+#define PPL_algorithms_hh 1
+
+#include "NNC_Polyhedron.defs.hh"
+#include "Polyhedra_Powerset.defs.hh"
+#include <utility>
+#include <cassert>
+
+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 // 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+ PH phull = p;
+ NNC_Polyhedron nnc_p(p);
+ phull.poly_hull_assign(q);
+ std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+ partition = linear_partition(q, phull);
+ const Polyhedra_Powerset<NNC_Polyhedron>& s = partition.second;
+ typedef Polyhedra_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->element()))
+ return false;
+ p = phull;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_algorithms_hh)
diff --git a/src/checked.cc b/src/checked.cc
new file mode 100644
index 0000000..bb79ec3
--- /dev/null
+++ b/src/checked.cc
@@ -0,0 +1,375 @@
+/* Helper functions for checked numbers
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "checked.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+//! Holds the precision parameter used for rational sqrt calculations.
+unsigned long rational_sqrt_precision_parameter;
+
+struct number_struct {
+ unsigned int base;
+ bool neg_mantissa;
+ bool neg_exponent;
+ std::string mantissa;
+ 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(int c, int base = 10) {
+ if (c >= '0' && c < '0' + (base > 10 ? 10 : base))
+ return c - '0';
+ if (base > 10) {
+ base -= 10;
+ if (c >= 'A' && c < 'A' + base)
+ return c - 'A' + 10;
+ if (c >= 'a' && c < 'a' + base)
+ return c - 'a' + 10;
+ }
+ return -1;
+}
+
+/*! \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 > ULONG_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 num, returning the
+ appropriate Result value.
+*/
+Result
+parse_number_part(std::istream& is, number_struct& num) {
+ enum { BASE, INTEGER, FRACTIONAL, EXPONENT } state = BASE;
+ unsigned long max_exp_div;
+ int max_exp_rem;
+ bool empty_exponent = true;
+ bool empty_mantissa = true;
+ long exponent_offset = 0;
+ num.base = 10;
+ num.neg_mantissa = false;
+ num.neg_exponent = false;
+ num.mantissa.erase();
+ num.exponent = 0;
+ int c;
+ do {
+ c = is.get();
+ } while (isspace(c));
+ switch (c) {
+ case '-':
+ num.neg_mantissa = true;
+ // Fall through.
+ case '+':
+ c = is.get();
+ if (c == 'i' || c == 'I')
+ goto inf;
+ break;
+ case 'n':
+ case 'N':
+ c = is.get();
+ if (c != 'a' && c != 'A')
+ goto error;
+ c = is.get();
+ if (c != 'n' && c != 'N')
+ goto error;
+ return VC_NAN;
+ inf:
+ case 'i':
+ case 'I':
+ c = is.get();
+ if (c != 'n' && c != 'n')
+ goto error;
+ c = is.get();
+ if (c != 'f' && c != 'F')
+ goto error;
+ return num.neg_mantissa ? VC_MINUS_INFINITY : VC_PLUS_INFINITY;
+ }
+ if (get_digit(c, 10) < 0)
+ goto error;
+ if (c == '0') {
+ int d = is.get();
+ if (d == 'x' || d == 'X') {
+ num.base = 16;
+ state = INTEGER;
+ c = is.get();
+ }
+ else {
+ c = d;
+ empty_mantissa = false;
+ }
+ }
+ else {
+ num.mantissa += (char) c;
+ empty_mantissa = false;
+ c = is.get();
+ }
+ while (true) {
+ switch (state) {
+ case BASE:
+ if (get_digit(c, 10) >= 0) {
+ if (c != '0' || !num.mantissa.empty())
+ num.mantissa += (char) c;
+ empty_mantissa = false;
+ break;
+ }
+ if (c == '^') {
+ c = is.get();
+ if (c != '^')
+ goto error;
+ std::string::const_iterator i;
+ num.base = 0;
+ for (i = num.mantissa.begin(); i != num.mantissa.end(); i++) {
+ num.base = num.base * 10 + (*i - '0');
+ if (num.base > 36)
+ goto error;
+ }
+ if (num.base < 2)
+ goto error;
+ num.mantissa.erase();
+ empty_mantissa = true;
+ state = INTEGER;
+ break;
+ }
+ goto integer;
+ case INTEGER:
+ if (get_digit(c, num.base) >= 0) {
+ if (c != '0' || !num.mantissa.empty())
+ num.mantissa += (char) c;
+ empty_mantissa = false;
+ break;
+ }
+ integer:
+ if (c == '.') {
+ state = FRACTIONAL;
+ break;
+ }
+ goto fractional;
+ case FRACTIONAL:
+ if (get_digit(c, num.base) >= 0) {
+ exponent_offset--;
+ if (c != '0' || !num.mantissa.empty())
+ num.mantissa += (char) c;
+ empty_mantissa = false;
+ break;
+ }
+ fractional:
+ if (empty_mantissa)
+ goto error;
+ if (c == 'e' || c == 'E')
+ goto exp;
+ if (c == '*') {
+ c = is.get();
+ if (c != '^')
+ goto error;
+ exp:
+ state = EXPONENT;
+ max_exp_div = LONG_MAX / num.base;
+ max_exp_rem = LONG_MAX % num.base;
+ c = is.get();
+ if (c == '-') {
+ num.neg_exponent = true;
+ break;
+ }
+ if (c == '+')
+ break;
+ continue;
+ }
+ goto ok;
+ case EXPONENT:
+ int d = get_digit(c, 10);
+ if (d >= 0) {
+ empty_exponent = false;
+ if (num.exponent > max_exp_div
+ || (num.exponent == max_exp_div && d > max_exp_rem))
+ return V_CVT_STR_UNK;
+ num.exponent = num.exponent * 10 + d;
+ break;
+ }
+ if (empty_exponent)
+ goto error;
+ goto ok;
+ }
+ c = is.get();
+ }
+
+ {
+ ok:
+ is.unget();
+ unsigned int n = num.mantissa.size();
+ while (n > 0 && num.mantissa[n - 1] == '0') {
+ --n;
+ exponent_offset++;
+ }
+ num.mantissa.erase(n);
+ bool neg;
+ if (exponent_offset < 0) {
+ neg = true;
+ exponent_offset = -exponent_offset;
+ }
+ else
+ neg = false;
+ sum_sign(num.neg_exponent, num.exponent,
+ neg, exponent_offset);
+ return V_EQ;
+ }
+
+ error:
+ is.unget();
+ return V_CVT_STR_UNK;
+}
+
+/* \brief
+ Reads a number from \p is writing it into \p num, the numerator,
+ and \p den, the denominator; the appropriate Result value is
+ returned.
+*/
+Result
+parse_number(std::istream& is, number_struct& num, number_struct& den) {
+ // Read the numerator.
+ Result r = parse_number_part(is, num);
+ if (r != V_EQ)
+ return r;
+ if (is.get() != '/') {
+ is.unget();
+ den.base = 0;
+ return r;
+ }
+ // Read the denominator.
+ r = parse_number_part(is, den);
+ if (r != V_EQ)
+ return V_CVT_STR_UNK;
+ if (num.base == den.base) {
+ if (sum_sign(num.neg_exponent, num.exponent,
+ !den.neg_exponent, den.exponent)) {
+ if (num.neg_exponent) {
+ den.neg_exponent = false;
+ den.exponent = num.exponent;
+ num.exponent = 0;
+ }
+ else
+ den.exponent = 0;
+ }
+ }
+ return V_EQ;
+}
+
+
+Result
+input_mpq(mpq_class& to, std::istream& is) {
+ number_struct num_struct;
+ number_struct den_struct;
+ Result r = parse_number(is, num_struct, den_struct);
+ if (r != V_EQ)
+ return r;
+ if (den_struct.base && den_struct.mantissa.empty())
+ return VC_NAN;
+ if (num_struct.mantissa.empty()) {
+ to = 0;
+ return V_EQ;
+ }
+ mpz_ptr num = to.get_num().get_mpz_t();
+ mpz_ptr den = to.get_den().get_mpz_t();
+ mpz_set_str(num, num_struct.mantissa.c_str(), num_struct.base);
+ if (den_struct.base) {
+ if (num_struct.neg_mantissa ^ den_struct.neg_mantissa)
+ mpz_neg(num, num);
+ mpz_set_str(den, den_struct.mantissa.c_str(), den_struct.base);
+ if (num_struct.exponent || den_struct.exponent) {
+ // Multiply the exponents into the numerator and denominator.
+ mpz_t z;
+ mpz_init(z);
+ if (num_struct.exponent) {
+ mpz_ui_pow_ui(z, num_struct.base, num_struct.exponent);
+ if (num_struct.neg_exponent)
+ mpz_mul(den, den, z);
+ else
+ mpz_mul(num, num, z);
+ }
+ if (den_struct.exponent) {
+ mpz_ui_pow_ui(z, den_struct.base, den_struct.exponent);
+ if (den_struct.neg_exponent)
+ mpz_mul(num, num, z);
+ else
+ mpz_mul(den, den, z);
+ }
+ mpz_clear(z);
+ }
+ }
+ else {
+ if (num_struct.neg_mantissa)
+ mpz_neg(num, num);
+ if (num_struct.exponent) {
+ if (num_struct.neg_exponent) {
+ // Add the negative exponent as a denominator.
+ mpz_ui_pow_ui(den, num_struct.base, num_struct.exponent);
+ goto end;
+ }
+ // Multiply the exponent into the numerator.
+ mpz_t z;
+ mpz_init(z);
+ mpz_ui_pow_ui(z, num_struct.base, num_struct.exponent);
+ mpz_mul(num, num, z);
+ mpz_clear(z);
+ }
+ mpz_set_ui(den, 1);
+ return V_EQ;
+ }
+ end:
+ // GMP operators require rationals in canonical form.
+ to.canonicalize();
+ return V_EQ;
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
diff --git a/src/checked.defs.hh b/src/checked.defs.hh
new file mode 100644
index 0000000..47ae3a3
--- /dev/null
+++ b/src/checked.defs.hh
@@ -0,0 +1,392 @@
+/* Abstract checked arithmetic function container
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_defs_hh
+#define PPL_checked_defs_hh 1
+
+#include <iostream>
+#include <gmpxx.h>
+#include "Rounding_Dir.defs.hh"
+#include "Numeric_Format.defs.hh"
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Check_Overflow_Policy {
+ static const int check_overflow = 1;
+ static const int check_inf_add_inf = 0;
+ static const int check_inf_sub_inf = 0;
+ static const int check_inf_mul_zero = 0;
+ static const int check_div_zero = 0;
+ static const int check_inf_div_inf = 0;
+ static const int check_inf_mod = 0;
+ static const int check_sqrt_neg = 0;
+ static const int handle_nan = 0;
+ static const int handle_infinity = 0;
+ static const int convertible = 1;
+ static const int fpu_check_inexact = 0;
+ static const int check_nan_args = 1;
+};
+
+// 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 FUNCTION_CLASS(name) name ## _function_struct
+
+#define DECLARE_FUN1_0_0(name, ret_type, qual, type) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg); \
+}
+
+#define DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1); \
+}
+
+#define DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_0_3(name, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2, a3); \
+}
+
+#define DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1); \
+}
+
+#define DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(b1, b2, arg, a1, a2); \
+}
+
+#define DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2); \
+}
+
+#define DECLARE_FUN2_0_1(name, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1); \
+}
+
+#define DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1, a2); \
+}
+
+#define DECLARE_FUN3_0_1(name, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy, typename type1, typename type2, typename type3> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2, typename type3> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, qual3 type3& arg3, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
+}
+
+#define DECLARE_FUN5_0_1(name, ret_type, \
+ qual1, type1, qual2, type2, qual3, type3, \
+ qual4, type4, qual5, type5, \
+ after1) \
+template <typename Policy, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \
+ qual3 type3& arg3, qual4 type4& arg4, \
+ qual5 type5& arg5, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2, type3, type4, type5> \
+ ::function(arg1, arg2, arg3, arg4, arg5, a1); \
+}
+
+#define SPECIALIZE_FUN1_0_0(name, suf, ret_type, qual, type) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg) { \
+ return name ## _ ## suf<Policy>(arg); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_0_1(name, suf, ret_type, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_0_2(name, suf, ret_type, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(arg, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_0_3(name, suf, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+ return name ## _ ## suf<Policy>(arg, a1, a2, a3); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_1_1(name, suf, ret_type, before1, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(before1 b1, qual type& arg, after1 a1) { \
+ return name ## _ ## suf<Policy>(b1, arg, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_1_2(name, suf, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(b1, arg, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_2_2(name, suf, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(b1, b2, arg, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN2_0_0(name, suf, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+ static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2) { \
+ return name ## _ ## suf<Policy>(arg1, arg2); \
+ } \
+};
+
+#define SPECIALIZE_FUN2_0_1(name, suf, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+ static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN2_0_2(name, suf, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+ static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN3_0_1(name, suf, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name) <Policy, type1, type2, type3> { \
+ static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, arg3, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN5_0_1(name, suf, ret_type, \
+ qual1, type1, qual2, type2, qual3, type3, \
+ qual4, type4, qual5, type5, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name) <Policy, \
+ type1, type2, type3, type4, type5> { \
+ static inline Result \
+ function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, \
+ qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, arg3, arg4, arg5, a1); \
+ } \
+};
+
+#define nonconst
+
+#define SPECIALIZE_COPY(suf, Type) \
+ SPECIALIZE_FUN2_0_0(copy, suf, void, nonconst, Type, const, Type)
+#define SPECIALIZE_SGN(suf, From) \
+ SPECIALIZE_FUN1_0_0(sgn, suf, Result, const, From)
+#define SPECIALIZE_CMP(suf, Type1, Type2) \
+ SPECIALIZE_FUN2_0_0(cmp, suf, Result, const, Type1, const, Type2)
+#define SPECIALIZE_SET_SPECIAL(suf, Type) \
+ SPECIALIZE_FUN1_0_1(set_special, suf, Result, nonconst, Type, Result)
+#define SPECIALIZE_CLASSIFY(suf, Type) \
+ SPECIALIZE_FUN1_0_3(classify, suf, Result, const, Type, bool, bool, bool)
+#define SPECIALIZE_IS_NAN(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_nan, suf, bool, const, Type)
+#define SPECIALIZE_IS_MINF(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_minf, suf, bool, const, Type)
+#define SPECIALIZE_IS_PINF(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_pinf, suf, bool, const, Type)
+#define SPECIALIZE_IS_INT(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_int, suf, bool, const, Type)
+#define SPECIALIZE_CONSTRUCT(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(construct, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ASSIGN(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(assign, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_NEG(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(neg, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ABS(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(abs, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_SQRT(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(sqrt, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ADD(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(add, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(sub, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_DIV(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(div, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_REM(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(rem, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL2EXP(suf, To, From) \
+ SPECIALIZE_FUN2_0_2(mul2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_DIV2EXP(suf, To, From) \
+ SPECIALIZE_FUN2_0_2(div2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_ADD_MUL(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(add_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB_MUL(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(sub_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCD(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(gcd, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCDEXT(suf, To1, From1, From2, To2, To3) \
+ SPECIALIZE_FUN5_0_1(gcdext, suf, Result, nonconst, To1, \
+ const, From1, const, From2, nonconst, To2, nonconst, To3, Rounding_Dir)
+#define SPECIALIZE_LCM(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(lcm, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_INPUT(suf, Type) \
+ SPECIALIZE_FUN1_0_2(input, suf, Result, nonconst, Type, std::istream&, Rounding_Dir)
+#define SPECIALIZE_OUTPUT(suf, Type) \
+ SPECIALIZE_FUN1_1_2(output, suf, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+
+DECLARE_FUN2_0_0(copy, void, nonconst, Type1, const, Type2)
+DECLARE_FUN1_0_0(sgn, Result, const, From)
+DECLARE_FUN2_0_0(cmp, Result, const, Type1, const, Type2)
+DECLARE_FUN1_0_1(set_special, Result, nonconst, Type, Result)
+DECLARE_FUN1_0_3(classify, Result, const, Type, bool, bool, bool)
+DECLARE_FUN1_0_0(is_nan, bool, const, Type)
+DECLARE_FUN1_0_0(is_minf, bool, const, Type)
+DECLARE_FUN1_0_0(is_pinf, bool, const, Type)
+DECLARE_FUN1_0_0(is_int, bool, const, Type)
+DECLARE_FUN2_0_1(construct, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(assign, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(neg, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(abs, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(sqrt, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN3_0_1(add, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(mul, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(div, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(rem, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN2_0_2(mul2exp, Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN2_0_2(div2exp, Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN3_0_1(add_mul, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub_mul, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(gcd, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN5_0_1(gcdext, Result, nonconst, To1, const, From1, const, From2,
+ nonconst, To2, nonconst, To3, Rounding_Dir)
+DECLARE_FUN3_0_1(lcm, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN1_0_2(input, Result, nonconst, Type, std::istream&, Rounding_Dir)
+DECLARE_FUN1_1_2(output, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+};
+
+struct Plus_Infinity {
+};
+
+struct Not_A_Number {
+};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+} // 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"
+
+#endif // !defined(PPL_checked_defs_hh)
diff --git a/src/checked.inlines.hh b/src/checked.inlines.hh
new file mode 100644
index 0000000..e96cd9e
--- /dev/null
+++ b/src/checked.inlines.hh
@@ -0,0 +1,277 @@
+/* Abstract checked arithmetic functions: fall-backs.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "compiler.hh"
+#include "globals.types.hh"
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(construct)<Policy, Type, Type> {
+ static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+ new (&to) Type(from);
+ return V_EQ;
+ }
+};
+
+template <typename Policy, typename To, typename From>
+struct FUNCTION_CLASS(construct) {
+ static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+ new (&to) To();
+ return assign<Policy>(to, from, dir);
+ }
+};
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(assign)<Policy, Type, Type> {
+ static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+ }
+};
+
+template <typename Policy, typename Type>
+inline void
+copy_generic(Type& to, const Type& from) {
+ to = from;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+ if (from < 0)
+ return neg<Policy>(to, from, dir);
+ to = from;
+ return V_EQ;
+}
+
+inline Result
+neg(Result r) {
+ assert(!is_special(r));
+ Result ret = static_cast<Result>(r & V_EQ);
+ if (r & V_LT)
+ ret = static_cast<Result>(ret | V_GT);
+ if (r & V_GT)
+ ret = static_cast<Result>(ret | V_LT);
+ return ret;
+}
+
+inline Result
+add(Result r1, Result r2) {
+ assert(!is_special(r1));
+ assert(!is_special(r2));
+ if (r1 == V_EQ)
+ return r2;
+ if (r2 == V_EQ)
+ return r1;
+ if (((r1 & V_LT) && (r2 & V_GT))
+ || ((r1 & V_GT) && (r2 & V_LT)))
+ return V_LGE;
+ return static_cast<Result>((((r1 & r2) & V_EQ) ? V_EQ : 0) |
+ (r1 & (V_LT | V_GT)));
+}
+
+inline Result
+sub(Result r1, Result r2) {
+ return add(r1, neg(r2));
+}
+
+template <typename Policy, typename To, typename From>
+inline void
+gcd_exact_noabs(To& to, const From& x, const From& y) {
+ To nx = x;
+ To ny = y;
+ To rm;
+ while (ny != 0) {
+ /* The following is derived from the assumption that x % y
+ is always representable. This is true for both native integers
+ and iec559 floating point numbers */
+ rem<Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
+ nx = ny;
+ ny = rm;
+ }
+ to = nx;
+}
+
+template <typename Policy, typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ gcd_exact_noabs<Policy>(to, x, y);
+ return abs<Policy>(to, to, dir);
+}
+
+template <typename Policy, typename To1,
+ typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
+ Rounding_Dir dir) {
+ 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<Policy>(to, x, dir);
+ }
+ }
+
+ s = 1;
+ t = 0;
+ bool negative_x = x < 0;
+ bool negative_y = y < 0;
+
+ Result r;
+ r = abs<Policy>(to, x, dir);
+ if (r != V_EQ)
+ return r;
+
+ From2 ay;
+ r = abs<Policy>(ay, y, dir);
+ if (r != V_EQ)
+ return r;
+
+ // If COPY_GMP is defined then s is favoured 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 behaviour of GMP.
+#define COPY_GMP
+#ifdef COPY_GMP
+ if (to == ay)
+ goto sign_check;
+#endif
+
+ {
+ To2 v1 = 0;
+ To3 v2 = 1;
+ To1 v3 = static_cast<To1>(ay);
+ 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 COPY_GMP
+ sign_check:
+#endif
+ if (negative_x) {
+ r = neg<Policy>(s, s, dir);
+ if (r != V_EQ)
+ return r;
+ }
+ if (negative_y)
+ return neg<Policy>(t, t, dir);
+ return V_EQ;
+}
+
+template <typename 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 nx, ny;
+ Result r;
+ r = abs<Policy>(nx, x, dir);
+ if (r != V_EQ)
+ return r;
+ r = abs<Policy>(ny, y, dir);
+ if (r != V_EQ)
+ return r;
+ To gcd;
+ gcd_exact_noabs<Policy>(gcd, nx, ny);
+ /* The following is derived from the assumption that x / gcd(x, y)
+ is always representable. This is true for both native integers
+ and iec559 floating point numbers */
+ div<Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
+ return mul<Policy>(to, to, ny, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_generic(const Type& x) {
+ if (x > 0)
+ return V_GT;
+ if (x == 0)
+ return V_EQ;
+ return V_LT;
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_generic(const Type& x, const Type& y) {
+ if (x > y)
+ return V_GT;
+ if (x < y)
+ return V_LT;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+ mpq_class q;
+ Result r = input_mpq(q, is);
+ if (r == VC_MINUS_INFINITY)
+ return assign<Policy>(to, MINUS_INFINITY, dir);
+ if (r == VC_PLUS_INFINITY)
+ return assign<Policy>(to, PLUS_INFINITY, dir);
+ if (r == V_EQ)
+ return assign<Policy>(to, q, dir);
+ return set_special<Policy>(to, r);
+}
+
+template <typename T>
+inline memory_size_type
+external_memory_in_bytes(T) {
+ return 0;
+}
+
+template <typename T>
+inline memory_size_type
+total_memory_in_bytes(T& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/checked_ext.inlines.hh b/src/checked_ext.inlines.hh
new file mode 100644
index 0000000..d905724
--- /dev/null
+++ b/src/checked_ext.inlines.hh
@@ -0,0 +1,763 @@
+/* Checked extended arithmetic functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#define handle_ext_natively(T) (Float<T>::fpu_related)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_ext(const Type& x) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x)))
+ return VC_NAN;
+ else if (is_minf<Policy>(x))
+ return V_LT;
+ else if (is_pinf<Policy>(x))
+ return V_GT;
+ else
+ return sgn<Policy>(x);
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+construct_ext(To& to, const From& from, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+ return construct<To_Policy>(to, NOT_A_NUMBER, dir);
+ else if (is_minf<From_Policy>(from))
+ return construct<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return construct<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return construct<To_Policy>(to, from, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+assign_ext(To& to, const From& from, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(from))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return assign<To_Policy>(to, from, 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 (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else {
+ native:
+ return neg<To_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 (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return abs<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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 set_special<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return add<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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 set_special<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_pinf<From2_Policy>(y)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ else if (is_minf<From2_Policy>(y)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return sub<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto pinf;
+ case V_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto minf;
+ case V_GT:
+ goto pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ goto pinf;
+ case V_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ } else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ case V_GT:
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ goto pinf;
+ default:
+ inf_mul_zero:
+ assert(To_Policy::check_inf_mul_zero);
+ return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ native:
+ return mul<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+ || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_minf;
+ case V_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ } else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_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 V_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+ inf_add_inf:
+ return set_special<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ default:
+ inf_mul_zero:
+ assert(To_Policy::check_inf_mul_zero);
+ return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ native:
+ return add_mul<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+ || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_minf;
+ case V_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ } else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_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 V_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+ inf_sub_inf:
+ return set_special<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto minf;
+ default:
+ inf_mul_zero:
+ assert(To_Policy::check_inf_mul_zero);
+ return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ native:
+ return sub_mul<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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 V_LT:
+ goto pinf;
+ case V_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 set_special<To_Policy>(to, V_INF_DIV_INF);
+ }
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case V_LT:
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ case V_GT:
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ default:
+ div_zero:
+ assert(To_Policy::check_div_zero);
+ return set_special<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>(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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+ || is_pinf<From1_Policy>(x)))
+ return set_special<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>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return mul2exp<To_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return div2exp<To_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 (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return set_special<To_Policy>(to, V_SQRT_NEG);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return sqrt<To_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 (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename From1_Policy, typename From2_Policy,
+ typename To2_Policy, typename To3_Policy,
+ typename To1, typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_ext(To1& to, const From1& x, const From2& y,
+ To2& s, To3& t, Rounding_Dir dir) {
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To1_Policy>(to, VC_NAN);
+ 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>(to, x, y, s, t, 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 (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+ || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else
+ return lcm<To_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline Result
+cmp_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return V_UNORD_COMP;
+ else if (is_minf<Policy1>(x))
+ return is_minf<Policy2>(y) ? V_EQ : V_LT;
+ else if (is_pinf<Policy1>(x))
+ return is_pinf<Policy2>(y) ? V_EQ : V_GT;
+ else {
+ if (is_minf<Policy2>(y))
+ return V_GT;
+ if (is_pinf<Policy2>(y))
+ return V_LT;
+ native:
+ return cmp<Policy1>(x, y);
+ }
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, 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 x < y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return false;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return false;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return true;
+ native:
+ return x > y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, 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 x <= y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return false;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return true;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return false;
+ native:
+ return x >= y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, 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);
+ native:
+ return x == y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return true;
+ if (is_minf<Policy1>(x))
+ return !is_minf<Policy2>(y);
+ if (is_pinf<Policy1>(x))
+ return !is_pinf<Policy2>(y);
+ native:
+ return 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 (handle_ext_natively(Type))
+ goto native;
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))) {
+ os << "nan";
+ return VC_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
diff --git a/src/checked_float.inlines.hh b/src/checked_float.inlines.hh
new file mode 100644
index 0000000..63af0ea
--- /dev/null
+++ b/src/checked_float.inlines.hh
@@ -0,0 +1,940 @@
+/* Specialized "checked" functions for native floating-point numbers.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_float_inlines_hh
+#define PPL_checked_float_inlines_hh 1
+
+#include "Float.defs.hh"
+#ifndef __alpha
+#include <cmath>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+fma(float x, float y, float z) {
+#if HAVE_DECL_FMAF && !defined(__alpha)
+ return ::fmaf(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTF
+inline float
+rint(float x) {
+ return ::rintf(x);
+}
+#endif
+
+inline double
+fma(double x, double y, double z) {
+#if HAVE_DECL_FMA && !defined(__alpha)
+ return ::fma(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+inline double
+rint(double x) {
+ return ::rint(x);
+}
+
+inline long double
+fma(long double x, long double y, long double z) {
+#if HAVE_DECL_FMAL && !defined(__alpha)
+ return ::fmal(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTL
+inline long double
+rint(long double x) {
+ return ::rintl(x);
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+ return dir == ROUND_DIRECT || dir == ROUND_IGNORE;
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+ return dir == ROUND_INVERSE;
+}
+
+// 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 float
+limit_precision(float v) {
+ volatile float x = v;
+ return x;
+}
+
+inline double
+limit_precision(double v) {
+ volatile double x = v;
+ return x;
+}
+
+inline long double
+limit_precision(long double v) {
+#if __GNUC__ >= 4
+ return v;
+#else
+ // Not really needed for floating point operations done with the
+ // maximum available precision, but this avoids a bug in GCC 3.4.3
+ // that causes excessive optimization compiling -(-a * b).
+ // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21032
+ // and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21067.
+ volatile long double x = v;
+ return x;
+#endif
+}
+
+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) && f.u.binary.is_nan())
+ return VC_NAN;
+ if (inf) {
+ int i = f.u.binary.is_inf();
+ if (i < 0)
+ return VC_MINUS_INFINITY;
+ if (i > 0)
+ return VC_PLUS_INFINITY;
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return VC_NORMAL;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_nan();
+}
+
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_inf() < 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_inf() > 0;
+}
+
+template <typename T>
+inline bool
+is_inf_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_inf() != 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+ return rint(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+set_special_float(T& v, Result r) {
+ switch (classify(r)) {
+ case VC_MINUS_INFINITY:
+ v = -HUGE_VAL;
+ break;
+ case VC_PLUS_INFINITY:
+ v = HUGE_VAL;
+ break;
+ case VC_NAN:
+ v = NAN;
+ break;
+ default:
+ break;
+ }
+ return r;
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+ Float<T> f(v);
+ assert(!f.u.binary.is_nan());
+ assert(f.u.binary.is_inf() >= 0);
+ if (f.u.binary.is_zero() > 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);
+ assert(!f.u.binary.is_nan());
+ assert(f.u.binary.is_inf() <= 0);
+ if (f.u.binary.is_zero() < 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 (dir == ROUND_DOWN) {
+ 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 (dir == ROUND_UP) {
+ succ_float(to);
+ return V_LT;
+ }
+ return V_GT;
+}
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact && dir != ROUND_IGNORE)
+ fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact) {
+ if (!fpu_check_inexact())
+ return V_EQ;
+ switch (dir) {
+ case ROUND_DOWN:
+ return V_GT;
+ case ROUND_UP:
+ return V_LT;
+ default:
+ return V_NE;
+ }
+ }
+ else {
+ switch (dir) {
+ case ROUND_DOWN:
+ return V_GE;
+ case ROUND_UP:
+ return V_LE;
+ default:
+ return V_LGE;
+ }
+ }
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ to = from;
+ return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(-from);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = from;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(From) > sizeof(To))
+ return assign_float_float_inexact<Policy>(to, from, dir);
+ else
+ return assign_float_float_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ to = -from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_add_inf, is_inf_float(x) && x == -y))
+ return V_INF_ADD_INF;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x + y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(-x - y);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x + y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_sub_inf, is_inf_float(x) && x == y))
+ return V_INF_SUB_INF;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x - y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(y - x);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x - y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_mul_zero, (x == 0 && is_inf_float(y)) ||
+ (y == 0 && is_inf_float(x))))
+ return V_INF_MUL_ZERO;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x * y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(x * -y);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x * y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_div_inf, is_inf_float(x) && is_inf_float(y)))
+ return V_INF_DIV_INF;
+ if (CHECK_P(Policy::check_div_zero, y == 0)) {
+ to = NAN;
+ return V_DIV_ZERO;
+ }
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x / y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(x / -y);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x / y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_mod, is_inf_float(x)))
+ return V_INF_MOD;
+ if (CHECK_P(Policy::check_div_zero, y == 0)) {
+ to = NAN;
+ return V_MOD_ZERO;
+ }
+ to = std::fmod(x, y);
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+ return mul<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+ return div<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ to = from < 0 ? -from : from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0)) {
+ to = NAN;
+ return V_SQRT_NEG;
+ }
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = std::sqrt(from);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = std::sqrt(from);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_float(const Type x) {
+ return classify<Policy>(x, false, false, true);
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_float(const Type x, const Type y) {
+ if (x > y)
+ return V_GT;
+ if (x < y)
+ return V_LT;
+ if (x == y)
+ return V_EQ;
+ return V_UNORD_COMP;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_exact(To& to, const From from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = from;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(From) * 8 > Float<To>::Binary::MANTISSA_BITS)
+ return assign_float_int_inexact<Policy>(to, from, dir);
+ else
+ return assign_float_int_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+ switch (dir) {
+ case ROUND_UP:
+ {
+ Float<T> f;
+ f.u.binary.set_max(true);
+ to = f.value();
+ return V_LT;
+ }
+ default:
+ to = -HUGE_VAL;
+ return V_GT;
+ }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+ switch (dir) {
+ case ROUND_DOWN:
+ {
+ Float<T> f;
+ f.u.binary.set_max(false);
+ to = f.value();
+ return V_GT;
+ }
+ default:
+ to = HUGE_VAL;
+ return V_LT;
+ }
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
+{
+ mpz_srcptr from = _from.get_mpz_t();
+ int sign = mpz_sgn(from);
+ if (sign == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ size_t exponent = mpz_sizeinbase(from, 2) - 1;
+ if (exponent > (size_t) Float<T>::Binary::EXPONENT_MAX) {
+ if (sign < 0)
+ return set_neg_overflow_float<Policy>(to, dir);
+ else
+ return set_pos_overflow_float<Policy>(to, dir);
+ }
+ unsigned long zeroes = mpn_scan1(from->_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,
+ exponent - Float<T>::Binary::MANTISSA_BITS);
+ else
+ mpz_mul_2exp(mantissa, from, Float<T>::Binary::MANTISSA_BITS - exponent);
+ Float<T> f(to);
+ f.u.binary.build(sign < 0, mantissa, exponent);
+ mpz_clear(mantissa);
+ to = f.value();
+ if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+ if (sign < 0)
+ return round_lt_float<Policy>(to, dir);
+ else
+ return round_gt_float<Policy>(to, dir);
+ }
+ return V_EQ;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
+{
+ const mpz_class& _num = from.get_num();
+ const mpz_class& _den = from.get_den();
+ if (_den == 1)
+ return assign_float_mpz<Policy>(to, _num, dir);
+ mpz_srcptr num = _num.get_mpz_t();
+ mpz_srcptr den = _den.get_mpz_t();
+ int sign = mpz_sgn(num);
+ signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2);
+ if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+ to = 0;
+ inexact:
+ if (sign < 0)
+ return round_lt_float<Policy>(to, dir);
+ else
+ return round_gt_float<Policy>(to, dir);
+ }
+ if (exponent > (signed int) Float<T>::Binary::EXPONENT_MAX + 1) {
+ overflow:
+ if (sign < 0)
+ return set_neg_overflow_float<Policy>(to, dir);
+ else
+ return set_pos_overflow_float<Policy>(to, dir);
+ }
+ unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+ if (exponent < Float<T>::Binary::EXPONENT_MIN)
+ needed_bits -= Float<T>::Binary::EXPONENT_MIN - exponent;
+ mpz_t mantissa;
+ mpz_init(mantissa);
+ signed long shift = needed_bits - exponent;
+ if (shift > 0) {
+ mpz_mul_2exp(mantissa, num, shift);
+ num = mantissa;
+ }
+ else if (shift < 0) {
+ mpz_mul_2exp(mantissa, den, -shift);
+ den = mantissa;
+ }
+ mpz_t r;
+ mpz_init(r);
+ mpz_tdiv_qr(mantissa, r, num, den);
+ 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_div_2exp(mantissa, mantissa, 1);
+ }
+ else
+ --exponent;
+ if (exponent > (signed int)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(to);
+ f.u.binary.build(sign < 0, mantissa, exponent);
+ mpz_clear(mantissa);
+ to = f.value();
+ if (inexact)
+ goto inexact;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = fma(x, y, to);
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(fma(-x, y, -to));
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = fma(x, y, to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = fma(x, -y, to);
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(fma(x, y, -to));
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = fma(x, -y, to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+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 {
+ int old_precision = os.precision(10000);
+ os << from;
+ os.precision(old_precision);
+ }
+ return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+ to = -HUGE_VAL;
+ return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+ to = HUGE_VAL;
+ return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+ to = NAN;
+ return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_ASSIGN(float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, double)
+SPECIALIZE_ASSIGN(float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, double, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_CLASSIFY(float, float)
+SPECIALIZE_IS_NAN(float, float)
+SPECIALIZE_IS_MINF(float, float)
+SPECIALIZE_IS_PINF(float, float)
+SPECIALIZE_SET_SPECIAL(float, float)
+SPECIALIZE_ASSIGN(float_int, float, signed char)
+SPECIALIZE_ASSIGN(float_int, float, signed short)
+SPECIALIZE_ASSIGN(float_int, float, signed int)
+SPECIALIZE_ASSIGN(float_int, float, signed long)
+SPECIALIZE_ASSIGN(float_int, float, signed long long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned char)
+SPECIALIZE_ASSIGN(float_int, float, unsigned short)
+SPECIALIZE_ASSIGN(float_int, float, unsigned int)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, float, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, float, mpq_class)
+SPECIALIZE_COPY(generic, float)
+SPECIALIZE_IS_INT(float, float)
+SPECIALIZE_ASSIGN(float_minf, float, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, float, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, float, Not_A_Number)
+SPECIALIZE_NEG(float, float, float)
+SPECIALIZE_ABS(float, float, float)
+SPECIALIZE_ADD(float, float, float, float)
+SPECIALIZE_SUB(float, float, float, float)
+SPECIALIZE_MUL(float, float, float, float)
+SPECIALIZE_DIV(float, float, float, float)
+SPECIALIZE_REM(float, float, float, float)
+SPECIALIZE_MUL2EXP(float, float, float)
+SPECIALIZE_DIV2EXP(float, float, float)
+SPECIALIZE_SQRT(float, float, float)
+SPECIALIZE_GCD(exact, float, float, float)
+SPECIALIZE_GCDEXT(exact, float, float, float, float, float)
+SPECIALIZE_LCM(gcd_exact, float, float, float)
+SPECIALIZE_SGN(float, float)
+SPECIALIZE_CMP(float, float, float)
+SPECIALIZE_ADD_MUL(float, float, float, float)
+SPECIALIZE_SUB_MUL(float, float, float, float)
+SPECIALIZE_INPUT(generic, float)
+SPECIALIZE_OUTPUT(float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_CLASSIFY(float, double)
+SPECIALIZE_IS_NAN(float, double)
+SPECIALIZE_IS_MINF(float, double)
+SPECIALIZE_IS_PINF(float, double)
+SPECIALIZE_SET_SPECIAL(float, double)
+SPECIALIZE_ASSIGN(float_int, double, signed char)
+SPECIALIZE_ASSIGN(float_int, double, signed short)
+SPECIALIZE_ASSIGN(float_int, double, signed int)
+SPECIALIZE_ASSIGN(float_int, double, signed long)
+SPECIALIZE_ASSIGN(float_int, double, signed long long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, double, mpq_class)
+SPECIALIZE_COPY(generic, double)
+SPECIALIZE_IS_INT(float, double)
+SPECIALIZE_ASSIGN(float_minf, double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, double, Not_A_Number)
+SPECIALIZE_NEG(float, double, double)
+SPECIALIZE_ABS(float, double, double)
+SPECIALIZE_ADD(float, double, double, double)
+SPECIALIZE_SUB(float, double, double, double)
+SPECIALIZE_MUL(float, double, double, double)
+SPECIALIZE_DIV(float, double, double, double)
+SPECIALIZE_REM(float, double, double, double)
+SPECIALIZE_MUL2EXP(float, double, double)
+SPECIALIZE_DIV2EXP(float, double, double)
+SPECIALIZE_SQRT(float, double, double)
+SPECIALIZE_GCD(exact, double, double, double)
+SPECIALIZE_GCDEXT(exact, double, double, double, double, double)
+SPECIALIZE_LCM(gcd_exact, double, double, double)
+SPECIALIZE_SGN(float, double)
+SPECIALIZE_CMP(float, double, double)
+SPECIALIZE_ADD_MUL(float, double, double, double)
+SPECIALIZE_SUB_MUL(float, double, double, double)
+SPECIALIZE_INPUT(generic, double)
+SPECIALIZE_OUTPUT(float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_CLASSIFY(float, long double)
+SPECIALIZE_IS_NAN(float, long double)
+SPECIALIZE_IS_MINF(float, long double)
+SPECIALIZE_IS_PINF(float, long double)
+SPECIALIZE_SET_SPECIAL(float, long double)
+SPECIALIZE_ASSIGN(float_int, long double, signed char)
+SPECIALIZE_ASSIGN(float_int, long double, signed short)
+SPECIALIZE_ASSIGN(float_int, long double, signed int)
+SPECIALIZE_ASSIGN(float_int, long double, signed long)
+SPECIALIZE_ASSIGN(float_int, long double, signed long long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, long double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, long double, mpq_class)
+SPECIALIZE_COPY(generic, long double)
+SPECIALIZE_IS_INT(float, long double)
+SPECIALIZE_ASSIGN(float_minf, long double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, long double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, long double, Not_A_Number)
+SPECIALIZE_NEG(float, long double, long double)
+SPECIALIZE_ABS(float, long double, long double)
+SPECIALIZE_ADD(float, long double, long double, long double)
+SPECIALIZE_SUB(float, long double, long double, long double)
+SPECIALIZE_MUL(float, long double, long double, long double)
+SPECIALIZE_DIV(float, long double, long double, long double)
+SPECIALIZE_REM(float, long double, long double, long double)
+SPECIALIZE_MUL2EXP(float, long double, long double)
+SPECIALIZE_DIV2EXP(float, long double, long double)
+SPECIALIZE_SQRT(float, long double, long double)
+SPECIALIZE_GCD(exact, long double, long double, long double)
+SPECIALIZE_GCDEXT(exact, long double, long double, long double,
+ long double, long double)
+SPECIALIZE_LCM(gcd_exact, long double, long double, long double)
+SPECIALIZE_SGN(float, long double)
+SPECIALIZE_CMP(float, long double, long double)
+SPECIALIZE_ADD_MUL(float, long double, long double, long double)
+SPECIALIZE_SUB_MUL(float, long double, long double, long double)
+SPECIALIZE_INPUT(generic, long double)
+SPECIALIZE_OUTPUT(float, long double)
+#endif
+
+} // namespace Checked
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_checked_int_inlines_hh)
diff --git a/src/checked_int.inlines.hh b/src/checked_int.inlines.hh
new file mode 100644
index 0000000..303d5b3
--- /dev/null
+++ b/src/checked_int.inlines.hh
@@ -0,0 +1,1537 @@
+/* Specialized "checked" functions for native integer numbers.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_int_inlines_hh
+#define PPL_checked_int_inlines_hh 1
+
+#include "Limits.hh"
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if !HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+ static const Type plus_infinity = Limits<Type>::max;
+ static const Type minus_infinity = (Limits<Type>::min >= 0
+ ? Limits<Type>::max - 1
+ : Limits<Type>::min);
+ static const Type not_a_number = (Limits<Type>::min >= 0
+ ? Limits<Type>::max - Policy::handle_infinity * 2
+ : Limits<Type>::min + Policy::handle_infinity);
+ static const Type min = (Limits<Type>::min
+ + (Limits<Type>::min >= 0 ? 0
+ : (Policy::handle_infinity + Policy::handle_nan)));
+ static const Type max = (Limits<Type>::max
+ - (Limits<Type>::min >= 0
+ ? (2 * Policy::handle_infinity + Policy::handle_nan)
+ : Policy::handle_infinity));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_UP) {
+ to = Extended_Int<Policy, To>::min;
+ return V_LT;
+ }
+ else {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT;
+ }
+ return V_NEG_OVERFLOW;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ to = Extended_Int<Policy, To>::max;
+ return V_GT;
+ }
+ else {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT;
+ }
+ return V_POS_OVERFLOW;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ 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 (dir == ROUND_UP) {
+ to++;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ if (to == Extended_Int<Policy, To>::min) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT;
+ }
+ return V_NEG_OVERFLOW;
+ } else {
+ to--;
+ return V_GT;
+ }
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_UP) {
+ if (to == Extended_Int<Policy, To>::max) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT;
+ }
+ return V_POS_OVERFLOW;
+ } else {
+ to++;
+ return V_LT;
+ }
+ }
+ return V_GT;
+}
+
+SPECIALIZE_COPY(generic, signed char)
+SPECIALIZE_COPY(generic, signed short)
+SPECIALIZE_COPY(generic, signed int)
+SPECIALIZE_COPY(generic, signed long)
+SPECIALIZE_COPY(generic, signed long long)
+SPECIALIZE_COPY(generic, unsigned char)
+SPECIALIZE_COPY(generic, unsigned short)
+SPECIALIZE_COPY(generic, unsigned int)
+SPECIALIZE_COPY(generic, unsigned long)
+SPECIALIZE_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::handle_nan
+ && (nan || sign)
+ && v == Extended_Int<Policy, Type>::not_a_number)
+ return VC_NAN;
+ if (!inf & !sign)
+ return VC_NORMAL;
+ if (Policy::handle_infinity) {
+ if (v == Extended_Int<Policy, Type>::minus_infinity)
+ return inf ? VC_MINUS_INFINITY : V_LT;
+ if (v == Extended_Int<Policy, Type>::plus_infinity)
+ return inf ? VC_PLUS_INFINITY : V_GT;
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(int, signed char)
+SPECIALIZE_CLASSIFY(int, signed short)
+SPECIALIZE_CLASSIFY(int, signed int)
+SPECIALIZE_CLASSIFY(int, signed long)
+SPECIALIZE_CLASSIFY(int, signed long long)
+SPECIALIZE_CLASSIFY(int, unsigned char)
+SPECIALIZE_CLASSIFY(int, unsigned short)
+SPECIALIZE_CLASSIFY(int, unsigned int)
+SPECIALIZE_CLASSIFY(int, unsigned long)
+SPECIALIZE_CLASSIFY(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+ return Policy::handle_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+SPECIALIZE_IS_NAN(int, signed char)
+SPECIALIZE_IS_NAN(int, signed short)
+SPECIALIZE_IS_NAN(int, signed int)
+SPECIALIZE_IS_NAN(int, signed long)
+SPECIALIZE_IS_NAN(int, signed long long)
+SPECIALIZE_IS_NAN(int, unsigned char)
+SPECIALIZE_IS_NAN(int, unsigned short)
+SPECIALIZE_IS_NAN(int, unsigned int)
+SPECIALIZE_IS_NAN(int, unsigned long)
+SPECIALIZE_IS_NAN(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+ return Policy::handle_infinity
+ && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+SPECIALIZE_IS_MINF(int, signed char)
+SPECIALIZE_IS_MINF(int, signed short)
+SPECIALIZE_IS_MINF(int, signed int)
+SPECIALIZE_IS_MINF(int, signed long)
+SPECIALIZE_IS_MINF(int, signed long long)
+SPECIALIZE_IS_MINF(int, unsigned char)
+SPECIALIZE_IS_MINF(int, unsigned short)
+SPECIALIZE_IS_MINF(int, unsigned int)
+SPECIALIZE_IS_MINF(int, unsigned long)
+SPECIALIZE_IS_MINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+ return Policy::handle_infinity
+ && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+SPECIALIZE_IS_PINF(int, signed char)
+SPECIALIZE_IS_PINF(int, signed short)
+SPECIALIZE_IS_PINF(int, signed int)
+SPECIALIZE_IS_PINF(int, signed long)
+SPECIALIZE_IS_PINF(int, signed long long)
+SPECIALIZE_IS_PINF(int, unsigned char)
+SPECIALIZE_IS_PINF(int, unsigned short)
+SPECIALIZE_IS_PINF(int, unsigned int)
+SPECIALIZE_IS_PINF(int, unsigned long)
+SPECIALIZE_IS_PINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+ return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(int, signed char)
+SPECIALIZE_IS_INT(int, signed short)
+SPECIALIZE_IS_INT(int, signed int)
+SPECIALIZE_IS_INT(int, signed long)
+SPECIALIZE_IS_INT(int, signed long long)
+SPECIALIZE_IS_INT(int, unsigned char)
+SPECIALIZE_IS_INT(int, unsigned short)
+SPECIALIZE_IS_INT(int, unsigned int)
+SPECIALIZE_IS_INT(int, unsigned long)
+SPECIALIZE_IS_INT(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+set_special_int(Type& v, Result r) {
+ Result t = classify(r);
+ if (Policy::handle_nan && t == VC_NAN)
+ v = Extended_Int<Policy, Type>::not_a_number;
+ else if (Policy::handle_infinity) {
+ switch (t) {
+ case VC_MINUS_INFINITY:
+ v = Extended_Int<Policy, Type>::minus_infinity;
+ break;
+ case VC_PLUS_INFINITY:
+ v = Extended_Int<Policy, Type>::plus_infinity;
+ break;
+ default:
+ break;
+ }
+ }
+ return r;
+}
+
+SPECIALIZE_SET_SPECIAL(int, signed char)
+SPECIALIZE_SET_SPECIAL(int, signed short)
+SPECIALIZE_SET_SPECIAL(int, signed int)
+SPECIALIZE_SET_SPECIAL(int, signed long)
+SPECIALIZE_SET_SPECIAL(int, signed long long)
+SPECIALIZE_SET_SPECIAL(int, unsigned char)
+SPECIALIZE_SET_SPECIAL(int, unsigned short)
+SPECIALIZE_SET_SPECIAL(int, unsigned int)
+SPECIALIZE_SET_SPECIAL(int, unsigned long)
+SPECIALIZE_SET_SPECIAL(int, unsigned long long)
+
+template <typename 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)) {
+ if (CHECK_P(Policy::check_overflow,
+ from < static_cast<From>(Extended_Int<Policy, To>::min)))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (CHECK_P(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+template <typename 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(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_overflow, from < 0))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (sizeof(To) < sizeof(From)) {
+ if (CHECK_P(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+template <typename 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)) {
+ if (CHECK_P(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+
+#define ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Larger, Smaller)
+
+#define ASSIGN_SIGNED(Type) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Type, Type)
+#define ASSIGN_UNSIGNED(Type) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Type, Type)
+
+ASSIGN_SIGNED(signed char)
+ASSIGN_SIGNED(signed short)
+ASSIGN_SIGNED(signed int)
+ASSIGN_SIGNED(signed long)
+ASSIGN_SIGNED(signed long long)
+ASSIGN_UNSIGNED(unsigned char)
+ASSIGN_UNSIGNED(unsigned short)
+ASSIGN_UNSIGNED(unsigned int)
+ASSIGN_UNSIGNED(unsigned long)
+ASSIGN_UNSIGNED(unsigned long long)
+
+ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_overflow, (from < Extended_Int<Policy, To>::min)))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (CHECK_P(Policy::check_overflow, (from > Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = static_cast<To>(from);
+ if (dir == ROUND_IGNORE)
+ return V_LGE;
+ if (from < to)
+ return round_lt_int<Policy>(to, dir);
+ else if (from > to)
+ return round_gt_int<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(int_float, signed char, float)
+SPECIALIZE_ASSIGN(int_float, signed short, float)
+SPECIALIZE_ASSIGN(int_float, signed int, float)
+SPECIALIZE_ASSIGN(int_float, signed long, float)
+SPECIALIZE_ASSIGN(int_float, signed long long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned char, float)
+SPECIALIZE_ASSIGN(int_float, unsigned short, float)
+SPECIALIZE_ASSIGN(int_float, unsigned int, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, float)
+
+SPECIALIZE_ASSIGN(int_float, signed char, double)
+SPECIALIZE_ASSIGN(int_float, signed short, double)
+SPECIALIZE_ASSIGN(int_float, signed int, double)
+SPECIALIZE_ASSIGN(int_float, signed long, double)
+SPECIALIZE_ASSIGN(int_float, signed long long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, double)
+
+SPECIALIZE_ASSIGN(int_float, signed char, long double)
+SPECIALIZE_ASSIGN(int_float, signed short, long double)
+SPECIALIZE_ASSIGN(int_float, signed int, long double)
+SPECIALIZE_ASSIGN(int_float, signed long, long double)
+SPECIALIZE_ASSIGN(int_float, signed long long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, long double)
+
+#undef ASSIGN2_SIGNED_SIGNED
+#undef ASSIGN2_UNSIGNED_UNSIGNED
+#undef ASSIGN2_UNSIGNED_SIGNED
+#undef ASSIGN2_SIGNED_UNSIGNED
+
+template <typename 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 (!Policy::check_overflow) {
+ to = from.get_si();
+ return V_EQ;
+ }
+ if (from.fits_slong_p()) {
+ signed long v = from.get_si();
+ if (v < Limits<To>::min)
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (v > Limits<To>::max)
+ return set_pos_overflow_int<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<Policy>(to, v, dir);
+ to = v;
+ return V_EQ;
+ }
+ }
+ }
+ return ::sgn(from) < 0
+ ? set_neg_overflow_int<Policy>(to, dir)
+ : set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(signed_int_mpz, signed char, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed short, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed int, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long long, mpz_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_overflow, ::sgn(from) < 0))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (sizeof(To) <= sizeof(unsigned long)) {
+ if (!Policy::check_overflow) {
+ to = from.get_ui();
+ return V_EQ;
+ }
+ if (from.fits_ulong_p()) {
+ unsigned long v = from.get_ui();
+ if (v > Limits<To>::max)
+ return set_pos_overflow_int<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;
+ else
+ mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+ return V_EQ;
+ }
+ }
+ return set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned char, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned short, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned int, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename 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();
+ mpz_class q;
+ mpz_ptr _q = q.get_mpz_t();
+ if (dir == ROUND_IGNORE) {
+ mpz_tdiv_q(_q, n, d);
+ Result r = assign<Policy>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ return V_LGE;
+ }
+ mpz_t rem;
+ int sign;
+ mpz_init(rem);
+ mpz_tdiv_qr(_q, rem, n, d);
+ sign = mpz_sgn(rem);
+ mpz_clear(rem);
+ Result r = assign<Policy>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ switch (sign) {
+ case -1:
+ return round_lt_int<Policy>(to, dir);
+ case 1:
+ return round_gt_int<Policy>(to, dir);
+ default:
+ return V_EQ;
+ }
+}
+
+SPECIALIZE_ASSIGN(int_mpq, signed char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long long, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_int_minf(To& to, const Minus_Infinity&, Rounding_Dir dir) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_EQ;
+ }
+ if (dir == ROUND_UP) {
+ to = Extended_Int<Policy, To>::min;
+ return V_LT;
+ }
+ return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_pinf(To& to, const Plus_Infinity&, Rounding_Dir dir) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_EQ;
+ }
+ if (dir == ROUND_DOWN) {
+ to = Extended_Int<Policy, To>::max;
+ return V_GT;
+ }
+ return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+ if (Policy::handle_nan) {
+ to = Extended_Int<Policy, To>::not_a_number;
+ return V_EQ;
+ }
+ return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(int_minf, signed char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long long, Minus_Infinity)
+
+SPECIALIZE_ASSIGN(int_pinf, signed char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long long, Plus_Infinity)
+
+SPECIALIZE_ASSIGN(int_nan, signed char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long long, Not_A_Number)
+
+#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 architecture.
+//
+// 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<signed char> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = (LONG_BITS == 64);
+ static const bool use_for_add = (LONG_BITS == 64);
+ static const bool use_for_sub = (LONG_BITS == 64);
+ static const bool 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> {
+ static const bool use_for_neg = (LONG_BITS == 64);
+ static const bool use_for_add = (LONG_BITS == 64);
+ static const bool use_for_sub = (LONG_BITS == 64);
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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 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<Policy>(to, l, dir);
+}
+
+template <typename 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<Policy>(to, l, dir);
+}
+
+template <typename 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<Policy>(to, l, dir);
+}
+
+template <typename 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<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<Policy>(to, from, dir);
+ if (CHECK_P(Policy::check_overflow,
+ (from < -Extended_Int<Policy, Type>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = -from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<Policy>(to, from, dir);
+ if (CHECK_P(Policy::check_overflow, from != 0))
+ return set_neg_overflow_int<Policy>(to, dir);
+ to = from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<Policy>(to, x, y, dir);
+ if (Policy::check_overflow) {
+ if (y >= 0) {
+ if (x > Extended_Int<Policy, Type>::max - y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ else if (x < Extended_Int<Policy, Type>::min - y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<Policy>(to, x, y, dir);
+ if (CHECK_P(Policy::check_overflow,
+ (x > Extended_Int<Policy, Type>::max - y)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<Policy>(to, x, y, dir);
+ if (Policy::check_overflow) {
+ if (y >= 0) {
+ if (x < Extended_Int<Policy, Type>::min + y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ else if (x > Extended_Int<Policy, Type>::max + y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<Policy>(to, x, y, dir);
+ if (CHECK_P(Policy::check_overflow,
+ (x < Extended_Int<Policy, Type>::min + y)))
+ return set_neg_overflow_int<Policy>(to, dir);
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<Policy>(to, x, y, dir);
+ if (!Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (y == -1)
+ return neg_signed_int<Policy>(to, x, dir);
+ if (x >= 0) {
+ if (y > 0) {
+ if (x > Extended_Int<Policy, Type>::max / y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ else {
+ if (x > Extended_Int<Policy, Type>::min / y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ }
+ else {
+ if (y < 0) {
+ if (x < Extended_Int<Policy, Type>::max / y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ else {
+ if (x < Extended_Int<Policy, Type>::min / y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ }
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<Policy>(to, x, y, dir);
+ if (!Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (x > Extended_Int<Policy, Type>::max / y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_div_zero, y == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ if (Policy::check_overflow && y == -1)
+ return neg_signed_int<Policy>(to, x, dir);
+ to = x / y;
+ if (dir == ROUND_IGNORE)
+ return V_LGE;
+ Type m = x % y;
+ if (m < 0)
+ return round_lt_int_no_overflow<Policy>(to, dir);
+ else if (m > 0)
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_div_zero, y == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ to = x / y;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ Type m = x % y;
+ if (m == 0)
+ return V_EQ;
+ return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, y == 0))
+ return set_special<Policy>(to, V_MOD_ZERO);
+ to = x % y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+ to = 0;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (x == 0)
+ return V_EQ;
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ }
+ to = x >> exp;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (x & ((static_cast<Type>(1) << exp) - 1))
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+ zero:
+ to = 0;
+ if (dir == ROUND_IGNORE)
+ return V_LGE;
+ if (x < 0)
+ return round_lt_int_no_overflow<Policy>(to, dir);
+ else if (x > 0)
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+ }
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+ if (x == Limits<Type>::min) {
+ to = -1;
+ return V_EQ;
+ }
+ goto zero;
+ }
+#if 0
+ to = x / (static_cast<Type>(1) << exp);
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ Type r = x % (static_cast<Type>(1) << exp);
+ if (r < 0)
+ return round_lt_int_no_overflow<Policy>(to, dir);
+ else if (r > 0)
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+#else
+ // Faster but compiler implementation dependent (see C++98 5.8.3)
+ to = x >> exp;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (x & ((static_cast<Type>(1) << exp) - 1))
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ return V_EQ;
+#endif
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ if (!Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+ if (x == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ if (x & (((static_cast<Type>(1) << exp) - 1) << (sizeof(Type) * 8 - exp)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ Type n = x << exp;
+ if (n > Extended_Int<Policy, Type>::max)
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = n;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ if (!Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+ if (x < 0)
+ return set_neg_overflow_int<Policy>(to, dir);
+ else if (x > 0)
+ return set_pos_overflow_int<Policy>(to, dir);
+ else {
+ to = 0;
+ return V_EQ;
+ }
+ }
+ Type mask = ((static_cast<Type>(1) << exp) - 1)
+ << (sizeof(Type) * 8 - 1 - exp);
+ Type n;
+ if (x < 0) {
+ if ((x & mask) != mask)
+ return set_neg_overflow_int<Policy>(to, dir);
+ n = x << exp;
+ if (n < Extended_Int<Policy, Type>::min)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ else {
+ if (x & mask)
+ return set_pos_overflow_int<Policy>(to, dir);
+ n = x << exp;
+ if (n > Extended_Int<Policy, Type>::max)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = n;
+ return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrtrem_(Type& q, Type& r, const Type from) {
+ q = 0;
+ r = from;
+ Type t(1);
+ for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) {
+ Type s = q + t;
+ if (s <= r) {
+ r -= s;
+ q = s + t;
+ }
+ q >>= 1;
+ }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ Type rem;
+ isqrtrem_(to, rem, from);
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (rem == 0)
+ return V_EQ;
+ return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+ return set_special<Policy>(to, V_SQRT_NEG);
+ return sqrt_unsigned_int<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<Policy>(z, x, y, dir);
+ switch (r) {
+ case V_NEG_OVERFLOW:
+ case V_LT:
+ if (to <= 0) {
+ to = z;
+ return r;
+ }
+ return set_special<Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+ case V_POS_OVERFLOW:
+ case V_GT:
+ if (to >= 0) {
+ to = z;
+ return r;
+ }
+ return set_special<Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+ default:
+ return add<Policy>(to, to, z, dir);
+ }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<Policy>(z, x, y, dir);
+ switch (r) {
+ case V_NEG_OVERFLOW:
+ case V_LT:
+ if (to >= 0)
+ return set_pos_overflow_int<Policy>(to, dir);
+ return V_UNKNOWN_NEG_OVERFLOW;
+ case V_POS_OVERFLOW:
+ case V_GT:
+ if (to <= 0)
+ return set_neg_overflow_int<Policy>(to, dir);
+ return V_UNKNOWN_POS_OVERFLOW;
+ default:
+ return sub<Policy>(to, to, z, dir);
+ }
+}
+
+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;
+}
+
+SPECIALIZE_NEG(signed_int, signed char, signed char)
+SPECIALIZE_NEG(signed_int, signed short, signed short)
+SPECIALIZE_NEG(signed_int, signed int, signed int)
+SPECIALIZE_NEG(signed_int, signed long, signed long)
+SPECIALIZE_NEG(signed_int, signed long long, signed long long)
+SPECIALIZE_NEG(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_NEG(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_NEG(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_NEG(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_NEG(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD(signed_int, signed char, signed char, signed char)
+SPECIALIZE_ADD(signed_int, signed short, signed short, signed short)
+SPECIALIZE_ADD(signed_int, signed int, signed int, signed int)
+SPECIALIZE_ADD(signed_int, signed long, signed long, signed long)
+SPECIALIZE_ADD(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB(signed_int, signed char, signed char, signed char)
+SPECIALIZE_SUB(signed_int, signed short, signed short, signed short)
+SPECIALIZE_SUB(signed_int, signed int, signed int, signed int)
+SPECIALIZE_SUB(signed_int, signed long, signed long, signed long)
+SPECIALIZE_SUB(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL(signed_int, signed char, signed char, signed char)
+SPECIALIZE_MUL(signed_int, signed short, signed short, signed short)
+SPECIALIZE_MUL(signed_int, signed int, signed int, signed int)
+SPECIALIZE_MUL(signed_int, signed long, signed long, signed long)
+SPECIALIZE_MUL(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_MUL(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_MUL(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_MUL(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_MUL(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_MUL(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV(signed_int, signed char, signed char, signed char)
+SPECIALIZE_DIV(signed_int, signed short, signed short, signed short)
+SPECIALIZE_DIV(signed_int, signed int, signed int, signed int)
+SPECIALIZE_DIV(signed_int, signed long, signed long, signed long)
+SPECIALIZE_DIV(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_DIV(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_DIV(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_DIV(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_DIV(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_DIV(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_REM(int, signed char, signed char, signed char)
+SPECIALIZE_REM(int, signed short, signed short, signed short)
+SPECIALIZE_REM(int, signed int, signed int, signed int)
+SPECIALIZE_REM(int, signed long, signed long, signed long)
+SPECIALIZE_REM(int, signed long long, signed long long, signed long long)
+SPECIALIZE_REM(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_REM(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_REM(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_REM(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_REM(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL2EXP(signed_int, signed char, signed char)
+SPECIALIZE_MUL2EXP(signed_int, signed short, signed short)
+SPECIALIZE_MUL2EXP(signed_int, signed int, signed int)
+SPECIALIZE_MUL2EXP(signed_int, signed long, signed long)
+SPECIALIZE_MUL2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV2EXP(signed_int, signed char, signed char)
+SPECIALIZE_DIV2EXP(signed_int, signed short, signed short)
+SPECIALIZE_DIV2EXP(signed_int, signed int, signed int)
+SPECIALIZE_DIV2EXP(signed_int, signed long, signed long)
+SPECIALIZE_DIV2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_SQRT(signed_int, signed char, signed char)
+SPECIALIZE_SQRT(signed_int, signed short, signed short)
+SPECIALIZE_SQRT(signed_int, signed int, signed int)
+SPECIALIZE_SQRT(signed_int, signed long, signed long)
+SPECIALIZE_SQRT(signed_int, signed long long, signed long long)
+SPECIALIZE_SQRT(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_SQRT(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_SQRT(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_SQRT(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_SQRT(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ABS(generic, signed char, signed char)
+SPECIALIZE_ABS(generic, signed short, signed short)
+SPECIALIZE_ABS(generic, signed int, signed int)
+SPECIALIZE_ABS(generic, signed long, signed long)
+SPECIALIZE_ABS(generic, signed long long, signed long long)
+SPECIALIZE_ABS(generic, unsigned char, unsigned char)
+SPECIALIZE_ABS(generic, unsigned short, unsigned short)
+SPECIALIZE_ABS(generic, unsigned int, unsigned int)
+SPECIALIZE_ABS(generic, unsigned long, unsigned long)
+SPECIALIZE_ABS(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCD(exact, signed char, signed char, signed char)
+SPECIALIZE_GCD(exact, signed short, signed short, signed short)
+SPECIALIZE_GCD(exact, signed int, signed int, signed int)
+SPECIALIZE_GCD(exact, signed long, signed long, signed long)
+SPECIALIZE_GCD(exact, signed long long, signed long long, signed long long)
+SPECIALIZE_GCD(exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCD(exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCD(exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCD(exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCD(exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCDEXT(exact, signed char, signed char, signed char, signed char, signed char)
+SPECIALIZE_GCDEXT(exact, signed short, signed short, signed short, signed short, signed short)
+SPECIALIZE_GCDEXT(exact, signed int, signed int, signed int, signed int, signed int)
+SPECIALIZE_GCDEXT(exact, signed long, signed long, signed long, signed long, signed long)
+SPECIALIZE_GCDEXT(exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+SPECIALIZE_GCDEXT(exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCDEXT(exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCDEXT(exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCDEXT(exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCDEXT(exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_LCM(gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_LCM(gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_LCM(gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_LCM(gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_LCM(gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_LCM(gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_LCM(gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_LCM(gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_LCM(gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_LCM(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SGN(generic, signed char)
+SPECIALIZE_SGN(generic, signed short)
+SPECIALIZE_SGN(generic, signed int)
+SPECIALIZE_SGN(generic, signed long)
+SPECIALIZE_SGN(generic, signed long long)
+SPECIALIZE_SGN(generic, unsigned char)
+SPECIALIZE_SGN(generic, unsigned short)
+SPECIALIZE_SGN(generic, unsigned int)
+SPECIALIZE_SGN(generic, unsigned long)
+SPECIALIZE_SGN(generic, unsigned long long)
+
+SPECIALIZE_CMP(generic, signed char, signed char)
+SPECIALIZE_CMP(generic, signed short, signed short)
+SPECIALIZE_CMP(generic, signed int, signed int)
+SPECIALIZE_CMP(generic, signed long, signed long)
+SPECIALIZE_CMP(generic, signed long long, signed long long)
+SPECIALIZE_CMP(generic, unsigned char, unsigned char)
+SPECIALIZE_CMP(generic, unsigned short, unsigned short)
+SPECIALIZE_CMP(generic, unsigned int, unsigned int)
+SPECIALIZE_CMP(generic, unsigned long, unsigned long)
+SPECIALIZE_CMP(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_ADD_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_ADD_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_ADD_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_ADD_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_SUB_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_SUB_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_SUB_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_SUB_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_INPUT(generic, signed char)
+SPECIALIZE_INPUT(generic, signed short)
+SPECIALIZE_INPUT(generic, signed int)
+SPECIALIZE_INPUT(generic, signed long)
+SPECIALIZE_INPUT(generic, signed long long)
+SPECIALIZE_INPUT(generic, unsigned char)
+SPECIALIZE_INPUT(generic, unsigned short)
+SPECIALIZE_INPUT(generic, unsigned int)
+SPECIALIZE_INPUT(generic, unsigned long)
+SPECIALIZE_INPUT(generic, unsigned long long)
+
+SPECIALIZE_OUTPUT(char, signed char)
+SPECIALIZE_OUTPUT(int, signed short)
+SPECIALIZE_OUTPUT(int, signed int)
+SPECIALIZE_OUTPUT(int, signed long)
+SPECIALIZE_OUTPUT(int, signed long long)
+SPECIALIZE_OUTPUT(char, unsigned char)
+SPECIALIZE_OUTPUT(int, unsigned short)
+SPECIALIZE_OUTPUT(int, unsigned int)
+SPECIALIZE_OUTPUT(int, unsigned long)
+SPECIALIZE_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..ce5e380
--- /dev/null
+++ b/src/checked_mpq.inlines.hh
@@ -0,0 +1,413 @@
+/* Specialized "checked" functions for GMP's mpq_class numbers.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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::handle_nan || Policy::handle_infinity)
+ && ::sgn(v.get_den()) == 0) {
+ int s = ::sgn(v.get_num());
+ if (Policy::handle_nan && (nan || sign) && s == 0)
+ return VC_NAN;
+ if (!inf && !sign)
+ return VC_NORMAL;
+ if (Policy::handle_infinity) {
+ if (s < 0)
+ return inf ? VC_MINUS_INFINITY : V_LT;
+ if (s > 0)
+ return inf ? VC_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return sgn<Policy>(v);
+ return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+ return Policy::handle_nan
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) == 0;
+}
+
+SPECIALIZE_IS_NAN(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+ return Policy::handle_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) < 0;
+}
+
+SPECIALIZE_IS_MINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+ return Policy::handle_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) > 0;
+}
+
+SPECIALIZE_IS_PINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+ return !is_nan<Policy>(v) && v.get_den() == 1;
+}
+
+SPECIALIZE_IS_INT(mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+set_special_mpq(mpq_class& v, Result r) {
+ Result c = classify(r);
+ if (Policy::handle_nan && c == VC_NAN) {
+ v.get_num() = 0;
+ v.get_den() = 0;
+ }
+ else if (Policy::handle_infinity) {
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ v.get_num() = -1;
+ v.get_den() = 0;
+ break;
+ case VC_PLUS_INFINITY:
+ v.get_num() = 1;
+ v.get_den() = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpq, mpq_class)
+
+SPECIALIZE_COPY(generic, mpq_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+ new (&to) mpq_class(from);
+ return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, float)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, double)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+ // FIXME: this is an incredibly inefficient implementation!
+ new (&to) mpq_class;
+ std::stringstream ss;
+ output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+ return input_mpq(to, ss);
+}
+
+SPECIALIZE_CONSTRUCT(mpq_long_double, mpq_class, long double)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, float)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, double)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpq_signed_int, mpq_class, signed long long)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+ // FIXME: this is an incredibly inefficient implementation!
+ std::stringstream ss;
+ output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+ return input_mpq(to, ss);
+}
+
+SPECIALIZE_ASSIGN(mpq_long_double, mpq_class, long double)
+
+template <typename 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;
+}
+
+SPECIALIZE_NEG(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+SPECIALIZE_ADD(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+SPECIALIZE_SUB(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+SPECIALIZE_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ to = x / y;
+ return V_EQ;
+}
+
+SPECIALIZE_DIV(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+ return set_special<Policy>(to, V_MOD_ZERO);
+ to = x / y;
+ to.get_num() %= to.get_den();
+ return V_EQ;
+}
+
+SPECIALIZE_REM(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, 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;
+}
+
+SPECIALIZE_MUL2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, 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;
+}
+
+SPECIALIZE_DIV2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+SPECIALIZE_ABS(mpq, mpq_class, mpq_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_ADD_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_SUB_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned long rational_sqrt_precision_parameter;
+
+template <typename Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+ return set_special<Policy>(to, V_SQRT_NEG);
+ const unsigned long k = rational_sqrt_precision_parameter;
+ mpz_class& to_num = to.get_num();
+ mul2exp<Policy>(to_num, from.get_num(), 2*k, dir);
+ Result rdiv = div<Policy>(to_num, to_num, from.get_den(), dir);
+ Result rsqrt = sqrt<Policy>(to_num, to_num, dir);
+ mpz_class& to_den = to.get_den();
+ to_den = 1;
+ mul2exp<Policy>(to_den, to_den, k, dir);
+ to.canonicalize();
+ return rdiv != V_EQ ? rdiv : rsqrt;
+}
+
+SPECIALIZE_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);
+ if (r == VC_MINUS_INFINITY)
+ return assign<Policy>(to, MINUS_INFINITY, dir);
+ if (r == VC_PLUS_INFINITY)
+ return assign<Policy>(to, PLUS_INFINITY, dir);
+ return set_special<Policy>(to, r);
+}
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+ const mpq_class& from,
+ const Numeric_Format&,
+ Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+SPECIALIZE_INPUT(mpq, mpq_class)
+SPECIALIZE_OUTPUT(mpq, mpq_class)
+
+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());
+}
+
+} // namespace Checked
+
+//! Returns the precision parameter used for rational square root calculations.
+inline unsigned
+rational_sqrt_precision_parameter() {
+ return Checked::rational_sqrt_precision_parameter;
+}
+
+//! Sets the precision parameter used for rational square root calculations.
+/*!
+ If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+ precision parameter used for rational square root calculations to \p p.
+
+ \exception std::invalid_argument
+ Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_rational_sqrt_precision_parameter(const unsigned p) {
+ if (p <= INT_MAX)
+ Checked::rational_sqrt_precision_parameter = p;
+ else
+ throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(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..71d83de
--- /dev/null
+++ b/src/checked_mpz.inlines.hh
@@ -0,0 +1,529 @@
+/* Specialized "checked" functions for GMP's mpz_class numbers.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_checked_mpz_inlines_hh
+#define PPL_checked_mpz_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ --to;
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (dir == ROUND_UP) {
+ ++to;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+// FIXME: change this when Autoconf will support AC_C_TYPEOF.
+#ifdef __GNUC__
+//! 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::handle_nan || Policy::handle_infinity) {
+ mp_size_field_t s = get_mp_size(v);
+ if (Policy::handle_nan
+ && (nan || sign)
+ && s == Limits<mp_size_field_t>::min + 1)
+ return VC_NAN;
+ if (!inf && !sign)
+ return VC_NORMAL;
+ if (Policy::handle_infinity) {
+ if (s == Limits<mp_size_field_t>::min)
+ return inf ? VC_MINUS_INFINITY : V_LT;
+ if (s == Limits<mp_size_field_t>::max)
+ return inf ? VC_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return sgn<Policy>(v);
+ return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+ return Policy::handle_nan
+ && get_mp_size(v) == Limits<mp_size_field_t>::min + 1;
+}
+
+SPECIALIZE_IS_NAN(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+ return Policy::handle_infinity
+ && get_mp_size(v) == Limits<mp_size_field_t>::min;
+}
+
+SPECIALIZE_IS_MINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+ return Policy::handle_infinity
+ && get_mp_size(v) == Limits<mp_size_field_t>::max;
+}
+
+SPECIALIZE_IS_PINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+ return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+set_special_mpz(mpz_class& v, Result r) {
+ Result c = classify(r);
+ if (Policy::handle_nan && c == VC_NAN)
+ set_mp_size(v, Limits<mp_size_field_t>::min + 1);
+ else if (Policy::handle_infinity) {
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ set_mp_size(v, Limits<mp_size_field_t>::min);
+ break;
+ case VC_PLUS_INFINITY:
+ set_mp_size(v, Limits<mp_size_field_t>::max);
+ break;
+ default:
+ break;
+ }
+ }
+ return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpz, mpz_class)
+
+template <typename Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+ if (is_nan_mpz<Policy>(from) ||
+ is_minf_mpz<Policy>(from) || is_pinf_mpz<Policy>(from))
+ set_mp_size(to, get_mp_size(from));
+ else
+ to = from;
+}
+
+SPECIALIZE_COPY(mpz, mpz_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+ new (&to) mpz_class(from);
+ return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed long)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+ to = static_cast<signed long>(from);
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed long)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned long)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpz_signed_int, mpz_class, signed long long)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+ if (dir == ROUND_IGNORE) {
+ to = from;
+ return V_LGE;
+ }
+ From n = rint(from);
+ to = n;
+ if (from < n)
+ return round_lt_mpz<Policy>(to, dir);
+ else if (from > n)
+ return round_gt_mpz<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, float)
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, double)
+
+template <typename Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (dir == ROUND_IGNORE) {
+ to = from;
+ return V_LGE;
+ }
+ mpz_srcptr n = from.get_num().get_mpz_t();
+ mpz_srcptr d = from.get_den().get_mpz_t();
+ if (dir == ROUND_DOWN) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+ }
+ else {
+ assert(dir == ROUND_UP);
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+ }
+}
+
+SPECIALIZE_ASSIGN(mpz_mpq, mpz_class, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+ if (Policy::handle_infinity) {
+ set_special<Policy>(to, VC_MINUS_INFINITY);
+ return V_EQ;
+ }
+ return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+ if (Policy::handle_infinity) {
+ set_special<Policy>(to, VC_PLUS_INFINITY);
+ return V_EQ;
+ }
+ return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+ if (Policy::handle_nan) {
+ set_special<Policy>(to, VC_NAN);
+ return V_EQ;
+ }
+ return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(mp_minf, mpz_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpz_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpz_class, Not_A_Number)
+SPECIALIZE_ASSIGN(mp_minf, mpq_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpq_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpq_class, Not_A_Number)
+
+template <typename 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;
+}
+
+SPECIALIZE_NEG(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+SPECIALIZE_ADD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+SPECIALIZE_SUB(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+SPECIALIZE_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ mpz_srcptr n = x.get_mpz_t();
+ mpz_srcptr d = y.get_mpz_t();
+ if (dir == ROUND_IGNORE) {
+ mpz_divexact(to.get_mpz_t(), n, d);
+ return V_LGE;
+ }
+ if (dir == ROUND_DOWN) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+ }
+ else {
+ assert(dir == ROUND_UP);
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+ }
+}
+
+SPECIALIZE_DIV(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+ return set_special<Policy>(to, V_MOD_ZERO);
+ to = x % y;
+ return V_EQ;
+}
+
+SPECIALIZE_REM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ mpz_srcptr n = x.get_mpz_t();
+ if (dir == ROUND_IGNORE) {
+ mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_LGE;
+ }
+ if (dir == ROUND_DOWN) {
+ mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+ return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT;
+ }
+ else {
+ assert(dir == ROUND_UP);
+ mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+ return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT;
+ }
+}
+
+SPECIALIZE_DIV2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+SPECIALIZE_ABS(mpz, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_ADD_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_SUB_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_GCD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+gcdext_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ mpz_class& s, mpz_class& t, Rounding_Dir) {
+ mpz_gcdext(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(),
+ s.get_mpz_t(), t.get_mpz_t());
+ return V_EQ;
+}
+
+SPECIALIZE_GCDEXT(mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_LCM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+ return set_special<Policy>(to, V_SQRT_NEG);
+ if (dir == ROUND_IGNORE) {
+ to = sqrt(from);
+ return V_GE;
+ }
+ 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<Policy>(to, dir);
+}
+
+SPECIALIZE_SQRT(mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_mp(const Type& x) {
+ int i = ::sgn(x);
+ return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_SGN(mp, mpz_class)
+SPECIALIZE_SGN(mp, mpq_class)
+
+template <typename Policy, typename Type>
+inline Result
+cmp_mp(const Type& x, const Type& y) {
+ int i = ::cmp(x, y);
+ return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_CMP(mp, mpz_class, mpz_class)
+SPECIALIZE_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;
+}
+
+SPECIALIZE_INPUT(generic, mpz_class)
+SPECIALIZE_OUTPUT(mpz, mpz_class)
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+ return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+} // 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..a79ac60
--- /dev/null
+++ b/src/checked_numeric_limits.hh
@@ -0,0 +1,161 @@
+/* Specializations of std::numeric_limits for "checked" types.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 "mp_numeric_limits.hh"
+#include <limits>
+
+namespace std {
+
+#define PPL_SPECIALIZE_LIMITS_INT(T) \
+/*! \brief Partial specialization of std::numeric_limits. */ \
+template <typename Policy> \
+class numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+ : public numeric_limits<T> { \
+ private: \
+ typedef Parma_Polyhedra_Library::Checked_Number<T, Policy> Type; \
+ \
+ public: \
+ static const bool has_infinity = Policy::handle_infinity; \
+ static const bool has_quiet_NaN = Policy::handle_nan; \
+ \
+ static Type min() { \
+ return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::min; \
+ } \
+ \
+ static Type max() { \
+ return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::max; \
+ } \
+ \
+ static Type infinity() { \
+ return \
+ Policy::handle_infinity \
+ ? Parma_Polyhedra_Library::PLUS_INFINITY \
+ : static_cast<Type>(0); \
+ } \
+ \
+ static Type quiet_NaN() { \
+ return \
+ Policy::handle_nan \
+ ? Parma_Polyhedra_Library::NOT_A_NUMBER \
+ : static_cast<Type>(0); \
+ } \
+};
+
+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<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+ : public numeric_limits<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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> >
+ : public numeric_limits<mpz_class> {
+private:
+ typedef Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::handle_infinity;
+ static const bool has_quiet_NaN = Policy::handle_nan;
+
+ static Type infinity() {
+ return
+ Policy::handle_infinity
+ ? Parma_Polyhedra_Library::PLUS_INFINITY
+ : static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return
+ Policy::handle_nan
+ ? Parma_Polyhedra_Library::NOT_A_NUMBER
+ : static_cast<Type>(0);
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+ typedef Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::handle_infinity;
+ static const bool has_quiet_NaN = Policy::handle_nan;
+
+ static Type infinity() {
+ return
+ Policy::handle_infinity
+ ? Parma_Polyhedra_Library::PLUS_INFINITY
+ : static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return
+ Policy::handle_nan
+ ? Parma_Polyhedra_Library::NOT_A_NUMBER
+ : static_cast<Type>(0);
+ }
+};
+
+} // 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..657f469
--- /dev/null
+++ b/src/compiler.hh
@@ -0,0 +1,38 @@
+/* C++ compiler related stuff.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_compiler_hh
+#define PPL_compiler_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Used to avoid unused variable warnings from the compiler.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+used(const T&) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_compiler_hh)
diff --git a/src/conversion.cc b/src/conversion.cc
new file mode 100644
index 0000000..c60ffe4
--- /dev/null
+++ b/src/conversion.cc
@@ -0,0 +1,856 @@
+/* Polyhedron class implementation: conversion().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Row.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Polyhedron.defs.hh"
+#include "Scalar_Products.defs.hh"
+#include <cstddef>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+// True if abandon_expensive_computations should be checked often,
+// where the meaning of "often" is as stated in the documentation
+// of that variable.
+#define REACTIVE_ABANDONING 1
+
+/*!
+ \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).
+
+ 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.
+*/
+PPL::dimension_type
+PPL::Polyhedron::conversion(Linear_System& source,
+ const dimension_type start,
+ Linear_System& dest,
+ Saturation_Matrix& sat,
+ dimension_type num_lines_or_equalities) {
+ dimension_type source_num_rows = source.num_rows();
+ dimension_type dest_num_rows = dest.num_rows();
+ const dimension_type source_num_columns = source.num_columns();
+ const dimension_type dest_num_columns = dest.num_columns();
+
+ // 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'.
+ assert(source_num_rows == sat.num_columns());
+ assert(dest_num_rows == sat.num_rows());
+
+ // If `start > 0', then we are converting the pending constraints.
+ assert(start == 0 || start == source.first_pending_row());
+
+ // During the iteration on the constraints in `source' we may identify
+ // constraints that are redundant: these have to be removed by swapping
+ // the rows of `source', taking care not to compromise the sortedness
+ // of the constraints that still have to be considered.
+ // To this end, the following counter keeps the number of redundant
+ // constraints seen so far, to be used as a displacement when swapping rows.
+ dimension_type source_num_redundant = 0;
+
+ TEMP_INTEGER(normalized_sp_i);
+ TEMP_INTEGER(normalized_sp_o);
+
+ // 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; ) {
+
+ // All the `source_num_redundant' redundant constraints identified so far
+ // have consecutive indices starting from `k'.
+ if (source_num_redundant > 0)
+ // Let the next constraint have index `k'.
+ // There is no need to swap the columns of `sat' (all zeroes).
+ std::swap(source[k], source[k+source_num_redundant]);
+
+ Linear_Row& source_k = source[k];
+
+ // Constraints and generators must have the same dimension,
+ // otherwise the scalar product below will bomb.
+ assert(source_num_columns == dest_num_columns);
+
+ // `scalar_prod[i]' will contain the scalar product
+ // of the constraint `source_k' and the generator `dest[i]'.
+ // This product is 0 iff the generator saturates the constraint.
+ static std::vector<Coefficient> scalar_prod;
+ const int needed_space = dest_num_rows - scalar_prod.size();
+ if (needed_space > 0)
+ scalar_prod.insert(scalar_prod.end(), needed_space, Coefficient_zero());
+ // `index_non_zero' will indicate the first generator in `dest'
+ // that does not saturate the constraint `source_k'.
+ dimension_type index_non_zero = 0;
+ for ( ; index_non_zero < dest_num_rows; ++index_non_zero) {
+ Scalar_Products::assign(scalar_prod[index_non_zero],
+ source_k,
+ dest[index_non_zero]);
+ if (scalar_prod[index_non_zero] != 0)
+ // The generator does not saturate the constraint.
+ break;
+#if REACTIVE_ABANDONING
+ // Check if the client has requested abandoning all exponential
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+#endif
+ }
+ for (dimension_type i = index_non_zero + 1; i < dest_num_rows; ++i) {
+ Scalar_Products::assign(scalar_prod[i], source_k, dest[i]);
+#if REACTIVE_ABANDONING
+ maybe_abandon();
+#endif
+ }
+
+ // 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' (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[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[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[index_non_zero]' lies on the wrong half-space:
+ // we change it to have the opposite direction.
+ neg_assign(scalar_prod[index_non_zero]);
+ for (dimension_type j = dest_num_columns; j-- > 0; )
+ neg_assign(dest[index_non_zero][j]);
+ }
+ // Having changed a line to a ray, we set `dest' to be a
+ // non-sorted system, we decrement the number of lines of `dest' and,
+ // if necessary, we move the new ray below all the remaining lines.
+ dest.set_sorted(false);
+ --num_lines_or_equalities;
+ if (index_non_zero != num_lines_or_equalities) {
+ std::swap(dest[index_non_zero],
+ dest[num_lines_or_equalities]);
+ std::swap(scalar_prod[index_non_zero],
+ scalar_prod[num_lines_or_equalities]);
+ }
+ Linear_Row& dest_nle = dest[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];
+ 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
+ //
+ // 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];
+ // }
+ normalize2(scalar_prod[i],
+ scalar_prod_nle,
+ normalized_sp_i,
+ normalized_sp_o);
+ Linear_Row& dest_i = dest[i];
+ for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ Coefficient& dest_i_c = dest_i[c];
+ dest_i_c *= normalized_sp_o;
+ sub_mul_assign(dest_i_c, normalized_sp_i, dest_nle[c]);
+ }
+ dest_i.strong_normalize();
+ scalar_prod[i] = 0;
+ // `dest' has already been set as non-sorted.
+ }
+ }
+
+ // 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
+ //
+ // 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];
+ // }
+ normalize2(scalar_prod[i],
+ scalar_prod_nle,
+ normalized_sp_i,
+ normalized_sp_o);
+ Linear_Row& dest_i = dest[i];
+ for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ Coefficient& dest_i_c = dest_i[c];
+ dest_i_c *= normalized_sp_o;
+ sub_mul_assign(dest_i_c, normalized_sp_i, dest_nle[c]);
+ }
+ dest_i.strong_normalize();
+ scalar_prod[i] = 0;
+ // `dest' has already been set as non-sorted.
+ }
+#if REACTIVE_ABANDONING
+ maybe_abandon();
+#endif
+ }
+ // 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' ...
+ Saturation_Row& sat_nle = sat[num_lines_or_equalities];
+ if (source_k.is_ray_or_point_or_inequality())
+ sat_nle.set(k);
+ // ... otherwise, the constraint is an equality which is
+ // violated by the generator `dest_nle': the generator has to be
+ // removed from `dest'.
+ else {
+ --dest_num_rows;
+ std::swap(dest_nle, dest[dest_num_rows]);
+ std::swap(scalar_prod_nle, scalar_prod[dest_num_rows]);
+ std::swap(sat_nle, sat[dest_num_rows]);
+ // `dest' has already been set as non-sorted.
+ }
+ // We continue with the next constraint.
+ ++k;
+ }
+ // Here we have `index_non_zero' >= `num_lines_or_equalities',
+ // so that all the lines in `dest' saturate the constraint `source_k'.
+ else {
+ // First, we reorder the generators in `dest' 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=.
+ std::swap(dest[sup_bound], dest[lines_or_equal_bound]);
+ std::swap(scalar_prod[sup_bound], scalar_prod[lines_or_equal_bound]);
+ std::swap(sat[sup_bound], sat[lines_or_equal_bound]);
+ ++lines_or_equal_bound;
+ ++sup_bound;
+ dest.set_sorted(false);
+ }
+ else if (sp_sign < 0) {
+ // This generator has to be moved in Q-.
+ --inf_bound;
+ std::swap(dest[sup_bound], dest[inf_bound]);
+ std::swap(scalar_prod[sup_bound], scalar_prod[inf_bound]);
+ std::swap(sat[sup_bound], sat[inf_bound]);
+ dest.set_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()) {
+ ++source_num_redundant;
+ --source_num_rows;
+ // NOTE: we continue with the next cycle of the loop
+ // without incrementing the index `k', because:
+ // -# either `k == source_num_rows', and we will exit the loop;
+ // -# or, having increased `source_num_redundant', we will swap
+ // in position `k' a constraint that still has to be examined.
+ }
+ 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' all the generators of Q+.
+ dest_num_rows = lines_or_equal_bound;
+ // We continue with the next constraint.
+ ++k;
+ }
+ }
+ 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' all the generators in Q-.
+ dest_num_rows = sup_bound;
+ 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[i]' and `dest[j]' are adjacent.
+ // If there exist another generator that saturates
+ // all the constraints saturated by both `dest[i]' and
+ // `dest[j]', then they are NOT adjacent.
+ Saturation_Row new_satrow;
+ assert(sat[i].last() == ULONG_MAX || sat[i].last() < k);
+ assert(sat[j].last() == ULONG_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[i]' and `dest[j]'.
+ set_union(sat[i], sat[j], new_satrow);
+
+ // Computing 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 - new_satrow.count_ones();
+
+ // Even before actually creating the new ray as a
+ // positive combination of `dest[i]' and `dest[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;
+ 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[i]' and `dest[j]'.
+ redundant = true;
+ break;
+ }
+ if (!redundant) {
+ // Adding the new ray to `dest' and the corresponding
+ // saturation row to `sat'.
+ if (dest_num_rows == dest.num_rows()) {
+ // Make room for one more row.
+ dest.add_pending_row(Linear_Row::Flags(dest.topology(),
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ sat.add_row(new_satrow);
+ }
+ else
+ sat[dest_num_rows] = new_satrow;
+ Linear_Row& new_row = dest[dest_num_rows];
+ // The following fragment optimizes the computation of
+ //
+ // 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];
+ // }
+ normalize2(scalar_prod[i],
+ scalar_prod[j],
+ normalized_sp_i,
+ normalized_sp_o);
+ for (dimension_type c = dest_num_columns; c-- > 0; ) {
+ Coefficient& new_row_c = new_row[c];
+ new_row_c = normalized_sp_i * dest[j][c];
+ sub_mul_assign(new_row_c, normalized_sp_o, dest[i][c]);
+ }
+ new_row.strong_normalize();
+ // Since we added a new generator to `dest',
+ // 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.
+ 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();
+ // Increment the number of generators.
+ ++dest_num_rows;
+ }
+ }
+ }
+#if REACTIVE_ABANDONING
+ maybe_abandon();
+#endif
+ }
+ // 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.
+ for (dimension_type l = lines_or_equal_bound; l < sup_bound; ++l)
+ sat[l].set(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;
+ std::swap(dest[i], dest[j]);
+ std::swap(scalar_prod[i], scalar_prod[j]);
+ std::swap(sat[i], sat[j]);
+ ++j;
+ dest.set_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.
+ dest_num_rows = (j == bound) ? i : j;
+ }
+ // We continue with the next constraint.
+ ++k;
+ }
+ }
+#if !REACTIVE_ABANDONING
+ // Check if the client has requested abandoning all exponential
+ // computations. If so, the exception specified by the client
+ // is thrown now.
+ maybe_abandon();
+#endif
+ }
+
+ // We may have identified some redundant constraints in `source',
+ // which have been swapped at the end of the system.
+ if (source_num_redundant > 0) {
+ assert(source_num_redundant == source.num_rows() - source_num_rows);
+ source.erase_to_end(source_num_rows);
+ sat.columns_erase_to_end(source_num_rows);
+ }
+ // 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',
+ // which have been swapped at the end of the system.
+ if (dest_num_rows < dest.num_rows()) {
+ dest.erase_to_end(dest_num_rows);
+ // Be careful: we might have erased some of the non-pending rows.
+ if (dest.first_pending_row() > dest_num_rows)
+ dest.unset_pending_rows();
+ sat.rows_erase_to_end(dest_num_rows);
+ }
+ if (dest.is_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[i - 1], dest[i]) > 0) {
+ dest.set_sorted(false);
+ break;
+ }
+ // There are no pending generators in `dest'.
+ dest.unset_pending_rows();
+
+ return num_lines_or_equalities;
+}
diff --git a/src/fpu-c99.inlines.hh b/src/fpu-c99.inlines.hh
new file mode 100644
index 0000000..629faf6
--- /dev/null
+++ b/src/fpu-c99.inlines.hh
@@ -0,0 +1,81 @@
+/* C99 Floating point unit related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+
+#ifdef FE_TONEAREST
+#define FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return 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) {
+ fpu_rounding_direction_type old = fegetround();
+ fesetround(dir);
+ return old;
+}
+
+inline void
+fpu_reset_inexact() {
+ feclearexcept(FE_INEXACT);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+ fpu_reset_inexact();
+ return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+ fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+ return fetestexcept(FE_INEXACT) != 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(HAVE_FENV_H)
diff --git a/src/fpu-ia32.inlines.hh b/src/fpu-ia32.inlines.hh
new file mode 100644
index 0000000..ce9bfd7
--- /dev/null
+++ b/src/fpu-ia32.inlines.hh
@@ -0,0 +1,134 @@
+/* ia32 floating point unit related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "compiler.hh"
+
+#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 FPU_TONEAREST 0
+#define FPU_DOWNWARD 0x400
+#define FPU_UPWARD 0x800
+#define FPU_TOWARDZERO 0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT (PPL_FPU_CONTROL_DEFAULT_BASE | FPU_UPWARD)
+
+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));
+ return cw;
+}
+
+inline void
+fpu_set_control(unsigned short cw) {
+ __asm__ __volatile__ ("fldcw %0" : : "m" (cw));
+}
+
+inline int
+fpu_get_status() {
+ int sw;
+ __asm__ __volatile__ ("fnstsw %0" : "=a" (sw));
+ return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+ /* There is no fldsw instruction */
+ ia32_fenv_t env;
+ __asm__ ("fnstenv %0" : "=m" (env));
+ env.status_word &= ~bits;
+ __asm__ ("fldenv %0" : : "m" (env));
+}
+
+inline void
+fpu_clear_exceptions() {
+ __asm__ __volatile__ ("fnclex" : /* No outputs. */);
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return fpu_get_control() & FPU_ROUNDING_MASK;
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+ return 0;
+}
+
+inline void
+fpu_reset_inexact() {
+ fpu_clear_exceptions();
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+ fpu_reset_inexact();
+ return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+}
+
+inline int
+fpu_check_inexact() {
+ return (fpu_get_status() & FPU_INEXACT) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
diff --git a/src/fpu-none.inlines.hh b/src/fpu-none.inlines.hh
new file mode 100644
index 0000000..83c1b09
--- /dev/null
+++ b/src/fpu-none.inlines.hh
@@ -0,0 +1,69 @@
+/* Null floating point unit related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+fpu_get_rounding_direction() {
+ throw std::logic_error("PPL::fpu_get_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int dir) {
+ throw std::logic_error("PPL::fpu_set_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int dir) {
+ 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 int
+fpu_save_rounding_direction_reset_inexact(int dir) {
+ throw std::logic_error("PPL::fpu_save_rounding_direction_reset_inexact():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int dir) {
+ 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
diff --git a/src/fpu-sparc.inlines.hh b/src/fpu-sparc.inlines.hh
new file mode 100644
index 0000000..804ea0d
--- /dev/null
+++ b/src/fpu-sparc.inlines.hh
@@ -0,0 +1,73 @@
+/* SPARC floating point unit related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifdef HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define FPU_TONEAREST ((int) FP_RN)
+#define FPU_UPWARD ((int) FP_RP)
+#define FPU_DOWNWARD ((int) FP_RM)
+#define FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return 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 fpsetround((fp_rnd) dir);
+}
+
+inline void
+fpu_reset_inexact() {
+ fp_except except = fpgetmask();
+ except &= ~FP_X_IMP;
+ fpsetmask(except);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+ fpu_reset_inexact();
+ return fpu_save_rounding_direction((fp_rnd) dir);
+}
+
+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(HAVE_IEEEFP_H)
diff --git a/src/fpu.defs.hh b/src/fpu.defs.hh
new file mode 100644
index 0000000..3d9e218
--- /dev/null
+++ b/src/fpu.defs.hh
@@ -0,0 +1,85 @@
+/* Floating point unit related functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_fpu_defs_hh
+#define PPL_fpu_defs_hh 1
+
+#include "fpu.types.hh"
+
+namespace Parma_Polyhedra_Library {
+
+//! 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();
+
+} // namespace Parma_Polyhedra_Library
+
+#if defined(__i386__)
+#include "fpu-ia32.inlines.hh"
+#elif defined(HAVE_FENV_H)
+#include "fpu-c99.inlines.hh"
+#elif defined(HAVE_IEEEFP_H) \
+ && (defined(__sparc) \
+ || defined(sparc) \
+ || defined(__sparc__))
+#include "fpu-sparc.inlines.hh"
+#else
+#include "fpu-none.inlines.hh"
+#endif
+
+#endif // !defined(PPL_fpu_defs_hh)
diff --git a/src/fpu.types.hh b/src/fpu.types.hh
new file mode 100644
index 0000000..3f9183a
--- /dev/null
+++ b/src/fpu.types.hh
@@ -0,0 +1,26 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+typedef int fpu_rounding_direction_type;
+typedef int 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..a04b6a2
--- /dev/null
+++ b/src/globals.cc
@@ -0,0 +1,33 @@
+/* Definitions of global objects.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "globals.defs.hh"
+#include "Constraint.defs.hh"
+#include "Generator.defs.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+PPL::Coefficient_free_list_element* PPL::Coefficient_free_list_first = 0;
+
+const PPL::Throwable* volatile PPL::abandon_expensive_computations = 0;
diff --git a/src/globals.defs.hh b/src/globals.defs.hh
new file mode 100644
index 0000000..f4da042
--- /dev/null
+++ b/src/globals.defs.hh
@@ -0,0 +1,290 @@
+/* Declarations of global objects.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_globals_defs_hh
+#define PPL_globals_defs_hh 1
+
+#include "globals.types.hh"
+#include "Coefficient.defs.hh"
+#include <exception>
+
+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
+//! A node of the list of available coefficients.
+/*! \ingroup PPL_CXX_interface */
+// FIXME: rewrite the comment.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Coefficient_free_list_element {
+private:
+ Coefficient i;
+ Coefficient_free_list_element* p;
+
+public:
+ Coefficient_free_list_element()
+ : i() {
+ }
+
+ Coefficient& integer() {
+ return i;
+ }
+
+ Coefficient_free_list_element*& next() {
+ return p;
+ }
+};
+
+extern Coefficient_free_list_element* Coefficient_free_list_first;
+
+inline Coefficient&
+get_tmp_Coefficient() {
+ Coefficient* p;
+ if (Coefficient_free_list_first != 0) {
+ p = &Coefficient_free_list_first->integer();
+ Coefficient_free_list_first = Coefficient_free_list_first->next();
+ }
+ else
+ p = reinterpret_cast<Coefficient*>(new Coefficient_free_list_element());
+ return *p;
+}
+
+inline void
+release_tmp_Coefficient(Coefficient& i) {
+ Coefficient_free_list_element& e
+ = reinterpret_cast<Coefficient_free_list_element&>(i);
+ e.next() = Coefficient_free_list_first;
+ Coefficient_free_list_first = &e;
+}
+
+class Temp_Coefficient_Holder {
+private:
+ Coefficient& hold;
+
+public:
+ Temp_Coefficient_Holder(Coefficient& i)
+ : hold(i) {
+ }
+ ~Temp_Coefficient_Holder() {
+ release_tmp_Coefficient(hold);
+ }
+};
+
+#if 1
+#define TEMP_INTEGER(id) \
+Coefficient& id = get_tmp_Coefficient(); \
+Temp_Coefficient_Holder temp_Coefficient_holder_ ## id = (id)
+#else
+#define TEMP_INTEGER(id) static Coefficient id
+#endif
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+dimension_type
+compute_capacity(dimension_type requested_size,
+ dimension_type maximum_size);
+
+//! 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 differentiate the C_Polyhedron and NNC_Polyhedron
+ constructors that build a polyhedron out of a bounding box.
+*/
+struct From_Bounding_Box {
+};
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+ Tag class to make the Grid covering box constructor unique.
+*/
+struct From_Covering_Box {
+};
+
+#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 nx and \p ny, respectively.
+
+ \note
+ \p x and \p nx may be the same object and likewise for
+ \p y and \p ny. Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& nx, Coefficient& ny);
+
+#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);
+
+// 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)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#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;
+#else
+#define PPL_OUTPUT_DECLARATIONS \
+ void ascii_dump() const; \
+ void ascii_dump(std::ostream& s) const; \
+ void print() const;
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+#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 namespace IO_Operators; \
+ 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 namespace IO_Operators; \
+ 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; \
+ }
+
+} // namespace Parma_Polyhedra_Library
+
+#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..f9f1dc2
--- /dev/null
+++ b/src/globals.inlines.hh
@@ -0,0 +1,80 @@
+/* Implementation of global objects: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_globals_inlines_hh
+#define PPL_globals_inlines_hh 1
+
+#include "Coefficient.defs.hh"
+#include <limits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+ return std::numeric_limits<dimension_type>::max();
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+ if (const Throwable* 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;
+}
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& nx, Coefficient& ny) {
+ TEMP_INTEGER(gcd);
+ gcd_assign(gcd, x, y);
+ exact_div_assign(nx, x, gcd);
+ exact_div_assign(ny, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+ assert(n < unsigned(std::numeric_limits<T>::digits));
+ return n == 0 ? 0 : ~(~(T(0u)) << n);
+}
+
+} // 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..08d9bfa
--- /dev/null
+++ b/src/globals.types.hh
@@ -0,0 +1,73 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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 */
+enum Relation_Symbol {
+ //! Less than.
+ LESS_THAN,
+ //! Less than or equal to.
+ LESS_THAN_OR_EQUAL,
+ //! Equal to.
+ EQUAL,
+ //! Greater than or equal to.
+ GREATER_THAN_OR_EQUAL,
+ //! Greater 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
+};
+
+} // 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..0c48f20
--- /dev/null
+++ b/src/initializer.hh
@@ -0,0 +1,34 @@
+/* Nifty counter object for the initialization of the library.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_initializer_hh
+#define PPL_initializer_hh 1
+
+#include "Init.defs.hh"
+
+namespace {
+
+Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+} // namespace
+
+#endif // !defined(PPL_initializer_hh)
diff --git a/src/max_space_dimension.hh b/src/max_space_dimension.hh
new file mode 100644
index 0000000..c986da4
--- /dev/null
+++ b/src/max_space_dimension.hh
@@ -0,0 +1,48 @@
+/* Definition of functions yielding maximal space dimensions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 "Polyhedra_Powerset.defs.hh"
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+ using std::min;
+ return
+ min(Polyhedron::max_space_dimension(),
+ min(Polyhedra_Powerset<C_Polyhedron>::max_space_dimension(),
+ Polyhedra_Powerset<NNC_Polyhedron>::max_space_dimension()
+ )
+ );
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_max_space_dimension_hh)
diff --git a/src/minimize.cc b/src/minimize.cc
new file mode 100644
index 0000000..1725d30
--- /dev/null
+++ b/src/minimize.cc
@@ -0,0 +1,401 @@
+/* Polyhedron class implementation: minimize() and add_and_minimize().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Polyhedron.defs.hh"
+#include <stdexcept>
+
+namespace PPL = 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.
+*/
+bool
+PPL::Polyhedron::minimize(const bool con_to_gen,
+ Linear_System& source,
+ Linear_System& dest,
+ Saturation_Matrix& sat) {
+ // Topologies have to agree.
+ 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.
+ assert(source.num_rows() > 0);
+
+ // 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.
+
+ // Resizing `dest' to be the appropriate square matrix.
+ dimension_type dest_num_rows = source.num_columns();
+ // Note that before calling `resize_no_copy()' we must update
+ // `index_first_pending'.
+ dest.set_index_first_pending_row(dest_num_rows);
+ dest.resize_no_copy(dest_num_rows, dest_num_rows);
+
+ // Initialize `dest' to the identity matrix.
+ for (dimension_type i = dest_num_rows; i-- > 0; ) {
+ Linear_Row& dest_i = dest[i];
+ for (dimension_type j = dest_num_rows; j-- > 0; )
+ dest_i[j] = (i == j) ? 1 : 0;
+ dest_i.set_is_line_or_equality();
+ }
+ // The identity matrix `dest' is not sorted (see the sorting rules
+ // in Linear_Row.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.
+ Saturation_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, 0, dest, tmp_sat, dest_num_rows);
+ // conversion() may have modified the number of rows in `dest'.
+ 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.
+ const dimension_type checking_index
+ = dest.is_necessarily_closed()
+ ? 0
+ : dest.num_columns() - 1;
+ dimension_type first_point;
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point][checking_index] > 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.
+ throw std::runtime_error("PPL internal error");
+ 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&, Linear_System&, Saturation_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.
+*/
+bool
+PPL::Polyhedron::add_and_minimize(const bool con_to_gen,
+ Linear_System& source1,
+ Linear_System& dest,
+ Saturation_Matrix& sat,
+ const Linear_System& source2) {
+ // `source1' and `source2' cannot be empty.
+ assert(source1.num_rows() > 0 && source2.num_rows() > 0);
+ // `source1' and `source2' must have the same number of columns
+ // to be merged.
+ assert(source1.num_columns() == source2.num_columns());
+ // `source1' and `source2' are fully sorted.
+ assert(source1.is_sorted() && source1.num_pending_rows() == 0);
+ assert(source2.is_sorted() && source2.num_pending_rows() == 0);
+ 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.
+*/
+bool
+PPL::Polyhedron::add_and_minimize(const bool con_to_gen,
+ Linear_System& source,
+ Linear_System& dest,
+ Saturation_Matrix& sat) {
+ assert(source.num_pending_rows() > 0);
+ assert(source.num_columns() == dest.num_columns());
+ 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.
+ const dimension_type checking_index
+ = dest.is_necessarily_closed()
+ ? 0
+ : dest.num_columns() - 1;
+ dimension_type first_point;
+ for (first_point = num_lines_or_equalities;
+ first_point < dest_num_rows;
+ ++first_point)
+ if (dest[first_point][checking_index] > 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.
+ throw std::runtime_error("PPL internal error");
+ 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;
+ }
+}
diff --git a/src/mp_numeric_limits.hh b/src/mp_numeric_limits.hh
new file mode 100644
index 0000000..ff69f14
--- /dev/null
+++ b/src/mp_numeric_limits.hh
@@ -0,0 +1,157 @@
+/* Specializations of std::numeric_limits for multi-precision types.
+ This will become obsolete when GMP and MPFR will provide the
+ specializations by themselves.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_mp_numeric_limits_hh
+#define PPL_mp_numeric_limits_hh 1
+
+#include <gmpxx.h>
+#include <limits>
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // 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 // 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 // !defined(PPL_mp_numeric_limits_hh)
diff --git a/src/namespaces.hh b/src/namespaces.hh
new file mode 100644
index 0000000..93c5083
--- /dev/null
+++ b/src/namespaces.hh
@@ -0,0 +1,100 @@
+/* Documentation for used namespaces.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_namespaces_hh
+#define PPL_namespaces_hh 1
+
+//! The entire library is confined to this namespace.
+/*! \ingroup PPL_CXX_interface */
+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 pre-defined 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 // 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+namespace Implementation {
+} // namespace Implementation
+
+
+} // 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 function templates
+ <CODE>swap()</CODE> and <CODE>iter_swap()</CODE> (25.2.2, [lib.alg.swap]),
+ and for the 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 b/src/ppl-config.cc
new file mode 100644
index 0000000..a572e14
--- /dev/null
+++ b/src/ppl-config.cc
@@ -0,0 +1,720 @@
+/* A program to enquire about the configuration of the PPL -*- C++ -*-
+ and of the applications using it.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.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 HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef 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 2"
+
+std::string prefix;
+std::string exec_prefix;
+
+const char* variable_prefix = "PPL_";
+
+bool exec_prefix_set = false;
+
+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;
+
+#ifdef 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\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 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";
+
+#define OPTION_LETTERS "hF:I:ALp::e::OVMNRBEniblPCXDgcur"
+
+const char* program_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);
+}
+
+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);
+}
+
+void internal_error() {
+ fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+}
+
+bool
+strcaseeq(const char* s1, const char* s2) {
+ while (*s1 && *s2
+ && tolower(static_cast<unsigned char>(*s1))
+ == tolower(static_cast<unsigned char>(*s2))) {
+ ++s1;
+ ++s2;
+ }
+ return tolower(static_cast<unsigned char>(*s1))
+ == tolower(static_cast<unsigned char>(*s2));
+}
+
+void
+process_options(int argc, char* argv[]) {
+ while (true) {
+#ifdef 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) {
+ 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) {
+ 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) {
+ 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 = "/usr/local";
+ exec_prefix = "${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", long(PPL_VERSION_MAJOR));
+
+ if (required_version_minor)
+ portray("VERSION_MINOR", long(PPL_VERSION_MINOR));
+
+ if (required_version_revision)
+ portray("VERSION_REVISION", long(PPL_VERSION_REVISION));
+
+ if (required_version_beta)
+ portray("VERSION_BETA", long(PPL_VERSION_BETA));
+
+ if (required_banner)
+ portray("BANNER", PPL::banner());
+
+ if (required_coefficients)
+ portray("COEFFICIENTS", "mpz");
+
+ if (required_includedir)
+ portray_with_prefixes("INCLUDEDIR", "${prefix}/include");
+
+ if (required_bindir)
+ portray_with_prefixes("BINDIR", "${exec_prefix}/bin");
+
+ if (required_libdir)
+ portray_with_prefixes("LIBDIR", "${exec_prefix}/lib");
+
+ if (required_cppflags) {
+ if (required_application) {
+ std::string cppflags = "";
+ std::string s = "${prefix}/include";
+ 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("") > 0)
+ s += ' ';
+ s += "";
+ }
+ if (s.length() > 0 && strlen("") > 0)
+ s += ' ';
+ s += "";
+ portray("CPPFLAGS", s);
+ }
+ else
+ portray("CPPFLAGS", "");
+ }
+
+ if (required_cflags)
+ portray("CFLAGS", "-W -Wall -g -O2");
+
+ if (required_cxxflags)
+ portray("CXXFLAGS", "-W -Wall -g -O2");
+
+ if (required_ldflags) {
+ std::string s = "${exec_prefix}/lib";
+ replace_prefixes(s);
+ const std::string 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(" -lm -L/usr/local/lib -lgmpxx -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2 -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2/../../.. -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr/local/distrib/objdir/gcc -L/usr/local/lib -lgmp -R/usr/local/lib -lm -L/usr/local/lib -lgcc_s -lc -R/usr/local/lib") > 0)
+ s += ' ';
+ s += " -lm -L/usr/local/lib -lgmpxx -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2 -L/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.2/../../.. -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src -L/usr/local/distrib/objdir/i686-pc-linux-gnu/libstdc++-v3/src/.libs -L/usr/local/distrib/objdir/gcc -L/usr/local/lib -lgmp -R/usr/local/lib -lm -L/usr/local/lib -lgcc_s -lc -R/usr/local/lib";
+ }
+ else {
+ assert(required_application);
+ if (s.length() > 0)
+ s += ' ';
+ s += "-lppl";
+ switch (required_interface) {
+ case C:
+ s += " -lppl_c";
+ break;
+ default:
+ break;
+ }
+ s += " -lgmpxx -lgmp";
+ }
+ portray("LDFLAGS", s);
+ }
+
+ if (required_license)
+ portray("LICENSE", PPL_LICENSE);
+
+ if (required_copying) {
+ extern const char* const COPYING_array[];
+ portray("COPYING", COPYING_array);
+ }
+
+ if (required_bugs) {
+ extern const char* const BUGS_array[];
+ portray("BUGS", BUGS_array);
+ }
+
+ if (required_credits) {
+ extern const char* const CREDITS_array[];
+ 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-config.cc.in b/src/ppl-config.cc.in
new file mode 100644
index 0000000..4ed2a06
--- /dev/null
+++ b/src/ppl-config.cc.in
@@ -0,0 +1,720 @@
+/* A program to enquire about the configuration of the PPL -*- C++ -*-
+ and of the applications using it.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl.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 HAVE_GETOPT_H
+#include <getopt.h>
+#endif
+
+#ifdef 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 2"
+
+std::string prefix;
+std::string exec_prefix;
+
+const char* variable_prefix = "PPL_";
+
+bool exec_prefix_set = false;
+
+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;
+
+#ifdef 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\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 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";
+
+#define OPTION_LETTERS "hF:I:ALp::e::OVMNRBEniblPCXDgcur"
+
+const char* program_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);
+}
+
+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);
+}
+
+void internal_error() {
+ fatal("internal error: please submit a bug report to ppl-devel at cs.unipr.it");
+}
+
+bool
+strcaseeq(const char* s1, const char* s2) {
+ while (*s1 && *s2
+ && tolower(static_cast<unsigned char>(*s1))
+ == tolower(static_cast<unsigned char>(*s2))) {
+ ++s1;
+ ++s2;
+ }
+ return tolower(static_cast<unsigned char>(*s1))
+ == tolower(static_cast<unsigned char>(*s2));
+}
+
+void
+process_options(int argc, char* argv[]) {
+ while (true) {
+#ifdef 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) {
+ 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) {
+ 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) {
+ 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", long(PPL_VERSION_MAJOR));
+
+ if (required_version_minor)
+ portray("VERSION_MINOR", long(PPL_VERSION_MINOR));
+
+ if (required_version_revision)
+ portray("VERSION_REVISION", long(PPL_VERSION_REVISION));
+
+ if (required_version_beta)
+ portray("VERSION_BETA", 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";
+ switch (required_interface) {
+ case C:
+ s += " -lppl_c";
+ break;
+ default:
+ break;
+ }
+ s += " -lgmpxx -lgmp";
+ }
+ portray("LDFLAGS", s);
+ }
+
+ if (required_license)
+ portray("LICENSE", PPL_LICENSE);
+
+ if (required_copying) {
+ extern const char* const COPYING_array[];
+ portray("COPYING", COPYING_array);
+ }
+
+ if (required_bugs) {
+ extern const char* const BUGS_array[];
+ portray("BUGS", BUGS_array);
+ }
+
+ if (required_credits) {
+ extern const char* const CREDITS_array[];
+ 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..f8b6702
--- /dev/null
+++ b/src/ppl.hh.dist
@@ -0,0 +1,41175 @@
+/* This is the header file of the Parma Polyhedra Library.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+// Automatically generated from PPL source file ../config.h line 1
+/* config.h. Generated by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+
+#ifndef PPL_ppl_config_h
+#define PPL_ppl_config_h 1
+
+
+/* Defined if the integral type to be used for coefficients is a checked one.
+ */
+/* #undef CHECKED_INTEGERS */
+
+/* The number of bits of coefficients; 0 if unbounded. */
+#define COEFFICIENT_BITS 0
+
+/* The integral type used to represent coefficients. */
+#define COEFFICIENT_TYPE mpz_class
+
+/* The binary format of C++ doubles, if supported; undefined otherwise. */
+#define CXX_DOUBLE_BINARY_FORMAT float_ieee754_double
+
+/* The binary format of C++ floats, if supported; undefined otherwise. */
+#define CXX_FLOAT_BINARY_FORMAT float_ieee754_single
+
+/* The binary format of C++ long doubles, if supported; undefined otherwise.
+ */
+#define CXX_LONG_DOUBLE_BINARY_FORMAT float_intel_double_extended
+
+/* Not zero if the C++ compiler supports __attribute__ ((weak)). */
+#define CXX_SUPPORTS_ATTRIBUTE_WEAK 1
+
+/* Not zero if the C++ compiler supports flexible arrays. */
+#define CXX_SUPPORTS_FLEXIBLE_ARRAYS 1
+
+/* Enable more assertions when defined. */
+/* #undef EXTRA_ROW_DEBUG */
+
+/* Defined if the integral type to be used for coefficients is GMP's one. */
+#define GMP_INTEGERS 1
+
+/* Not zero if GMP has been compiled with support for exceptions. */
+#define GMP_SUPPORTS_EXCEPTIONS 1
+
+/* Define to 1 if you have the declaration of `ffs', and to 0 if you don't. */
+#define HAVE_DECL_FFS 1
+
+/* Define to 1 if you have the declaration of `fma', and to 0 if you don't. */
+#define HAVE_DECL_FMA 1
+
+/* Define to 1 if you have the declaration of `fmaf', and to 0 if you don't.
+ */
+#define HAVE_DECL_FMAF 1
+
+/* Define to 1 if you have the declaration of `fmal', and to 0 if you don't.
+ */
+#define HAVE_DECL_FMAL 1
+
+/* Define to 1 if you have the declaration of `getenv', and to 0 if you don't.
+ */
+#define HAVE_DECL_GETENV 1
+
+/* Define to 1 if you have the declaration of `rintf', and to 0 if you don't.
+ */
+#define HAVE_DECL_RINTF 1
+
+/* Define to 1 if you have the declaration of `rintl', and to 0 if you don't.
+ */
+#define HAVE_DECL_RINTL 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_AS', and to 0 if you
+ don't. */
+#define HAVE_DECL_RLIMIT_AS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_DATA', and to 0 if you
+ don't. */
+#define HAVE_DECL_RLIMIT_DATA 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_RSS', and to 0 if you
+ don't. */
+#define HAVE_DECL_RLIMIT_RSS 1
+
+/* Define to 1 if you have the declaration of `RLIMIT_VMEM', and to 0 if you
+ don't. */
+#define HAVE_DECL_RLIMIT_VMEM 0
+
+/* Define to 1 if you have the declaration of `strtod', and to 0 if you don't.
+ */
+#define HAVE_DECL_STRTOD 1
+
+/* Define to 1 if you have the declaration of `strtof', and to 0 if you don't.
+ */
+#define HAVE_DECL_STRTOF 1
+
+/* Define to 1 if you have the declaration of `strtold', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRTOLD 1
+
+/* Define to 1 if you have the declaration of `strtoll', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRTOLL 1
+
+/* Define to 1 if you have the declaration of `strtoull', and to 0 if you
+ don't. */
+#define HAVE_DECL_STRTOULL 1
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the <fenv.h> header file. */
+#define HAVE_FENV_H 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define HAVE_GETOPT_H 1
+
+/* 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. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if the system has the type `int_fast16_t'. */
+#define HAVE_INT_FAST16_T 1
+
+/* Define to 1 if the system has the type `int_fast32_t'. */
+#define HAVE_INT_FAST32_T 1
+
+/* Define to 1 if the system has the type `int_fast64_t'. */
+#define HAVE_INT_FAST64_T 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <signal.h> header file. */
+#define HAVE_SIGNAL_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#define HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if the system has the type `uint_fast16_t'. */
+#define HAVE_UINT_FAST16_T 1
+
+/* Define to 1 if the system has the type `uint_fast32_t'. */
+#define HAVE_UINT_FAST32_T 1
+
+/* Define to 1 if the system has the type `uint_fast64_t'. */
+#define HAVE_UINT_FAST64_T 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if `_mp_alloc' is member of `__mpz_struct'. */
+#define HAVE___MPZ_STRUCT__MP_ALLOC 1
+
+/* Define to 1 if `_mp_d' is member of `__mpz_struct'. */
+#define HAVE___MPZ_STRUCT__MP_D 1
+
+/* Define to 1 if `_mp_size' is member of `__mpz_struct'. */
+#define HAVE___MPZ_STRUCT__MP_SIZE 1
+
+/* Defined if the integral type to be used for coefficients is a native one.
+ */
+/* #undef NATIVE_INTEGERS */
+
+/* Assertions are disabled when this is defined. */
+#define NDEBUG 1
+
+/* Name of package */
+#define PACKAGE "ppl"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "ppl-devel at cs.unipr.it"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "the Parma Polyhedra Library"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "the Parma Polyhedra Library 0.9"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "ppl"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "0.9"
+
+/* Not zero if the FPU can be controlled. */
+#define PPL_CAN_CONTROL_FPU 1
+
+/* This contains the options with which `configure' was invoked. */
+#define PPL_CONFIGURE_OPTIONS ""
+
+/* 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 a `double', as computed by sizeof. */
+#define SIZEOF_DOUBLE 8
+
+/* The size of a `float', as computed by sizeof. */
+#define SIZEOF_FLOAT 4
+
+/* The size of a `int', as computed by sizeof. */
+#define SIZEOF_INT 4
+
+/* The size of a `long', as computed by sizeof. */
+#define SIZEOF_LONG 4
+
+/* The size of a `long double', as computed by sizeof. */
+#define SIZEOF_LONG_DOUBLE 12
+
+/* The size of a `long long', as computed by sizeof. */
+#define SIZEOF_LONG_LONG 8
+
+/* The size of a `mp_limb_t', as computed by sizeof. */
+#define SIZEOF_MP_LIMB_T 4
+
+/* The size of a `size_t', as computed by sizeof. */
+#define SIZEOF_SIZE_T 4
+
+/* The size of a `unsigned', as computed by sizeof. */
+#define SIZEOF_UNSIGNED 4
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#define SIZEOF_UNSIGNED_LONG 4
+
+/* The size of a `unsigned long long', as computed by sizeof. */
+#define SIZEOF_UNSIGNED_LONG_LONG 8
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Version number of package */
+#define VERSION "0.9"
+
+/* Define to 1 if your processor stores words with the most significant byte
+ first (like Motorola and SPARC, unlike Intel and VAX). */
+/* #undef WORDS_BIGENDIAN */
+
+/* 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
+
+
+/*
+ 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.
+*/
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#endif /* !defined(PPL_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 0
+
+//! The minor number of the PPL version.
+/*! \ingroup PPL_CXX_interface */
+#define PPL_VERSION_MINOR 9
+
+//! 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 "0.9"
+
+namespace Parma_Polyhedra_Library {
+
+//! 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();
+
+} // 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.
+/*! \ingroup PPL_CXX_interface */
+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 pre-defined 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 // 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+namespace Implementation {
+} // namespace Implementation
+
+
+} // 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 function templates
+ <CODE>swap()</CODE> and <CODE>iter_swap()</CODE> (25.2.2, [lib.alg.swap]),
+ and for the 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/compiler.hh line 1
+/* C++ compiler related stuff.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Used to avoid unused variable warnings from the compiler.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+used(const T&) {
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Coefficient_traits_template.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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 1
+
+
+// Automatically generated from PPL source file ../src/Checked_Number.types.hh line 16
+
+namespace Parma_Polyhedra_Library {
+
+struct Checked_Number_Default_Policy;
+struct Extended_Number_Policy;
+
+template <typename T, typename Policy = Checked_Number_Default_Policy>
+class Checked_Number;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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 16
+#include <gmpxx.h>
+
+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://www.swox.com/gmp/</CODE>
+*/
+typedef mpz_class GMP_Integer;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for unbounded integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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 1
+
+
+// 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.defs.hh line 1
+/* Abstract checked arithmetic function container
+*/
+
+
+#include <iostream>
+#include <gmpxx.h>
+// 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 {
+
+//! Possible outcomes of a checked arithmetic computation.
+/*! \ingroup PPL_CXX_interface */
+enum Result {
+
+ VC_MASK = 48,
+
+ //! \hideinitializer Ordinary result class.
+ VC_NORMAL = 0,
+
+ //! \hideinitializer The computed result is inexact and rounded up.
+ V_LT = 1,
+
+ //! \hideinitializer The computed result is inexact and rounded down.
+ V_GT = 2,
+
+ //! \hideinitializer The computed result is exact.
+ V_EQ = 4,
+
+ //! \hideinitializer The computed result is inexact.
+ V_NE = V_LT | V_GT,
+
+ //! \hideinitializer The computed result may be inexact and rounded up.
+ V_LE = V_EQ | V_LT,
+
+ //! \hideinitializer The computed result may be inexact and rounded down.
+ V_GE = V_EQ | V_GT,
+
+ //! \hideinitializer The computed result may be inexact.
+ V_LGE = V_LT | V_EQ | V_GT,
+
+ //! \hideinitializer Negative infinity unrepresentable result class.
+ VC_MINUS_INFINITY = 16,
+
+ //! \hideinitializer A negative overflow occurred.
+ V_NEG_OVERFLOW = VC_MINUS_INFINITY | V_GT,
+
+ //! \hideinitializer Positive infinity unrepresentable result class.
+ VC_PLUS_INFINITY = 32,
+
+ //! \hideinitializer A positive overflow occurred.
+ V_POS_OVERFLOW = VC_PLUS_INFINITY | V_LT,
+
+ //! \hideinitializer Not a number result class.
+ VC_NAN = 48,
+
+ //! \hideinitializer Converting from unknown string.
+ V_CVT_STR_UNK = 49,
+
+ //! \hideinitializer Dividing by zero.
+ V_DIV_ZERO = 50,
+
+ //! \hideinitializer Adding two infinities having opposite signs.
+ V_INF_ADD_INF = 51,
+
+ //! \hideinitializer Dividing two infinities.
+ V_INF_DIV_INF = 52,
+
+ //! \hideinitializer Taking the modulus of an infinity.
+ V_INF_MOD = 53,
+
+ //! \hideinitializer Multiplying an infinity by zero.
+ V_INF_MUL_ZERO = 54,
+
+ //! \hideinitializer Subtracting two infinities having the same sign.
+ V_INF_SUB_INF = 55,
+
+ //! \hideinitializer Computing a remainder modulo zero.
+ V_MOD_ZERO = 56,
+
+ //! \hideinitializer Taking the square root of a negative number.
+ V_SQRT_NEG = 57,
+
+ //! \hideinitializer Unknown result due to intermediate negative overflow.
+ V_UNKNOWN_NEG_OVERFLOW = 58,
+
+ //! \hideinitializer Unknown result due to intermediate positive overflow.
+ V_UNKNOWN_POS_OVERFLOW = 59,
+
+ //! \hideinitializer Unordered comparison.
+ V_UNORD_COMP = 60
+};
+
+bool is_special(Result r);
+Result classify(Result r);
+Result sign(Result r);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Result.inlines.hh line 1
+/* Result supporting functions implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline Result
+classify(Result r) {
+ return static_cast<Result>(r & VC_MASK);
+}
+
+inline bool
+is_special(Result r) {
+ return classify(r) != VC_NORMAL;
+}
+
+inline Result
+sign(Result r) {
+ switch (r) {
+ case V_LT:
+ case V_EQ:
+ case V_GT:
+ case VC_NAN:
+ return r;
+ case VC_MINUS_INFINITY:
+ return V_LT;
+ case VC_PLUS_INFINITY:
+ return V_GT;
+ default:
+ assert(false);
+ return VC_NAN;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Result.defs.hh line 117
+
+// 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 HAVE_IEEEFP_H
+#include <ieeefp.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+typedef int fpu_rounding_direction_type;
+typedef int fpu_rounding_control_word_type;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+//! 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();
+
+} // namespace Parma_Polyhedra_Library
+
+#if defined(__i386__)
+// Automatically generated from PPL source file ../src/fpu-ia32.inlines.hh line 1
+/* ia32 floating point unit related functions.
+*/
+
+// Automatically generated from PPL source file ../src/fpu-ia32.inlines.hh line 24
+
+#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 FPU_TONEAREST 0
+#define FPU_DOWNWARD 0x400
+#define FPU_UPWARD 0x800
+#define FPU_TOWARDZERO 0xc00
+
+#define FPU_ROUNDING_MASK 0xc00
+
+#define PPL_FPU_CONTROL_DEFAULT_BASE 0x37f
+// This MUST be congruent with the definition of ROUND_DIRECT
+#define PPL_FPU_CONTROL_DEFAULT (PPL_FPU_CONTROL_DEFAULT_BASE | FPU_UPWARD)
+
+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));
+ return cw;
+}
+
+inline void
+fpu_set_control(unsigned short cw) {
+ __asm__ __volatile__ ("fldcw %0" : : "m" (cw));
+}
+
+inline int
+fpu_get_status() {
+ int sw;
+ __asm__ __volatile__ ("fnstsw %0" : "=a" (sw));
+ return sw;
+}
+
+inline void
+fpu_clear_status(unsigned short bits) {
+ /* There is no fldsw instruction */
+ ia32_fenv_t env;
+ __asm__ ("fnstenv %0" : "=m" (env));
+ env.status_word &= ~bits;
+ __asm__ ("fldenv %0" : : "m" (env));
+}
+
+inline void
+fpu_clear_exceptions() {
+ __asm__ __volatile__ ("fnclex" : /* No outputs. */);
+}
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return fpu_get_control() & FPU_ROUNDING_MASK;
+}
+
+inline void
+fpu_set_rounding_direction(fpu_rounding_direction_type dir) {
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction(fpu_rounding_direction_type dir) {
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT_BASE | dir);
+ return 0;
+}
+
+inline void
+fpu_reset_inexact() {
+ fpu_clear_exceptions();
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+ fpu_reset_inexact();
+ return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type) {
+ fpu_set_control(PPL_FPU_CONTROL_DEFAULT);
+}
+
+inline int
+fpu_check_inexact() {
+ return (fpu_get_status() & FPU_INEXACT) ? 1 : 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 74
+#elif defined(HAVE_FENV_H)
+// Automatically generated from PPL source file ../src/fpu-c99.inlines.hh line 1
+/* C99 Floating point unit related functions.
+*/
+
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+
+#ifdef FE_TONEAREST
+#define FPU_TONEAREST FE_TONEAREST
+#endif
+#ifdef FE_UPWARD
+#define FPU_UPWARD FE_UPWARD
+#endif
+#ifdef FE_DOWNWARD
+#define FPU_DOWNWARD FE_DOWNWARD
+#endif
+#ifdef FE_TOWARDZERO
+#define FPU_TOWARDZERO FE_TOWARDZERO
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return 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) {
+ fpu_rounding_direction_type old = fegetround();
+ fesetround(dir);
+ return old;
+}
+
+inline void
+fpu_reset_inexact() {
+ feclearexcept(FE_INEXACT);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+ fpu_reset_inexact();
+ return fpu_save_rounding_direction(dir);
+}
+
+inline void
+fpu_restore_rounding_direction(fpu_rounding_control_word_type w) {
+ fesetround(w);
+}
+
+inline int
+fpu_check_inexact() {
+ return fetestexcept(FE_INEXACT) != 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(HAVE_FENV_H)
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 76
+#elif defined(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 HAVE_IEEEFP_H
+#include <ieeefp.h>
+
+#define FPU_TONEAREST ((int) FP_RN)
+#define FPU_UPWARD ((int) FP_RP)
+#define FPU_DOWNWARD ((int) FP_RM)
+#define FPU_TOWARDZERO ((int) FP_RZ)
+
+namespace Parma_Polyhedra_Library {
+
+inline fpu_rounding_direction_type
+fpu_get_rounding_direction() {
+ return 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 fpsetround((fp_rnd) dir);
+}
+
+inline void
+fpu_reset_inexact() {
+ fp_except except = fpgetmask();
+ except &= ~FP_X_IMP;
+ fpsetmask(except);
+}
+
+inline fpu_rounding_control_word_type
+fpu_save_rounding_direction_reset_inexact(fpu_rounding_direction_type dir) {
+ fpu_reset_inexact();
+ return fpu_save_rounding_direction((fp_rnd) dir);
+}
+
+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(HAVE_IEEEFP_H)
+// Automatically generated from PPL source file ../src/fpu.defs.hh line 81
+#else
+// 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 int
+fpu_get_rounding_direction() {
+ throw std::logic_error("PPL::fpu_get_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_set_rounding_direction(int dir) {
+ throw std::logic_error("PPL::fpu_set_rounding_direction():"
+ " cannot control the FPU");
+}
+
+inline int
+fpu_save_rounding_direction(int dir) {
+ 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 int
+fpu_save_rounding_direction_reset_inexact(int dir) {
+ throw std::logic_error("PPL::fpu_save_rounding_direction_reset_inexact():"
+ " cannot control the FPU");
+}
+
+inline void
+fpu_restore_rounding_direction(int dir) {
+ 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 83
+#endif
+
+// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 28
+
+namespace Parma_Polyhedra_Library {
+
+//! Rounding directions for arithmetic computations.
+/*! \ingroup PPL_CXX_interface */
+enum Rounding_Dir {
+ /*! \hideinitializer
+ Round toward \f$-\infty\f$.
+ */
+ ROUND_DOWN = FPU_DOWNWARD,
+
+ /*! \hideinitializer
+ Round toward \f$+\infty\f$.
+ */
+ ROUND_UP = FPU_UPWARD,
+
+ /*! \hideinitializer
+ Rounding is delegated to lower level. Result info is evaluated lazily.
+ */
+ ROUND_IGNORE = -1,
+ ROUND_NATIVE = ROUND_IGNORE,
+
+ /*! \hideinitializer
+ Rounding is not needed: client code must ensure the operation is exact.
+ */
+ ROUND_NOT_NEEDED = -2,
+
+ ROUND_DIRECT = ROUND_UP,
+ ROUND_INVERSE = ROUND_DOWN
+};
+
+/*! \brief
+ Returns the inverse rounding mode of \p dir,
+ <CODE>ROUND_IGNORE</CODE> being the inverse of itself.
+*/
+Rounding_Dir inverse(Rounding_Dir dir);
+
+} // 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 27
+
+namespace Parma_Polyhedra_Library {
+
+/*! \relates Parma_Polyhedra_Library::Rounding_Dir */
+inline Rounding_Dir
+inverse(Rounding_Dir dir) {
+ switch (dir) {
+ case ROUND_UP:
+ return ROUND_DOWN;
+ case ROUND_DOWN:
+ return ROUND_UP;
+ case ROUND_IGNORE:
+ return ROUND_IGNORE;
+ default:
+ assert(false);
+ return ROUND_IGNORE;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Rounding_Dir.defs.hh line 68
+
+
+// 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 28
+
+namespace Parma_Polyhedra_Library {
+
+class Numeric_Format {
+};
+
+} // namespace Parma_Polyhedra_Library
+
+
+// Automatically generated from PPL source file ../src/checked.defs.hh line 30
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A policy checking for overflows.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Check_Overflow_Policy {
+ static const int check_overflow = 1;
+ static const int check_inf_add_inf = 0;
+ static const int check_inf_sub_inf = 0;
+ static const int check_inf_mul_zero = 0;
+ static const int check_div_zero = 0;
+ static const int check_inf_div_inf = 0;
+ static const int check_inf_mod = 0;
+ static const int check_sqrt_neg = 0;
+ static const int handle_nan = 0;
+ static const int handle_infinity = 0;
+ static const int convertible = 1;
+ static const int fpu_check_inexact = 0;
+ static const int check_nan_args = 1;
+};
+
+// 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 FUNCTION_CLASS(name) name ## _function_struct
+
+#define DECLARE_FUN1_0_0(name, ret_type, qual, type) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg); \
+}
+
+#define DECLARE_FUN1_0_1(name, ret_type, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1); \
+}
+
+#define DECLARE_FUN1_0_2(name, ret_type, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_0_3(name, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(arg, a1, a2, a3); \
+}
+
+#define DECLARE_FUN1_1_1(name, ret_type, before1, qual, type, after1) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1); \
+}
+
+#define DECLARE_FUN1_1_2(name, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(b1, arg, a1, a2); \
+}
+
+#define DECLARE_FUN1_2_2(name, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy, typename type> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type> \
+inline ret_type name(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type>::function(b1, b2, arg, a1, a2); \
+}
+
+#define DECLARE_FUN2_0_0(name, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2); \
+}
+
+#define DECLARE_FUN2_0_1(name, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1); \
+}
+
+#define DECLARE_FUN2_0_2(name, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy, typename type1, typename type2> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, after1 a1, after2 a2) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2>::function(arg1, arg2, a1, a2); \
+}
+
+#define DECLARE_FUN3_0_1(name, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy, typename type1, typename type2, typename type3> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, typename type1, typename type2, typename type3> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, qual3 type3& arg3, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2, type3>::function(arg1, arg2, arg3, a1); \
+}
+
+#define DECLARE_FUN5_0_1(name, ret_type, \
+ qual1, type1, qual2, type2, qual3, type3, \
+ qual4, type4, qual5, type5, \
+ after1) \
+template <typename Policy, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+struct FUNCTION_CLASS(name); \
+template <typename Policy, \
+ typename type1, typename type2, typename type3, \
+ typename type4, typename type5> \
+inline ret_type name(qual1 type1& arg1, qual2 type2& arg2, \
+ qual3 type3& arg3, qual4 type4& arg4, \
+ qual5 type5& arg5, after1 a1) { \
+ return FUNCTION_CLASS(name)<Policy, type1, type2, type3, type4, type5> \
+ ::function(arg1, arg2, arg3, arg4, arg5, a1); \
+}
+
+#define SPECIALIZE_FUN1_0_0(name, suf, ret_type, qual, type) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg) { \
+ return name ## _ ## suf<Policy>(arg); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_0_1(name, suf, ret_type, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_0_2(name, suf, ret_type, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(arg, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_0_3(name, suf, ret_type, qual, type, after1, after2, after3) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(qual type& arg, after1 a1, after2 a2, after3 a3) { \
+ return name ## _ ## suf<Policy>(arg, a1, a2, a3); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_1_1(name, suf, ret_type, before1, qual, type, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(before1 b1, qual type& arg, after1 a1) { \
+ return name ## _ ## suf<Policy>(b1, arg, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_1_2(name, suf, ret_type, before1, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(before1 b1, qual type& arg, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(b1, arg, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN1_2_2(name, suf, ret_type, before1, before2, qual, type, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type> { \
+ static inline ret_type function(before1 b1, before2 b2, qual type& arg, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(b1, b2, arg, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN2_0_0(name, suf, ret_type, qual1, type1, qual2, type2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+ static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2) { \
+ return name ## _ ## suf<Policy>(arg1, arg2); \
+ } \
+};
+
+#define SPECIALIZE_FUN2_0_1(name, suf, ret_type, qual1, type1, qual2, type2, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+ static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN2_0_2(name, suf, ret_type, qual1, type1, qual2, type2, after1, after2) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name)<Policy, type1, type2> { \
+ static inline ret_type function(qual1 type1& arg1, qual2 type2 &arg2, after1 a1, after2 a2) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, a1, a2); \
+ } \
+};
+
+#define SPECIALIZE_FUN3_0_1(name, suf, ret_type, qual1, type1, qual2, type2, qual3, type3, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name) <Policy, type1, type2, type3> { \
+ static inline Result function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, arg3, a1); \
+ } \
+};
+
+#define SPECIALIZE_FUN5_0_1(name, suf, ret_type, \
+ qual1, type1, qual2, type2, qual3, type3, \
+ qual4, type4, qual5, type5, after1) \
+template <typename Policy> \
+struct FUNCTION_CLASS(name) <Policy, \
+ type1, type2, type3, type4, type5> { \
+ static inline Result \
+ function(qual1 type1& arg1, qual2 type2 &arg2, qual3 type3 &arg3, \
+ qual4 type4 &arg4, qual5 type5 &arg5, after1 a1) { \
+ return name ## _ ## suf<Policy>(arg1, arg2, arg3, arg4, arg5, a1); \
+ } \
+};
+
+#define nonconst
+
+#define SPECIALIZE_COPY(suf, Type) \
+ SPECIALIZE_FUN2_0_0(copy, suf, void, nonconst, Type, const, Type)
+#define SPECIALIZE_SGN(suf, From) \
+ SPECIALIZE_FUN1_0_0(sgn, suf, Result, const, From)
+#define SPECIALIZE_CMP(suf, Type1, Type2) \
+ SPECIALIZE_FUN2_0_0(cmp, suf, Result, const, Type1, const, Type2)
+#define SPECIALIZE_SET_SPECIAL(suf, Type) \
+ SPECIALIZE_FUN1_0_1(set_special, suf, Result, nonconst, Type, Result)
+#define SPECIALIZE_CLASSIFY(suf, Type) \
+ SPECIALIZE_FUN1_0_3(classify, suf, Result, const, Type, bool, bool, bool)
+#define SPECIALIZE_IS_NAN(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_nan, suf, bool, const, Type)
+#define SPECIALIZE_IS_MINF(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_minf, suf, bool, const, Type)
+#define SPECIALIZE_IS_PINF(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_pinf, suf, bool, const, Type)
+#define SPECIALIZE_IS_INT(suf, Type) \
+ SPECIALIZE_FUN1_0_0(is_int, suf, bool, const, Type)
+#define SPECIALIZE_CONSTRUCT(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(construct, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ASSIGN(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(assign, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_NEG(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(neg, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ABS(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(abs, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_SQRT(suf, To, From) \
+ SPECIALIZE_FUN2_0_1(sqrt, suf, Result, nonconst, To, const, From, Rounding_Dir)
+#define SPECIALIZE_ADD(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(add, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(sub, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_DIV(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(div, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_REM(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(rem, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_MUL2EXP(suf, To, From) \
+ SPECIALIZE_FUN2_0_2(mul2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_DIV2EXP(suf, To, From) \
+ SPECIALIZE_FUN2_0_2(div2exp, suf, Result, nonconst, To, const, From, int, Rounding_Dir)
+#define SPECIALIZE_ADD_MUL(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(add_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_SUB_MUL(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(sub_mul, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCD(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(gcd, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_GCDEXT(suf, To1, From1, From2, To2, To3) \
+ SPECIALIZE_FUN5_0_1(gcdext, suf, Result, nonconst, To1, \
+ const, From1, const, From2, nonconst, To2, nonconst, To3, Rounding_Dir)
+#define SPECIALIZE_LCM(suf, To, From1, From2) \
+ SPECIALIZE_FUN3_0_1(lcm, suf, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+#define SPECIALIZE_INPUT(suf, Type) \
+ SPECIALIZE_FUN1_0_2(input, suf, Result, nonconst, Type, std::istream&, Rounding_Dir)
+#define SPECIALIZE_OUTPUT(suf, Type) \
+ SPECIALIZE_FUN1_1_2(output, suf, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+
+DECLARE_FUN2_0_0(copy, void, nonconst, Type1, const, Type2)
+DECLARE_FUN1_0_0(sgn, Result, const, From)
+DECLARE_FUN2_0_0(cmp, Result, const, Type1, const, Type2)
+DECLARE_FUN1_0_1(set_special, Result, nonconst, Type, Result)
+DECLARE_FUN1_0_3(classify, Result, const, Type, bool, bool, bool)
+DECLARE_FUN1_0_0(is_nan, bool, const, Type)
+DECLARE_FUN1_0_0(is_minf, bool, const, Type)
+DECLARE_FUN1_0_0(is_pinf, bool, const, Type)
+DECLARE_FUN1_0_0(is_int, bool, const, Type)
+DECLARE_FUN2_0_1(construct, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(assign, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(neg, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(abs, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN2_0_1(sqrt, Result, nonconst, To, const, From, Rounding_Dir)
+DECLARE_FUN3_0_1(add, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(mul, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(div, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(rem, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN2_0_2(mul2exp, Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN2_0_2(div2exp, Result, nonconst, To, const, From, int, Rounding_Dir)
+DECLARE_FUN3_0_1(add_mul, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(sub_mul, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN3_0_1(gcd, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN5_0_1(gcdext, Result, nonconst, To1, const, From1, const, From2,
+ nonconst, To2, nonconst, To3, Rounding_Dir)
+DECLARE_FUN3_0_1(lcm, Result, nonconst, To, const, From1, const, From2, Rounding_Dir)
+DECLARE_FUN1_0_2(input, Result, nonconst, Type, std::istream&, Rounding_Dir)
+DECLARE_FUN1_1_2(output, Result, std::ostream&, const, Type, const Numeric_Format&, Rounding_Dir)
+
+template <typename Policy, typename To>
+Result round(To& to, Result r, Rounding_Dir dir);
+
+Result input_mpq(mpq_class& to, std::istream& is);
+
+} // namespace Checked
+
+struct Minus_Infinity {
+};
+
+struct Plus_Infinity {
+};
+
+struct Not_A_Number {
+};
+
+extern Minus_Infinity MINUS_INFINITY;
+extern Plus_Infinity PLUS_INFINITY;
+extern Not_A_Number NOT_A_NUMBER;
+
+} // 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/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 */
+enum Relation_Symbol {
+ //! Less than.
+ LESS_THAN,
+ //! Less than or equal to.
+ LESS_THAN_OR_EQUAL,
+ //! Equal to.
+ EQUAL,
+ //! Greater than or equal to.
+ GREATER_THAN_OR_EQUAL,
+ //! Greater 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
+};
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked.inlines.hh line 25
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(construct)<Policy, Type, Type> {
+ static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+ new (&to) Type(from);
+ return V_EQ;
+ }
+};
+
+template <typename Policy, typename To, typename From>
+struct FUNCTION_CLASS(construct) {
+ static inline Result function(To& to, const From& from, Rounding_Dir dir) {
+ new (&to) To();
+ return assign<Policy>(to, from, dir);
+ }
+};
+
+template <typename Policy, typename Type>
+struct FUNCTION_CLASS(assign)<Policy, Type, Type> {
+ static inline Result function(Type& to, const Type& from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+ }
+};
+
+template <typename Policy, typename Type>
+inline void
+copy_generic(Type& to, const Type& from) {
+ to = from;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+abs_generic(To& to, const From& from, Rounding_Dir dir) {
+ if (from < 0)
+ return neg<Policy>(to, from, dir);
+ to = from;
+ return V_EQ;
+}
+
+inline Result
+neg(Result r) {
+ assert(!is_special(r));
+ Result ret = static_cast<Result>(r & V_EQ);
+ if (r & V_LT)
+ ret = static_cast<Result>(ret | V_GT);
+ if (r & V_GT)
+ ret = static_cast<Result>(ret | V_LT);
+ return ret;
+}
+
+inline Result
+add(Result r1, Result r2) {
+ assert(!is_special(r1));
+ assert(!is_special(r2));
+ if (r1 == V_EQ)
+ return r2;
+ if (r2 == V_EQ)
+ return r1;
+ if (((r1 & V_LT) && (r2 & V_GT))
+ || ((r1 & V_GT) && (r2 & V_LT)))
+ return V_LGE;
+ return static_cast<Result>((((r1 & r2) & V_EQ) ? V_EQ : 0) |
+ (r1 & (V_LT | V_GT)));
+}
+
+inline Result
+sub(Result r1, Result r2) {
+ return add(r1, neg(r2));
+}
+
+template <typename Policy, typename To, typename From>
+inline void
+gcd_exact_noabs(To& to, const From& x, const From& y) {
+ To nx = x;
+ To ny = y;
+ To rm;
+ while (ny != 0) {
+ /* The following is derived from the assumption that x % y
+ is always representable. This is true for both native integers
+ and iec559 floating point numbers */
+ rem<Policy>(rm, nx, ny, ROUND_NOT_NEEDED);
+ nx = ny;
+ ny = rm;
+ }
+ to = nx;
+}
+
+template <typename Policy, typename To, typename From1, typename From2>
+inline Result
+gcd_exact(To& to, const From1& x, const From2& y, Rounding_Dir dir) {
+ gcd_exact_noabs<Policy>(to, x, y);
+ return abs<Policy>(to, to, dir);
+}
+
+template <typename Policy, typename To1,
+ typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_exact(To1& to, const From1& x, const From2& y, To2& s, To3& t,
+ Rounding_Dir dir) {
+ 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<Policy>(to, x, dir);
+ }
+ }
+
+ s = 1;
+ t = 0;
+ bool negative_x = x < 0;
+ bool negative_y = y < 0;
+
+ Result r;
+ r = abs<Policy>(to, x, dir);
+ if (r != V_EQ)
+ return r;
+
+ From2 ay;
+ r = abs<Policy>(ay, y, dir);
+ if (r != V_EQ)
+ return r;
+
+ // If COPY_GMP is defined then s is favoured 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 behaviour of GMP.
+#define COPY_GMP
+#ifdef COPY_GMP
+ if (to == ay)
+ goto sign_check;
+#endif
+
+ {
+ To2 v1 = 0;
+ To3 v2 = 1;
+ To1 v3 = static_cast<To1>(ay);
+ 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 COPY_GMP
+ sign_check:
+#endif
+ if (negative_x) {
+ r = neg<Policy>(s, s, dir);
+ if (r != V_EQ)
+ return r;
+ }
+ if (negative_y)
+ return neg<Policy>(t, t, dir);
+ return V_EQ;
+}
+
+template <typename 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 nx, ny;
+ Result r;
+ r = abs<Policy>(nx, x, dir);
+ if (r != V_EQ)
+ return r;
+ r = abs<Policy>(ny, y, dir);
+ if (r != V_EQ)
+ return r;
+ To gcd;
+ gcd_exact_noabs<Policy>(gcd, nx, ny);
+ /* The following is derived from the assumption that x / gcd(x, y)
+ is always representable. This is true for both native integers
+ and iec559 floating point numbers */
+ div<Policy>(to, nx, gcd, ROUND_NOT_NEEDED);
+ return mul<Policy>(to, to, ny, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_generic(const Type& x) {
+ if (x > 0)
+ return V_GT;
+ if (x == 0)
+ return V_EQ;
+ return V_LT;
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_generic(const Type& x, const Type& y) {
+ if (x > y)
+ return V_GT;
+ if (x < y)
+ return V_LT;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+input_generic(Type& to, std::istream& is, Rounding_Dir dir) {
+ mpq_class q;
+ Result r = input_mpq(q, is);
+ if (r == VC_MINUS_INFINITY)
+ return assign<Policy>(to, MINUS_INFINITY, dir);
+ if (r == VC_PLUS_INFINITY)
+ return assign<Policy>(to, PLUS_INFINITY, dir);
+ if (r == V_EQ)
+ return assign<Policy>(to, q, dir);
+ return set_special<Policy>(to, r);
+}
+
+template <typename T>
+inline memory_size_type
+external_memory_in_bytes(T) {
+ return 0;
+}
+
+template <typename T>
+inline memory_size_type
+total_memory_in_bytes(T& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // 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/Limits.hh line 1
+/* Limits for native integer types.
+*/
+
+
+#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 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 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 SIZEOF_UNSIGNED_LONG_LONG == 8
+#define ULLONG_MAX 0xffffffffffffffffULL
+#endif
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+/*
+ The only reason to use these definitions instead of std::numeric_limits
+ is a missing optimization in GCC 3.4.1.
+*/
+
+template <typename T>
+struct Limits;
+
+#define signed_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+ static const type min = prefix ## _MIN; \
+ static const type max = prefix ## _MAX; \
+}
+
+#define unsigned_limits(type, prefix) \
+template <> \
+struct Limits<type> { \
+ static const type min = 0; \
+ static const type max = prefix ## _MAX; \
+}
+
+signed_limits(signed char, SCHAR);
+signed_limits(short, SHRT);
+signed_limits(int, INT);
+signed_limits(long, LONG);
+signed_limits(long long, LLONG);
+
+unsigned_limits(unsigned char, UCHAR);
+unsigned_limits(unsigned short, USHRT);
+unsigned_limits(unsigned int, UINT);
+unsigned_limits(unsigned long, ULONG);
+unsigned_limits(unsigned long long, ULLONG);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/checked_int.inlines.hh line 27
+#include <cerrno>
+#include <cstdlib>
+#include <climits>
+#include <string>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#if !HAVE_DECL_STRTOLL
+signed long long
+strtoll(const char* nptr, char** endptr, int base);
+#endif
+
+#if !HAVE_DECL_STRTOULL
+unsigned long long
+strtoull(const char* nptr, char** endptr, int base);
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+#ifndef HAVE_INT_FAST16_T
+typedef int16_t int_fast16_t;
+#endif
+
+#ifndef HAVE_INT_FAST32_T
+typedef int32_t int_fast32_t;
+#endif
+
+#ifndef HAVE_INT_FAST64_T
+typedef int64_t int_fast64_t;
+#endif
+
+#ifndef HAVE_UINT_FAST16_T
+typedef uint16_t uint_fast16_t;
+#endif
+
+#ifndef HAVE_UINT_FAST32_T
+typedef uint32_t uint_fast32_t;
+#endif
+
+#ifndef HAVE_UINT_FAST64_T
+typedef uint64_t uint_fast64_t;
+#endif
+
+template <typename Policy, typename Type>
+struct Extended_Int {
+ static const Type plus_infinity = Limits<Type>::max;
+ static const Type minus_infinity = (Limits<Type>::min >= 0
+ ? Limits<Type>::max - 1
+ : Limits<Type>::min);
+ static const Type not_a_number = (Limits<Type>::min >= 0
+ ? Limits<Type>::max - Policy::handle_infinity * 2
+ : Limits<Type>::min + Policy::handle_infinity);
+ static const Type min = (Limits<Type>::min
+ + (Limits<Type>::min >= 0 ? 0
+ : (Policy::handle_infinity + Policy::handle_nan)));
+ static const Type max = (Limits<Type>::max
+ - (Limits<Type>::min >= 0
+ ? (2 * Policy::handle_infinity + Policy::handle_nan)
+ : Policy::handle_infinity));
+};
+
+template <typename Policy, typename To>
+inline Result
+set_neg_overflow_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_UP) {
+ to = Extended_Int<Policy, To>::min;
+ return V_LT;
+ }
+ else {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT;
+ }
+ return V_NEG_OVERFLOW;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+set_pos_overflow_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ to = Extended_Int<Policy, To>::max;
+ return V_GT;
+ }
+ else {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT;
+ }
+ return V_POS_OVERFLOW;
+ }
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int_no_overflow(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ 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 (dir == ROUND_UP) {
+ to++;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_lt_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ if (to == Extended_Int<Policy, To>::min) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_GT;
+ }
+ return V_NEG_OVERFLOW;
+ } else {
+ to--;
+ return V_GT;
+ }
+ }
+ return V_LT;
+}
+
+template <typename Policy, typename To>
+inline Result
+round_gt_int(To& to, Rounding_Dir dir) {
+ if (dir == ROUND_UP) {
+ if (to == Extended_Int<Policy, To>::max) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_LT;
+ }
+ return V_POS_OVERFLOW;
+ } else {
+ to++;
+ return V_LT;
+ }
+ }
+ return V_GT;
+}
+
+SPECIALIZE_COPY(generic, signed char)
+SPECIALIZE_COPY(generic, signed short)
+SPECIALIZE_COPY(generic, signed int)
+SPECIALIZE_COPY(generic, signed long)
+SPECIALIZE_COPY(generic, signed long long)
+SPECIALIZE_COPY(generic, unsigned char)
+SPECIALIZE_COPY(generic, unsigned short)
+SPECIALIZE_COPY(generic, unsigned int)
+SPECIALIZE_COPY(generic, unsigned long)
+SPECIALIZE_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::handle_nan
+ && (nan || sign)
+ && v == Extended_Int<Policy, Type>::not_a_number)
+ return VC_NAN;
+ if (!inf & !sign)
+ return VC_NORMAL;
+ if (Policy::handle_infinity) {
+ if (v == Extended_Int<Policy, Type>::minus_infinity)
+ return inf ? VC_MINUS_INFINITY : V_LT;
+ if (v == Extended_Int<Policy, Type>::plus_infinity)
+ return inf ? VC_PLUS_INFINITY : V_GT;
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(int, signed char)
+SPECIALIZE_CLASSIFY(int, signed short)
+SPECIALIZE_CLASSIFY(int, signed int)
+SPECIALIZE_CLASSIFY(int, signed long)
+SPECIALIZE_CLASSIFY(int, signed long long)
+SPECIALIZE_CLASSIFY(int, unsigned char)
+SPECIALIZE_CLASSIFY(int, unsigned short)
+SPECIALIZE_CLASSIFY(int, unsigned int)
+SPECIALIZE_CLASSIFY(int, unsigned long)
+SPECIALIZE_CLASSIFY(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_nan_int(const Type v) {
+ return Policy::handle_nan && v == Extended_Int<Policy, Type>::not_a_number;
+}
+
+SPECIALIZE_IS_NAN(int, signed char)
+SPECIALIZE_IS_NAN(int, signed short)
+SPECIALIZE_IS_NAN(int, signed int)
+SPECIALIZE_IS_NAN(int, signed long)
+SPECIALIZE_IS_NAN(int, signed long long)
+SPECIALIZE_IS_NAN(int, unsigned char)
+SPECIALIZE_IS_NAN(int, unsigned short)
+SPECIALIZE_IS_NAN(int, unsigned int)
+SPECIALIZE_IS_NAN(int, unsigned long)
+SPECIALIZE_IS_NAN(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_minf_int(const Type v) {
+ return Policy::handle_infinity
+ && v == Extended_Int<Policy, Type>::minus_infinity;
+}
+
+SPECIALIZE_IS_MINF(int, signed char)
+SPECIALIZE_IS_MINF(int, signed short)
+SPECIALIZE_IS_MINF(int, signed int)
+SPECIALIZE_IS_MINF(int, signed long)
+SPECIALIZE_IS_MINF(int, signed long long)
+SPECIALIZE_IS_MINF(int, unsigned char)
+SPECIALIZE_IS_MINF(int, unsigned short)
+SPECIALIZE_IS_MINF(int, unsigned int)
+SPECIALIZE_IS_MINF(int, unsigned long)
+SPECIALIZE_IS_MINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_pinf_int(const Type v) {
+ return Policy::handle_infinity
+ && v == Extended_Int<Policy, Type>::plus_infinity;
+}
+
+SPECIALIZE_IS_PINF(int, signed char)
+SPECIALIZE_IS_PINF(int, signed short)
+SPECIALIZE_IS_PINF(int, signed int)
+SPECIALIZE_IS_PINF(int, signed long)
+SPECIALIZE_IS_PINF(int, signed long long)
+SPECIALIZE_IS_PINF(int, unsigned char)
+SPECIALIZE_IS_PINF(int, unsigned short)
+SPECIALIZE_IS_PINF(int, unsigned int)
+SPECIALIZE_IS_PINF(int, unsigned long)
+SPECIALIZE_IS_PINF(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline bool
+is_int_int(const Type v) {
+ return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(int, signed char)
+SPECIALIZE_IS_INT(int, signed short)
+SPECIALIZE_IS_INT(int, signed int)
+SPECIALIZE_IS_INT(int, signed long)
+SPECIALIZE_IS_INT(int, signed long long)
+SPECIALIZE_IS_INT(int, unsigned char)
+SPECIALIZE_IS_INT(int, unsigned short)
+SPECIALIZE_IS_INT(int, unsigned int)
+SPECIALIZE_IS_INT(int, unsigned long)
+SPECIALIZE_IS_INT(int, unsigned long long)
+
+template <typename Policy, typename Type>
+inline Result
+set_special_int(Type& v, Result r) {
+ Result t = classify(r);
+ if (Policy::handle_nan && t == VC_NAN)
+ v = Extended_Int<Policy, Type>::not_a_number;
+ else if (Policy::handle_infinity) {
+ switch (t) {
+ case VC_MINUS_INFINITY:
+ v = Extended_Int<Policy, Type>::minus_infinity;
+ break;
+ case VC_PLUS_INFINITY:
+ v = Extended_Int<Policy, Type>::plus_infinity;
+ break;
+ default:
+ break;
+ }
+ }
+ return r;
+}
+
+SPECIALIZE_SET_SPECIAL(int, signed char)
+SPECIALIZE_SET_SPECIAL(int, signed short)
+SPECIALIZE_SET_SPECIAL(int, signed int)
+SPECIALIZE_SET_SPECIAL(int, signed long)
+SPECIALIZE_SET_SPECIAL(int, signed long long)
+SPECIALIZE_SET_SPECIAL(int, unsigned char)
+SPECIALIZE_SET_SPECIAL(int, unsigned short)
+SPECIALIZE_SET_SPECIAL(int, unsigned int)
+SPECIALIZE_SET_SPECIAL(int, unsigned long)
+SPECIALIZE_SET_SPECIAL(int, unsigned long long)
+
+template <typename 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)) {
+ if (CHECK_P(Policy::check_overflow,
+ from < static_cast<From>(Extended_Int<Policy, To>::min)))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (CHECK_P(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+template <typename 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(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_unsigned_int_signed_int(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_overflow, from < 0))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (sizeof(To) < sizeof(From)) {
+ if (CHECK_P(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+template <typename 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)) {
+ if (CHECK_P(Policy::check_overflow,
+ from > static_cast<From>(Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = To(from);
+ return V_EQ;
+}
+
+
+#define ASSIGN2_SIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_UNSIGNED_SIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Larger, Smaller)
+
+#define ASSIGN2_SIGNED_UNSIGNED(Smaller, Larger) \
+SPECIALIZE_ASSIGN(signed_int_unsigned_int, Smaller, Larger) \
+SPECIALIZE_ASSIGN(unsigned_int_signed_int, Larger, Smaller)
+
+#define ASSIGN_SIGNED(Type) \
+SPECIALIZE_ASSIGN(signed_int_signed_int, Type, Type)
+#define ASSIGN_UNSIGNED(Type) \
+SPECIALIZE_ASSIGN(unsigned_int_unsigned_int, Type, Type)
+
+ASSIGN_SIGNED(signed char)
+ASSIGN_SIGNED(signed short)
+ASSIGN_SIGNED(signed int)
+ASSIGN_SIGNED(signed long)
+ASSIGN_SIGNED(signed long long)
+ASSIGN_UNSIGNED(unsigned char)
+ASSIGN_UNSIGNED(unsigned short)
+ASSIGN_UNSIGNED(unsigned int)
+ASSIGN_UNSIGNED(unsigned long)
+ASSIGN_UNSIGNED(unsigned long long)
+
+ASSIGN2_SIGNED_SIGNED(signed char, signed short)
+ASSIGN2_SIGNED_SIGNED(signed char, signed int)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long)
+ASSIGN2_SIGNED_SIGNED(signed char, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed int)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long)
+ASSIGN2_SIGNED_SIGNED(signed short, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long)
+ASSIGN2_SIGNED_SIGNED(signed int, signed long long)
+ASSIGN2_SIGNED_SIGNED(signed long, signed long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned short)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned char, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned int)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned short, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned int, unsigned long long)
+ASSIGN2_UNSIGNED_UNSIGNED(unsigned long, unsigned long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed short)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned char, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed int)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned short, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned int, signed long long)
+ASSIGN2_UNSIGNED_SIGNED(unsigned long, signed long long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned char)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed char, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned short)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed short, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned int)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed int, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long)
+ASSIGN2_SIGNED_UNSIGNED(signed long, unsigned long long)
+ASSIGN2_SIGNED_UNSIGNED(signed long long, unsigned long long)
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_int_float(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_overflow, (from < Extended_Int<Policy, To>::min)))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (CHECK_P(Policy::check_overflow, (from > Extended_Int<Policy, To>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = static_cast<To>(from);
+ if (dir == ROUND_IGNORE)
+ return V_LGE;
+ if (from < to)
+ return round_lt_int<Policy>(to, dir);
+ else if (from > to)
+ return round_gt_int<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(int_float, signed char, float)
+SPECIALIZE_ASSIGN(int_float, signed short, float)
+SPECIALIZE_ASSIGN(int_float, signed int, float)
+SPECIALIZE_ASSIGN(int_float, signed long, float)
+SPECIALIZE_ASSIGN(int_float, signed long long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned char, float)
+SPECIALIZE_ASSIGN(int_float, unsigned short, float)
+SPECIALIZE_ASSIGN(int_float, unsigned int, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long, float)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, float)
+
+SPECIALIZE_ASSIGN(int_float, signed char, double)
+SPECIALIZE_ASSIGN(int_float, signed short, double)
+SPECIALIZE_ASSIGN(int_float, signed int, double)
+SPECIALIZE_ASSIGN(int_float, signed long, double)
+SPECIALIZE_ASSIGN(int_float, signed long long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, double)
+
+SPECIALIZE_ASSIGN(int_float, signed char, long double)
+SPECIALIZE_ASSIGN(int_float, signed short, long double)
+SPECIALIZE_ASSIGN(int_float, signed int, long double)
+SPECIALIZE_ASSIGN(int_float, signed long, long double)
+SPECIALIZE_ASSIGN(int_float, signed long long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned char, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned short, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned int, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long, long double)
+SPECIALIZE_ASSIGN(int_float, unsigned long long, long double)
+
+#undef ASSIGN2_SIGNED_SIGNED
+#undef ASSIGN2_UNSIGNED_UNSIGNED
+#undef ASSIGN2_UNSIGNED_SIGNED
+#undef ASSIGN2_SIGNED_UNSIGNED
+
+template <typename 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 (!Policy::check_overflow) {
+ to = from.get_si();
+ return V_EQ;
+ }
+ if (from.fits_slong_p()) {
+ signed long v = from.get_si();
+ if (v < Limits<To>::min)
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (v > Limits<To>::max)
+ return set_pos_overflow_int<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<Policy>(to, v, dir);
+ to = v;
+ return V_EQ;
+ }
+ }
+ }
+ return ::sgn(from) < 0
+ ? set_neg_overflow_int<Policy>(to, dir)
+ : set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(signed_int_mpz, signed char, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed short, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed int, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long, mpz_class)
+SPECIALIZE_ASSIGN(signed_int_mpz, signed long long, mpz_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_unsigned_int_mpz(To& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_overflow, ::sgn(from) < 0))
+ return set_neg_overflow_int<Policy>(to, dir);
+ if (sizeof(To) <= sizeof(unsigned long)) {
+ if (!Policy::check_overflow) {
+ to = from.get_ui();
+ return V_EQ;
+ }
+ if (from.fits_ulong_p()) {
+ unsigned long v = from.get_ui();
+ if (v > Limits<To>::max)
+ return set_pos_overflow_int<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;
+ else
+ mpz_export(&to, 0, -1, sizeof(To), 0, 0, m);
+ return V_EQ;
+ }
+ }
+ return set_pos_overflow_int<Policy>(to, dir);
+}
+
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned char, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned short, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned int, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long, mpz_class)
+SPECIALIZE_ASSIGN(unsigned_int_mpz, unsigned long long, mpz_class)
+
+template <typename 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();
+ mpz_class q;
+ mpz_ptr _q = q.get_mpz_t();
+ if (dir == ROUND_IGNORE) {
+ mpz_tdiv_q(_q, n, d);
+ Result r = assign<Policy>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ return V_LGE;
+ }
+ mpz_t rem;
+ int sign;
+ mpz_init(rem);
+ mpz_tdiv_qr(_q, rem, n, d);
+ sign = mpz_sgn(rem);
+ mpz_clear(rem);
+ Result r = assign<Policy>(to, q, dir);
+ if (r != V_EQ)
+ return r;
+ switch (sign) {
+ case -1:
+ return round_lt_int<Policy>(to, dir);
+ case 1:
+ return round_gt_int<Policy>(to, dir);
+ default:
+ return V_EQ;
+ }
+}
+
+SPECIALIZE_ASSIGN(int_mpq, signed char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, signed long long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned char, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned short, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned int, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long, mpq_class)
+SPECIALIZE_ASSIGN(int_mpq, unsigned long long, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_int_minf(To& to, const Minus_Infinity&, Rounding_Dir dir) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::minus_infinity;
+ return V_EQ;
+ }
+ if (dir == ROUND_UP) {
+ to = Extended_Int<Policy, To>::min;
+ return V_LT;
+ }
+ return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_pinf(To& to, const Plus_Infinity&, Rounding_Dir dir) {
+ if (Policy::handle_infinity) {
+ to = Extended_Int<Policy, To>::plus_infinity;
+ return V_EQ;
+ }
+ if (dir == ROUND_DOWN) {
+ to = Extended_Int<Policy, To>::max;
+ return V_GT;
+ }
+ return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_int_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+ if (Policy::handle_nan) {
+ to = Extended_Int<Policy, To>::not_a_number;
+ return V_EQ;
+ }
+ return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(int_minf, signed char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, signed long long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned char, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned short, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned int, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long, Minus_Infinity)
+SPECIALIZE_ASSIGN(int_minf, unsigned long long, Minus_Infinity)
+
+SPECIALIZE_ASSIGN(int_pinf, signed char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, signed long long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned char, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned short, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned int, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long, Plus_Infinity)
+SPECIALIZE_ASSIGN(int_pinf, unsigned long long, Plus_Infinity)
+
+SPECIALIZE_ASSIGN(int_nan, signed char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, signed long long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned char, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned short, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned int, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long, Not_A_Number)
+SPECIALIZE_ASSIGN(int_nan, unsigned long long, Not_A_Number)
+
+#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 architecture.
+//
+// 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<signed char> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = true;
+ static const bool use_for_add = true;
+ static const bool use_for_sub = true;
+ static const bool 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> {
+ static const bool use_for_neg = (LONG_BITS == 64);
+ static const bool use_for_add = (LONG_BITS == 64);
+ static const bool use_for_sub = (LONG_BITS == 64);
+ static const bool 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> {
+ static const bool use_for_neg = (LONG_BITS == 64);
+ static const bool use_for_add = (LONG_BITS == 64);
+ static const bool use_for_sub = (LONG_BITS == 64);
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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> {
+ static const bool use_for_neg = false;
+ static const bool use_for_add = false;
+ static const bool use_for_sub = false;
+ static const bool 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 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<Policy>(to, l, dir);
+}
+
+template <typename 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<Policy>(to, l, dir);
+}
+
+template <typename 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<Policy>(to, l, dir);
+}
+
+template <typename 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<Policy>(to, l, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<Policy>(to, from, dir);
+ if (CHECK_P(Policy::check_overflow,
+ (from < -Extended_Int<Policy, Type>::max)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = -from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_neg)
+ return neg_int_larger<Policy>(to, from, dir);
+ if (CHECK_P(Policy::check_overflow, from != 0))
+ return set_neg_overflow_int<Policy>(to, dir);
+ to = from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<Policy>(to, x, y, dir);
+ if (Policy::check_overflow) {
+ if (y >= 0) {
+ if (x > Extended_Int<Policy, Type>::max - y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ else if (x < Extended_Int<Policy, Type>::min - y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_add)
+ return add_int_larger<Policy>(to, x, y, dir);
+ if (CHECK_P(Policy::check_overflow,
+ (x > Extended_Int<Policy, Type>::max - y)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = x + y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<Policy>(to, x, y, dir);
+ if (Policy::check_overflow) {
+ if (y >= 0) {
+ if (x < Extended_Int<Policy, Type>::min + y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ else if (x > Extended_Int<Policy, Type>::max + y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_sub)
+ return sub_int_larger<Policy>(to, x, y, dir);
+ if (CHECK_P(Policy::check_overflow,
+ (x < Extended_Int<Policy, Type>::min + y)))
+ return set_neg_overflow_int<Policy>(to, dir);
+ to = x - y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<Policy>(to, x, y, dir);
+ if (!Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (y == -1)
+ return neg_signed_int<Policy>(to, x, dir);
+ if (x >= 0) {
+ if (y > 0) {
+ if (x > Extended_Int<Policy, Type>::max / y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ else {
+ if (x > Extended_Int<Policy, Type>::min / y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ }
+ else {
+ if (y < 0) {
+ if (x < Extended_Int<Policy, Type>::max / y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ else {
+ if (x < Extended_Int<Policy, Type>::min / y)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ }
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (Policy::check_overflow && Larger<Type>::use_for_mul)
+ return mul_int_larger<Policy>(to, x, y, dir);
+ if (!Policy::check_overflow) {
+ to = x * y;
+ return V_EQ;
+ }
+ if (y == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ if (x > Extended_Int<Policy, Type>::max / y)
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = x * y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_signed_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_div_zero, y == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ if (Policy::check_overflow && y == -1)
+ return neg_signed_int<Policy>(to, x, dir);
+ to = x / y;
+ if (dir == ROUND_IGNORE)
+ return V_LGE;
+ Type m = x % y;
+ if (m < 0)
+ return round_lt_int_no_overflow<Policy>(to, dir);
+ else if (m > 0)
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_unsigned_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_div_zero, y == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ to = x / y;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ Type m = x % y;
+ if (m == 0)
+ return V_EQ;
+ return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_int(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, y == 0))
+ return set_special<Policy>(to, V_MOD_ZERO);
+ to = x % y;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+ to = 0;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (x == 0)
+ return V_EQ;
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ }
+ to = x >> exp;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (x & ((static_cast<Type>(1) << exp) - 1))
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+ zero:
+ to = 0;
+ if (dir == ROUND_IGNORE)
+ return V_LGE;
+ if (x < 0)
+ return round_lt_int_no_overflow<Policy>(to, dir);
+ else if (x > 0)
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+ }
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+ if (x == Limits<Type>::min) {
+ to = -1;
+ return V_EQ;
+ }
+ goto zero;
+ }
+#if 0
+ to = x / (static_cast<Type>(1) << exp);
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ Type r = x % (static_cast<Type>(1) << exp);
+ if (r < 0)
+ return round_lt_int_no_overflow<Policy>(to, dir);
+ else if (r > 0)
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ else
+ return V_EQ;
+#else
+ // Faster but compiler implementation dependent (see C++98 5.8.3)
+ to = x >> exp;
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (x & ((static_cast<Type>(1) << exp) - 1))
+ return round_gt_int_no_overflow<Policy>(to, dir);
+ return V_EQ;
+#endif
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_unsigned_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ if (!Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8) {
+ if (x == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ if (x & (((static_cast<Type>(1) << exp) - 1) << (sizeof(Type) * 8 - exp)))
+ return set_pos_overflow_int<Policy>(to, dir);
+ Type n = x << exp;
+ if (n > Extended_Int<Policy, Type>::max)
+ return set_pos_overflow_int<Policy>(to, dir);
+ to = n;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_signed_int(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ if (!Policy::check_overflow) {
+ to = x << exp;
+ return V_EQ;
+ }
+ if (static_cast<unsigned int>(exp) >= sizeof(Type) * 8 - 1) {
+ if (x < 0)
+ return set_neg_overflow_int<Policy>(to, dir);
+ else if (x > 0)
+ return set_pos_overflow_int<Policy>(to, dir);
+ else {
+ to = 0;
+ return V_EQ;
+ }
+ }
+ Type mask = ((static_cast<Type>(1) << exp) - 1)
+ << (sizeof(Type) * 8 - 1 - exp);
+ Type n;
+ if (x < 0) {
+ if ((x & mask) != mask)
+ return set_neg_overflow_int<Policy>(to, dir);
+ n = x << exp;
+ if (n < Extended_Int<Policy, Type>::min)
+ return set_neg_overflow_int<Policy>(to, dir);
+ }
+ else {
+ if (x & mask)
+ return set_pos_overflow_int<Policy>(to, dir);
+ n = x << exp;
+ if (n > Extended_Int<Policy, Type>::max)
+ return set_pos_overflow_int<Policy>(to, dir);
+ }
+ to = n;
+ return V_EQ;
+}
+
+template <typename Type>
+inline void
+isqrtrem_(Type& q, Type& r, const Type from) {
+ q = 0;
+ r = from;
+ Type t(1);
+ for (t <<= 8 * sizeof(Type) - 2; t != 0; t >>= 2) {
+ Type s = q + t;
+ if (s <= r) {
+ r -= s;
+ q = s + t;
+ }
+ q >>= 1;
+ }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_unsigned_int(Type& to, const Type from, Rounding_Dir dir) {
+ Type rem;
+ isqrtrem_(to, rem, from);
+ if (dir == ROUND_IGNORE)
+ return V_GE;
+ if (rem == 0)
+ return V_EQ;
+ return round_gt_int<Policy>(to, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_signed_int(Type& to, const Type from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+ return set_special<Policy>(to, V_SQRT_NEG);
+ return sqrt_unsigned_int<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<Policy>(z, x, y, dir);
+ switch (r) {
+ case V_NEG_OVERFLOW:
+ case V_LT:
+ if (to <= 0) {
+ to = z;
+ return r;
+ }
+ return set_special<Policy>(to, V_UNKNOWN_NEG_OVERFLOW);
+ case V_POS_OVERFLOW:
+ case V_GT:
+ if (to >= 0) {
+ to = z;
+ return r;
+ }
+ return set_special<Policy>(to, V_UNKNOWN_POS_OVERFLOW);
+ default:
+ return add<Policy>(to, to, z, dir);
+ }
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_int(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ Type z;
+ Result r = mul<Policy>(z, x, y, dir);
+ switch (r) {
+ case V_NEG_OVERFLOW:
+ case V_LT:
+ if (to >= 0)
+ return set_pos_overflow_int<Policy>(to, dir);
+ return V_UNKNOWN_NEG_OVERFLOW;
+ case V_POS_OVERFLOW:
+ case V_GT:
+ if (to <= 0)
+ return set_neg_overflow_int<Policy>(to, dir);
+ return V_UNKNOWN_POS_OVERFLOW;
+ default:
+ return sub<Policy>(to, to, z, dir);
+ }
+}
+
+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;
+}
+
+SPECIALIZE_NEG(signed_int, signed char, signed char)
+SPECIALIZE_NEG(signed_int, signed short, signed short)
+SPECIALIZE_NEG(signed_int, signed int, signed int)
+SPECIALIZE_NEG(signed_int, signed long, signed long)
+SPECIALIZE_NEG(signed_int, signed long long, signed long long)
+SPECIALIZE_NEG(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_NEG(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_NEG(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_NEG(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_NEG(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD(signed_int, signed char, signed char, signed char)
+SPECIALIZE_ADD(signed_int, signed short, signed short, signed short)
+SPECIALIZE_ADD(signed_int, signed int, signed int, signed int)
+SPECIALIZE_ADD(signed_int, signed long, signed long, signed long)
+SPECIALIZE_ADD(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB(signed_int, signed char, signed char, signed char)
+SPECIALIZE_SUB(signed_int, signed short, signed short, signed short)
+SPECIALIZE_SUB(signed_int, signed int, signed int, signed int)
+SPECIALIZE_SUB(signed_int, signed long, signed long, signed long)
+SPECIALIZE_SUB(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL(signed_int, signed char, signed char, signed char)
+SPECIALIZE_MUL(signed_int, signed short, signed short, signed short)
+SPECIALIZE_MUL(signed_int, signed int, signed int, signed int)
+SPECIALIZE_MUL(signed_int, signed long, signed long, signed long)
+SPECIALIZE_MUL(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_MUL(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_MUL(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_MUL(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_MUL(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_MUL(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV(signed_int, signed char, signed char, signed char)
+SPECIALIZE_DIV(signed_int, signed short, signed short, signed short)
+SPECIALIZE_DIV(signed_int, signed int, signed int, signed int)
+SPECIALIZE_DIV(signed_int, signed long, signed long, signed long)
+SPECIALIZE_DIV(signed_int, signed long long, signed long long, signed long long)
+SPECIALIZE_DIV(unsigned_int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_DIV(unsigned_int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_DIV(unsigned_int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_DIV(unsigned_int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_DIV(unsigned_int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_REM(int, signed char, signed char, signed char)
+SPECIALIZE_REM(int, signed short, signed short, signed short)
+SPECIALIZE_REM(int, signed int, signed int, signed int)
+SPECIALIZE_REM(int, signed long, signed long, signed long)
+SPECIALIZE_REM(int, signed long long, signed long long, signed long long)
+SPECIALIZE_REM(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_REM(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_REM(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_REM(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_REM(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_MUL2EXP(signed_int, signed char, signed char)
+SPECIALIZE_MUL2EXP(signed_int, signed short, signed short)
+SPECIALIZE_MUL2EXP(signed_int, signed int, signed int)
+SPECIALIZE_MUL2EXP(signed_int, signed long, signed long)
+SPECIALIZE_MUL2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_MUL2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_DIV2EXP(signed_int, signed char, signed char)
+SPECIALIZE_DIV2EXP(signed_int, signed short, signed short)
+SPECIALIZE_DIV2EXP(signed_int, signed int, signed int)
+SPECIALIZE_DIV2EXP(signed_int, signed long, signed long)
+SPECIALIZE_DIV2EXP(signed_int, signed long long, signed long long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_DIV2EXP(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_SQRT(signed_int, signed char, signed char)
+SPECIALIZE_SQRT(signed_int, signed short, signed short)
+SPECIALIZE_SQRT(signed_int, signed int, signed int)
+SPECIALIZE_SQRT(signed_int, signed long, signed long)
+SPECIALIZE_SQRT(signed_int, signed long long, signed long long)
+SPECIALIZE_SQRT(unsigned_int, unsigned char, unsigned char)
+SPECIALIZE_SQRT(unsigned_int, unsigned short, unsigned short)
+SPECIALIZE_SQRT(unsigned_int, unsigned int, unsigned int)
+SPECIALIZE_SQRT(unsigned_int, unsigned long, unsigned long)
+SPECIALIZE_SQRT(unsigned_int, unsigned long long, unsigned long long)
+
+SPECIALIZE_ABS(generic, signed char, signed char)
+SPECIALIZE_ABS(generic, signed short, signed short)
+SPECIALIZE_ABS(generic, signed int, signed int)
+SPECIALIZE_ABS(generic, signed long, signed long)
+SPECIALIZE_ABS(generic, signed long long, signed long long)
+SPECIALIZE_ABS(generic, unsigned char, unsigned char)
+SPECIALIZE_ABS(generic, unsigned short, unsigned short)
+SPECIALIZE_ABS(generic, unsigned int, unsigned int)
+SPECIALIZE_ABS(generic, unsigned long, unsigned long)
+SPECIALIZE_ABS(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCD(exact, signed char, signed char, signed char)
+SPECIALIZE_GCD(exact, signed short, signed short, signed short)
+SPECIALIZE_GCD(exact, signed int, signed int, signed int)
+SPECIALIZE_GCD(exact, signed long, signed long, signed long)
+SPECIALIZE_GCD(exact, signed long long, signed long long, signed long long)
+SPECIALIZE_GCD(exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCD(exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCD(exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCD(exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCD(exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_GCDEXT(exact, signed char, signed char, signed char, signed char, signed char)
+SPECIALIZE_GCDEXT(exact, signed short, signed short, signed short, signed short, signed short)
+SPECIALIZE_GCDEXT(exact, signed int, signed int, signed int, signed int, signed int)
+SPECIALIZE_GCDEXT(exact, signed long, signed long, signed long, signed long, signed long)
+SPECIALIZE_GCDEXT(exact, signed long long, signed long long, signed long long, signed long long, signed long long)
+SPECIALIZE_GCDEXT(exact, unsigned char, unsigned char, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_GCDEXT(exact, unsigned short, unsigned short, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_GCDEXT(exact, unsigned int, unsigned int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_GCDEXT(exact, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_GCDEXT(exact, unsigned long long, unsigned long long, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_LCM(gcd_exact, signed char, signed char, signed char)
+SPECIALIZE_LCM(gcd_exact, signed short, signed short, signed short)
+SPECIALIZE_LCM(gcd_exact, signed int, signed int, signed int)
+SPECIALIZE_LCM(gcd_exact, signed long, signed long, signed long)
+SPECIALIZE_LCM(gcd_exact, signed long long, signed long long, signed long long)
+SPECIALIZE_LCM(gcd_exact, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_LCM(gcd_exact, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_LCM(gcd_exact, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_LCM(gcd_exact, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_LCM(gcd_exact, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SGN(generic, signed char)
+SPECIALIZE_SGN(generic, signed short)
+SPECIALIZE_SGN(generic, signed int)
+SPECIALIZE_SGN(generic, signed long)
+SPECIALIZE_SGN(generic, signed long long)
+SPECIALIZE_SGN(generic, unsigned char)
+SPECIALIZE_SGN(generic, unsigned short)
+SPECIALIZE_SGN(generic, unsigned int)
+SPECIALIZE_SGN(generic, unsigned long)
+SPECIALIZE_SGN(generic, unsigned long long)
+
+SPECIALIZE_CMP(generic, signed char, signed char)
+SPECIALIZE_CMP(generic, signed short, signed short)
+SPECIALIZE_CMP(generic, signed int, signed int)
+SPECIALIZE_CMP(generic, signed long, signed long)
+SPECIALIZE_CMP(generic, signed long long, signed long long)
+SPECIALIZE_CMP(generic, unsigned char, unsigned char)
+SPECIALIZE_CMP(generic, unsigned short, unsigned short)
+SPECIALIZE_CMP(generic, unsigned int, unsigned int)
+SPECIALIZE_CMP(generic, unsigned long, unsigned long)
+SPECIALIZE_CMP(generic, unsigned long long, unsigned long long)
+
+SPECIALIZE_ADD_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_ADD_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_ADD_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_ADD_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_ADD_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_ADD_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_ADD_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_ADD_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_ADD_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_ADD_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_SUB_MUL(int, signed char, signed char, signed char)
+SPECIALIZE_SUB_MUL(int, signed short, signed short, signed short)
+SPECIALIZE_SUB_MUL(int, signed int, signed int, signed int)
+SPECIALIZE_SUB_MUL(int, signed long, signed long, signed long)
+SPECIALIZE_SUB_MUL(int, signed long long, signed long long, signed long long)
+SPECIALIZE_SUB_MUL(int, unsigned char, unsigned char, unsigned char)
+SPECIALIZE_SUB_MUL(int, unsigned short, unsigned short, unsigned short)
+SPECIALIZE_SUB_MUL(int, unsigned int, unsigned int, unsigned int)
+SPECIALIZE_SUB_MUL(int, unsigned long, unsigned long, unsigned long)
+SPECIALIZE_SUB_MUL(int, unsigned long long, unsigned long long, unsigned long long)
+
+SPECIALIZE_INPUT(generic, signed char)
+SPECIALIZE_INPUT(generic, signed short)
+SPECIALIZE_INPUT(generic, signed int)
+SPECIALIZE_INPUT(generic, signed long)
+SPECIALIZE_INPUT(generic, signed long long)
+SPECIALIZE_INPUT(generic, unsigned char)
+SPECIALIZE_INPUT(generic, unsigned short)
+SPECIALIZE_INPUT(generic, unsigned int)
+SPECIALIZE_INPUT(generic, unsigned long)
+SPECIALIZE_INPUT(generic, unsigned long long)
+
+SPECIALIZE_OUTPUT(char, signed char)
+SPECIALIZE_OUTPUT(int, signed short)
+SPECIALIZE_OUTPUT(int, signed int)
+SPECIALIZE_OUTPUT(int, signed long)
+SPECIALIZE_OUTPUT(int, signed long long)
+SPECIALIZE_OUTPUT(char, unsigned char)
+SPECIALIZE_OUTPUT(int, unsigned short)
+SPECIALIZE_OUTPUT(int, unsigned int)
+SPECIALIZE_OUTPUT(int, unsigned long)
+SPECIALIZE_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/Float.defs.hh line 1
+/* IEC 559 floating point format related functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Float.defs.hh line 27
+#include <gmp.h>
+#include <cassert>
+#include <cmath>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+#ifndef NAN
+#define NAN (HUGE_VAL - HUGE_VAL)
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_single {
+ uint32_t word;
+ static const uint32_t SGN_MASK = 0x80000000;
+ static const uint32_t EXP_MASK = 0x7f800000;
+ static const uint32_t POS_INF = 0x7f800000;
+ static const uint32_t NEG_INF = 0xff800000;
+ static const uint32_t POS_ZERO = 0x00000000;
+ static const uint32_t NEG_ZERO = 0x80000000;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_double {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint32_t lsp;
+#else
+ uint32_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x80000000;
+ static const uint32_t MSP_POS_INF = 0x7ff00000;
+ static const uint32_t MSP_NEG_INF = 0xfff00000;
+ static const uint32_t MSP_POS_ZERO = 0x00000000;
+ static const uint32_t MSP_NEG_ZERO = 0x80000000;
+ static const uint32_t LSP_INF = 0;
+ static const uint32_t LSP_ZERO = 0;
+ static const uint32_t LSP_MAX = 0xffffffff;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_intel_double_extended {
+#ifdef WORDS_BIGENDIAN
+ uint32_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint32_t msp;
+#endif
+ static const uint32_t MSP_SGN_MASK = 0x00008000;
+ static const uint32_t MSP_POS_INF = 0x00007fff;
+ static const uint32_t MSP_NEG_INF = 0x0000ffff;
+ static const uint32_t MSP_POS_ZERO = 0x00000000;
+ static const uint32_t MSP_NEG_ZERO = 0x00008000;
+ static const uint64_t LSP_INF = 0x8000000000000000ULL;
+ static const uint64_t LSP_ZERO = 0;
+ static const uint64_t LSP_DMAX = 0x7fffffffffffffffULL;
+ static const uint64_t LSP_NMAX = 0xffffffffffffffffULL;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+struct float_ieee754_quad {
+#ifdef WORDS_BIGENDIAN
+ uint64_t msp;
+ uint64_t lsp;
+#else
+ uint64_t lsp;
+ uint64_t msp;
+#endif
+ static const uint64_t MSP_SGN_MASK = 0x8000000000000000ULL;
+ static const uint64_t MSP_POS_INF = 0x7fff000000000000ULL;
+ static const uint64_t MSP_NEG_INF = 0xffff000000000000ULL;
+ static const uint64_t MSP_POS_ZERO = 0x0000000000000000ULL;
+ static const uint64_t MSP_NEG_ZERO = 0x8000000000000000ULL;
+ static const uint64_t LSP_INF = 0;
+ static const uint64_t LSP_ZERO = 0;
+ static const uint64_t LSP_MAX = 0xffffffffffffffffULL;
+ 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);
+ int is_inf() const;
+ int is_nan() const;
+ int is_zero() const;
+ int 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+class Float {
+public:
+ static const bool fpu_related = false;
+};
+
+#if PPL_SUPPORTED_FLOAT
+template <>
+class Float<float> {
+public:
+ typedef CXX_FLOAT_BINARY_FORMAT Binary;
+ union {
+ float number;
+ Binary binary;
+ } u;
+ Float();
+ Float(float v);
+ float value();
+ static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+template <>
+class Float<double> {
+public:
+ typedef CXX_DOUBLE_BINARY_FORMAT Binary;
+ union {
+ double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(double v);
+ double value();
+ static const bool fpu_related = true;
+};
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+template <>
+class Float<long double> {
+public:
+ typedef CXX_LONG_DOUBLE_BINARY_FORMAT Binary;
+ union {
+ long double number;
+ Binary binary;
+ } u;
+ Float();
+ Float(long double v);
+ long double value();
+ static const bool fpu_related = true;
+};
+#endif
+
+} // 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>
+#ifdef HAVE_STDINT_H
+#include <stdint.h>
+#endif
+#ifdef HAVE_INTTYPES_H
+#include <inttypes.h>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+inline int
+float_ieee754_single::is_inf() const {
+ if (word == NEG_INF)
+ return -1;
+ if (word == POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_ieee754_single::is_nan() const {
+ return (word & ~SGN_MASK) > POS_INF;
+}
+
+inline int
+float_ieee754_single::is_zero() 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 int
+float_ieee754_single::sign_bit() const {
+ return !!(word & SGN_MASK);
+}
+
+inline void
+float_ieee754_single::dec() {
+ word--;
+}
+
+inline void
+float_ieee754_single::inc() {
+ word++;
+}
+
+inline void
+float_ieee754_single::set_max(bool negative) {
+ word = 0x7f7fffff;
+ if (negative)
+ word |= SGN_MASK;
+}
+
+inline void
+float_ieee754_single::build(bool negative, mpz_t mantissa, int exponent) {
+ word = mpz_get_ui(mantissa) & ((1UL << MANTISSA_BITS) - 1);
+ if (negative)
+ word |= SGN_MASK;
+ word |= static_cast<uint32_t>(exponent + EXPONENT_BIAS) << MANTISSA_BITS;
+}
+
+inline int
+float_ieee754_double::is_inf() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_ieee754_double::is_nan() 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::is_zero() 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 int
+float_ieee754_double::sign_bit() const {
+ return !!(msp & MSP_SGN_MASK);
+}
+
+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 = 0x7fefffff;
+ lsp = 0xffffffff;
+ if (negative)
+ msp |= MSP_SGN_MASK;
+}
+
+inline void
+float_ieee754_double::build(bool negative, mpz_t mantissa, int exponent) {
+#if ULONG_MAX == 0xffffffffUL
+ lsp = mpz_get_ui(mantissa);
+ mpz_tdiv_q_2exp(mantissa, mantissa, 32);
+ unsigned long m = mpz_get_ui(mantissa);
+#else
+ unsigned long m = mpz_get_ui(mantissa);
+ lsp = m;
+ m >>= 32;
+#endif
+ msp = m & ((1UL << (MANTISSA_BITS - 32)) - 1);
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS)
+ << (MANTISSA_BITS - 32);
+}
+
+inline int
+float_intel_double_extended::is_inf() const {
+ if (lsp != LSP_INF)
+ return 0;
+ uint32_t a = msp & MSP_NEG_INF;
+ if (a == MSP_NEG_INF)
+ return -1;
+ if (a == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_intel_double_extended::is_nan() const {
+ return (msp & MSP_POS_INF) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_intel_double_extended::is_zero() const {
+ if (lsp != LSP_ZERO)
+ return 0;
+ 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 int
+float_intel_double_extended::sign_bit() const {
+ return !!(msp & MSP_SGN_MASK);
+}
+
+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 = 0x00007ffe;
+ lsp = 0xffffffffffffffffULL;
+ 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, 8, 0, 0, mantissa);
+#else
+ lsp = mpz_get_ui(mantissa);
+#endif
+ msp = (negative ? MSP_SGN_MASK : 0);
+ msp |= static_cast<uint32_t>(exponent + EXPONENT_BIAS);
+}
+
+inline int
+float_ieee754_quad::is_inf() const {
+ if (lsp != LSP_INF)
+ return 0;
+ if (msp == MSP_NEG_INF)
+ return -1;
+ if (msp == MSP_POS_INF)
+ return 1;
+ return 0;
+}
+
+inline int
+float_ieee754_quad::is_nan() const {
+ return (msp & ~MSP_SGN_MASK) == MSP_POS_INF
+ && lsp != LSP_INF;
+}
+
+inline int
+float_ieee754_quad::is_zero() 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 int
+float_ieee754_quad::sign_bit() const {
+ return !!(msp & MSP_SGN_MASK);
+}
+
+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 = 0x7ffeffffffffffffULL;
+ lsp = 0xffffffffffffffffULL;
+ 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, 8, 0, 0, mantissa);
+ lsp = parts[0];
+ msp = parts[1];
+ msp &= ((1ULL << (MANTISSA_BITS - 64)) - 1);
+ if (negative)
+ msp |= MSP_SGN_MASK;
+ msp |= static_cast<uint64_t>(exponent + EXPONENT_BIAS)
+ << (MANTISSA_BITS - 64);
+}
+
+#ifdef CXX_FLOAT_BINARY_FORMAT
+inline
+Float<float>::Float() {
+}
+
+inline
+Float<float>::Float(float v) {
+ u.number = v;
+}
+
+inline float
+Float<float>::value() {
+ return u.number;
+}
+#endif
+
+#ifdef CXX_DOUBLE_BINARY_FORMAT
+inline
+Float<double>::Float() {
+}
+
+inline
+Float<double>::Float(double v) {
+ u.number = v;
+}
+
+inline double
+Float<double>::value() {
+ return u.number;
+}
+#endif
+
+#ifdef CXX_LONG_DOUBLE_BINARY_FORMAT
+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.defs.hh line 248
+
+// Automatically generated from PPL source file ../src/checked_float.inlines.hh line 27
+#ifndef __alpha
+#include <cmath>
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+inline float
+fma(float x, float y, float z) {
+#if HAVE_DECL_FMAF && !defined(__alpha)
+ return ::fmaf(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTF
+inline float
+rint(float x) {
+ return ::rintf(x);
+}
+#endif
+
+inline double
+fma(double x, double y, double z) {
+#if HAVE_DECL_FMA && !defined(__alpha)
+ return ::fma(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+inline double
+rint(double x) {
+ return ::rint(x);
+}
+
+inline long double
+fma(long double x, long double y, long double z) {
+#if HAVE_DECL_FMAL && !defined(__alpha)
+ return ::fmal(x, y, z);
+#else
+ return x*y + z;
+#endif
+}
+
+#if HAVE_DECL_RINTL
+inline long double
+rint(long double x) {
+ return ::rintl(x);
+}
+#endif
+
+inline bool
+fpu_direct_rounding(Rounding_Dir dir) {
+ return dir == ROUND_DIRECT || dir == ROUND_IGNORE;
+}
+
+inline bool
+fpu_inverse_rounding(Rounding_Dir dir) {
+ return dir == ROUND_INVERSE;
+}
+
+// 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 float
+limit_precision(float v) {
+ volatile float x = v;
+ return x;
+}
+
+inline double
+limit_precision(double v) {
+ volatile double x = v;
+ return x;
+}
+
+inline long double
+limit_precision(long double v) {
+#if __GNUC__ >= 4
+ return v;
+#else
+ // Not really needed for floating point operations done with the
+ // maximum available precision, but this avoids a bug in GCC 3.4.3
+ // that causes excessive optimization compiling -(-a * b).
+ // See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21032
+ // and http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21067.
+ volatile long double x = v;
+ return x;
+#endif
+}
+
+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) && f.u.binary.is_nan())
+ return VC_NAN;
+ if (inf) {
+ int i = f.u.binary.is_inf();
+ if (i < 0)
+ return VC_MINUS_INFINITY;
+ if (i > 0)
+ return VC_PLUS_INFINITY;
+ }
+ if (sign) {
+ if (v < 0)
+ return V_LT;
+ if (v > 0)
+ return V_GT;
+ return V_EQ;
+ }
+ return VC_NORMAL;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_nan_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_nan();
+}
+
+template <typename Policy, typename T>
+inline bool
+is_minf_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_inf() < 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_pinf_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_inf() > 0;
+}
+
+template <typename T>
+inline bool
+is_inf_float(const T v) {
+ Float<T> f(v);
+ return f.u.binary.is_inf() != 0;
+}
+
+template <typename Policy, typename T>
+inline bool
+is_int_float(const T v) {
+ return rint(v) == v;
+}
+
+template <typename Policy, typename T>
+inline Result
+set_special_float(T& v, Result r) {
+ switch (classify(r)) {
+ case VC_MINUS_INFINITY:
+ v = -HUGE_VAL;
+ break;
+ case VC_PLUS_INFINITY:
+ v = HUGE_VAL;
+ break;
+ case VC_NAN:
+ v = NAN;
+ break;
+ default:
+ break;
+ }
+ return r;
+}
+
+template <typename T>
+inline void
+pred_float(T& v) {
+ Float<T> f(v);
+ assert(!f.u.binary.is_nan());
+ assert(f.u.binary.is_inf() >= 0);
+ if (f.u.binary.is_zero() > 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);
+ assert(!f.u.binary.is_nan());
+ assert(f.u.binary.is_inf() <= 0);
+ if (f.u.binary.is_zero() < 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 (dir == ROUND_DOWN) {
+ 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 (dir == ROUND_UP) {
+ succ_float(to);
+ return V_LT;
+ }
+ return V_GT;
+}
+
+template <typename Policy>
+inline void
+prepare_inexact(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact && dir != ROUND_IGNORE)
+ fpu_reset_inexact();
+}
+
+template <typename Policy>
+inline Result
+result_relation(Rounding_Dir dir) {
+ if (Policy::fpu_check_inexact) {
+ if (!fpu_check_inexact())
+ return V_EQ;
+ switch (dir) {
+ case ROUND_DOWN:
+ return V_GT;
+ case ROUND_UP:
+ return V_LT;
+ default:
+ return V_NE;
+ }
+ }
+ else {
+ switch (dir) {
+ case ROUND_DOWN:
+ return V_GE;
+ case ROUND_UP:
+ return V_LE;
+ default:
+ return V_LGE;
+ }
+ }
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float_exact(To& to, const From from, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ to = from;
+ return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_float_inexact(To& to, const From from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(-from);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = from;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename From, typename To>
+inline Result
+assign_float_float(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(From) > sizeof(To))
+ return assign_float_float_inexact<Policy>(to, from, dir);
+ else
+ return assign_float_float_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+neg_float(Type& to, const Type from, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ to = -from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_add_inf, is_inf_float(x) && x == -y))
+ return V_INF_ADD_INF;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x + y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(-x - y);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x + y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_sub_inf, is_inf_float(x) && x == y))
+ return V_INF_SUB_INF;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x - y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(y - x);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x - y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_mul_zero, (x == 0 && is_inf_float(y)) ||
+ (y == 0 && is_inf_float(x))))
+ return V_INF_MUL_ZERO;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x * y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(x * -y);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x * y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_div_inf, is_inf_float(x) && is_inf_float(y)))
+ return V_INF_DIV_INF;
+ if (CHECK_P(Policy::check_div_zero, y == 0)) {
+ to = NAN;
+ return V_DIV_ZERO;
+ }
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = x / y;
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(x / -y);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = x / y;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+rem_float(Type& to, const Type x, const Type y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_inf_mod, is_inf_float(x)))
+ return V_INF_MOD;
+ if (CHECK_P(Policy::check_div_zero, y == 0)) {
+ to = NAN;
+ return V_MOD_ZERO;
+ }
+ to = std::fmod(x, y);
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+mul2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+ return mul<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+div2exp_float(Type& to, const Type x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ assert(static_cast<unsigned int>(exp) < sizeof(unsigned long long) * 8);
+ return div<Policy>(to, x, static_cast<Type>(1ULL << exp), dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+abs_float(Type& to, const Type from, Rounding_Dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ to = from < 0 ? -from : from;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+sqrt_float(Type& to, const Type from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(from)))
+ return VC_NAN;
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0)) {
+ to = NAN;
+ return V_SQRT_NEG;
+ }
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = std::sqrt(from);
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = std::sqrt(from);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sgn_float(const Type x) {
+ return classify<Policy>(x, false, false, true);
+}
+
+template <typename Policy, typename Type>
+inline Result
+cmp_float(const Type x, const Type y) {
+ if (x > y)
+ return V_GT;
+ if (x < y)
+ return V_LT;
+ if (x == y)
+ return V_EQ;
+ return V_UNORD_COMP;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_exact(To& to, const From from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int_inexact(To& to, const From from, Rounding_Dir dir) {
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = from;
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = from;
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename To, typename From>
+inline Result
+assign_float_int(To& to, const From from, Rounding_Dir dir) {
+ if (sizeof(From) * 8 > Float<To>::Binary::MANTISSA_BITS)
+ return assign_float_int_inexact<Policy>(to, from, dir);
+ else
+ return assign_float_int_exact<Policy>(to, from, dir);
+}
+
+template <typename Policy, typename T>
+inline Result
+set_neg_overflow_float(T& to, Rounding_Dir dir) {
+ switch (dir) {
+ case ROUND_UP:
+ {
+ Float<T> f;
+ f.u.binary.set_max(true);
+ to = f.value();
+ return V_LT;
+ }
+ default:
+ to = -HUGE_VAL;
+ return V_GT;
+ }
+}
+
+template <typename Policy, typename T>
+inline Result
+set_pos_overflow_float(T& to, Rounding_Dir dir) {
+ switch (dir) {
+ case ROUND_DOWN:
+ {
+ Float<T> f;
+ f.u.binary.set_max(false);
+ to = f.value();
+ return V_GT;
+ }
+ default:
+ to = HUGE_VAL;
+ return V_LT;
+ }
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpz(T& to, const mpz_class& _from, Rounding_Dir dir)
+{
+ mpz_srcptr from = _from.get_mpz_t();
+ int sign = mpz_sgn(from);
+ if (sign == 0) {
+ to = 0;
+ return V_EQ;
+ }
+ size_t exponent = mpz_sizeinbase(from, 2) - 1;
+ if (exponent > (size_t) Float<T>::Binary::EXPONENT_MAX) {
+ if (sign < 0)
+ return set_neg_overflow_float<Policy>(to, dir);
+ else
+ return set_pos_overflow_float<Policy>(to, dir);
+ }
+ unsigned long zeroes = mpn_scan1(from->_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,
+ exponent - Float<T>::Binary::MANTISSA_BITS);
+ else
+ mpz_mul_2exp(mantissa, from, Float<T>::Binary::MANTISSA_BITS - exponent);
+ Float<T> f(to);
+ f.u.binary.build(sign < 0, mantissa, exponent);
+ mpz_clear(mantissa);
+ to = f.value();
+ if (meaningful_bits > Float<T>::Binary::MANTISSA_BITS) {
+ if (sign < 0)
+ return round_lt_float<Policy>(to, dir);
+ else
+ return round_gt_float<Policy>(to, dir);
+ }
+ return V_EQ;
+}
+
+template <typename Policy, typename T>
+inline Result
+assign_float_mpq(T& to, const mpq_class& from, Rounding_Dir dir)
+{
+ const mpz_class& _num = from.get_num();
+ const mpz_class& _den = from.get_den();
+ if (_den == 1)
+ return assign_float_mpz<Policy>(to, _num, dir);
+ mpz_srcptr num = _num.get_mpz_t();
+ mpz_srcptr den = _den.get_mpz_t();
+ int sign = mpz_sgn(num);
+ signed long exponent = mpz_sizeinbase(num, 2) - mpz_sizeinbase(den, 2);
+ if (exponent < Float<T>::Binary::EXPONENT_MIN_DENORM) {
+ to = 0;
+ inexact:
+ if (sign < 0)
+ return round_lt_float<Policy>(to, dir);
+ else
+ return round_gt_float<Policy>(to, dir);
+ }
+ if (exponent > (signed int) Float<T>::Binary::EXPONENT_MAX + 1) {
+ overflow:
+ if (sign < 0)
+ return set_neg_overflow_float<Policy>(to, dir);
+ else
+ return set_pos_overflow_float<Policy>(to, dir);
+ }
+ unsigned int needed_bits = Float<T>::Binary::MANTISSA_BITS + 1;
+ if (exponent < Float<T>::Binary::EXPONENT_MIN)
+ needed_bits -= Float<T>::Binary::EXPONENT_MIN - exponent;
+ mpz_t mantissa;
+ mpz_init(mantissa);
+ signed long shift = needed_bits - exponent;
+ if (shift > 0) {
+ mpz_mul_2exp(mantissa, num, shift);
+ num = mantissa;
+ }
+ else if (shift < 0) {
+ mpz_mul_2exp(mantissa, den, -shift);
+ den = mantissa;
+ }
+ mpz_t r;
+ mpz_init(r);
+ mpz_tdiv_qr(mantissa, r, num, den);
+ 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_div_2exp(mantissa, mantissa, 1);
+ }
+ else
+ --exponent;
+ if (exponent > (signed int)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(to);
+ f.u.binary.build(sign < 0, mantissa, exponent);
+ mpz_clear(mantissa);
+ to = f.value();
+ if (inexact)
+ goto inexact;
+ return V_EQ;
+}
+
+template <typename Policy, typename Type>
+inline Result
+add_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = fma(x, y, to);
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(fma(-x, y, -to));
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = fma(x, y, to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+template <typename Policy, typename Type>
+inline Result
+sub_mul_float(Type& to, const Type x, const Type y, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(to))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))
+ || CHECK_P(Policy::check_nan_args, is_nan<Policy>(y)))
+ return VC_NAN;
+ prepare_inexact<Policy>(dir);
+ if (fpu_direct_rounding(dir))
+ to = fma(x, -y, to);
+ else if (fpu_inverse_rounding(dir))
+ to = -limit_precision(fma(x, y, -to));
+ else {
+ fpu_rounding_control_word_type old = fpu_save_rounding_direction(dir);
+ to = fma(x, -y, to);
+ fpu_restore_rounding_direction(old);
+ }
+ return result_relation<Policy>(dir);
+}
+
+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 {
+ int old_precision = os.precision(10000);
+ os << from;
+ os.precision(old_precision);
+ }
+ return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+ to = -HUGE_VAL;
+ return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+ to = HUGE_VAL;
+ return V_EQ;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_float_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+ to = NAN;
+ return V_EQ;
+}
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_ASSIGN(float_float_exact, float, float)
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, double)
+SPECIALIZE_ASSIGN(float_float_exact, double, float)
+#endif
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, float, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, float)
+#endif
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, double, double)
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float, double, long double)
+SPECIALIZE_ASSIGN(float_float_exact, long double, double)
+#endif
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_ASSIGN(float_float_exact, long double, long double)
+#endif
+
+#if PPL_SUPPORTED_FLOAT
+SPECIALIZE_CLASSIFY(float, float)
+SPECIALIZE_IS_NAN(float, float)
+SPECIALIZE_IS_MINF(float, float)
+SPECIALIZE_IS_PINF(float, float)
+SPECIALIZE_SET_SPECIAL(float, float)
+SPECIALIZE_ASSIGN(float_int, float, signed char)
+SPECIALIZE_ASSIGN(float_int, float, signed short)
+SPECIALIZE_ASSIGN(float_int, float, signed int)
+SPECIALIZE_ASSIGN(float_int, float, signed long)
+SPECIALIZE_ASSIGN(float_int, float, signed long long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned char)
+SPECIALIZE_ASSIGN(float_int, float, unsigned short)
+SPECIALIZE_ASSIGN(float_int, float, unsigned int)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long)
+SPECIALIZE_ASSIGN(float_int, float, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, float, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, float, mpq_class)
+SPECIALIZE_COPY(generic, float)
+SPECIALIZE_IS_INT(float, float)
+SPECIALIZE_ASSIGN(float_minf, float, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, float, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, float, Not_A_Number)
+SPECIALIZE_NEG(float, float, float)
+SPECIALIZE_ABS(float, float, float)
+SPECIALIZE_ADD(float, float, float, float)
+SPECIALIZE_SUB(float, float, float, float)
+SPECIALIZE_MUL(float, float, float, float)
+SPECIALIZE_DIV(float, float, float, float)
+SPECIALIZE_REM(float, float, float, float)
+SPECIALIZE_MUL2EXP(float, float, float)
+SPECIALIZE_DIV2EXP(float, float, float)
+SPECIALIZE_SQRT(float, float, float)
+SPECIALIZE_GCD(exact, float, float, float)
+SPECIALIZE_GCDEXT(exact, float, float, float, float, float)
+SPECIALIZE_LCM(gcd_exact, float, float, float)
+SPECIALIZE_SGN(float, float)
+SPECIALIZE_CMP(float, float, float)
+SPECIALIZE_ADD_MUL(float, float, float, float)
+SPECIALIZE_SUB_MUL(float, float, float, float)
+SPECIALIZE_INPUT(generic, float)
+SPECIALIZE_OUTPUT(float, float)
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+SPECIALIZE_CLASSIFY(float, double)
+SPECIALIZE_IS_NAN(float, double)
+SPECIALIZE_IS_MINF(float, double)
+SPECIALIZE_IS_PINF(float, double)
+SPECIALIZE_SET_SPECIAL(float, double)
+SPECIALIZE_ASSIGN(float_int, double, signed char)
+SPECIALIZE_ASSIGN(float_int, double, signed short)
+SPECIALIZE_ASSIGN(float_int, double, signed int)
+SPECIALIZE_ASSIGN(float_int, double, signed long)
+SPECIALIZE_ASSIGN(float_int, double, signed long long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, double, mpq_class)
+SPECIALIZE_COPY(generic, double)
+SPECIALIZE_IS_INT(float, double)
+SPECIALIZE_ASSIGN(float_minf, double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, double, Not_A_Number)
+SPECIALIZE_NEG(float, double, double)
+SPECIALIZE_ABS(float, double, double)
+SPECIALIZE_ADD(float, double, double, double)
+SPECIALIZE_SUB(float, double, double, double)
+SPECIALIZE_MUL(float, double, double, double)
+SPECIALIZE_DIV(float, double, double, double)
+SPECIALIZE_REM(float, double, double, double)
+SPECIALIZE_MUL2EXP(float, double, double)
+SPECIALIZE_DIV2EXP(float, double, double)
+SPECIALIZE_SQRT(float, double, double)
+SPECIALIZE_GCD(exact, double, double, double)
+SPECIALIZE_GCDEXT(exact, double, double, double, double, double)
+SPECIALIZE_LCM(gcd_exact, double, double, double)
+SPECIALIZE_SGN(float, double)
+SPECIALIZE_CMP(float, double, double)
+SPECIALIZE_ADD_MUL(float, double, double, double)
+SPECIALIZE_SUB_MUL(float, double, double, double)
+SPECIALIZE_INPUT(generic, double)
+SPECIALIZE_OUTPUT(float, double)
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+SPECIALIZE_CLASSIFY(float, long double)
+SPECIALIZE_IS_NAN(float, long double)
+SPECIALIZE_IS_MINF(float, long double)
+SPECIALIZE_IS_PINF(float, long double)
+SPECIALIZE_SET_SPECIAL(float, long double)
+SPECIALIZE_ASSIGN(float_int, long double, signed char)
+SPECIALIZE_ASSIGN(float_int, long double, signed short)
+SPECIALIZE_ASSIGN(float_int, long double, signed int)
+SPECIALIZE_ASSIGN(float_int, long double, signed long)
+SPECIALIZE_ASSIGN(float_int, long double, signed long long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned char)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned short)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned int)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long)
+SPECIALIZE_ASSIGN(float_int, long double, unsigned long long)
+SPECIALIZE_ASSIGN(float_mpz, long double, mpz_class)
+SPECIALIZE_ASSIGN(float_mpq, long double, mpq_class)
+SPECIALIZE_COPY(generic, long double)
+SPECIALIZE_IS_INT(float, long double)
+SPECIALIZE_ASSIGN(float_minf, long double, Minus_Infinity)
+SPECIALIZE_ASSIGN(float_pinf, long double, Plus_Infinity)
+SPECIALIZE_ASSIGN(float_nan, long double, Not_A_Number)
+SPECIALIZE_NEG(float, long double, long double)
+SPECIALIZE_ABS(float, long double, long double)
+SPECIALIZE_ADD(float, long double, long double, long double)
+SPECIALIZE_SUB(float, long double, long double, long double)
+SPECIALIZE_MUL(float, long double, long double, long double)
+SPECIALIZE_DIV(float, long double, long double, long double)
+SPECIALIZE_REM(float, long double, long double, long double)
+SPECIALIZE_MUL2EXP(float, long double, long double)
+SPECIALIZE_DIV2EXP(float, long double, long double)
+SPECIALIZE_SQRT(float, long double, long double)
+SPECIALIZE_GCD(exact, long double, long double, long double)
+SPECIALIZE_GCDEXT(exact, long double, long double, long double,
+ long double, long double)
+SPECIALIZE_LCM(gcd_exact, long double, long double, long double)
+SPECIALIZE_SGN(float, long double)
+SPECIALIZE_CMP(float, long double, long double)
+SPECIALIZE_ADD_MUL(float, long double, long double, long double)
+SPECIALIZE_SUB_MUL(float, long double, long double, long double)
+SPECIALIZE_INPUT(generic, long double)
+SPECIALIZE_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.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+namespace Checked {
+
+template <typename Policy>
+inline Result
+round_lt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (dir == ROUND_DOWN) {
+ --to;
+ return V_GT;
+ }
+ return V_LT;
+}
+
+template <typename Policy>
+inline Result
+round_gt_mpz(mpz_class& to, Rounding_Dir dir) {
+ if (dir == ROUND_UP) {
+ ++to;
+ return V_LT;
+ }
+ return V_GT;
+}
+
+// FIXME: change this when Autoconf will support AC_C_TYPEOF.
+#ifdef __GNUC__
+//! 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::handle_nan || Policy::handle_infinity) {
+ mp_size_field_t s = get_mp_size(v);
+ if (Policy::handle_nan
+ && (nan || sign)
+ && s == Limits<mp_size_field_t>::min + 1)
+ return VC_NAN;
+ if (!inf && !sign)
+ return VC_NORMAL;
+ if (Policy::handle_infinity) {
+ if (s == Limits<mp_size_field_t>::min)
+ return inf ? VC_MINUS_INFINITY : V_LT;
+ if (s == Limits<mp_size_field_t>::max)
+ return inf ? VC_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return sgn<Policy>(v);
+ return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpz(const mpz_class& v) {
+ return Policy::handle_nan
+ && get_mp_size(v) == Limits<mp_size_field_t>::min + 1;
+}
+
+SPECIALIZE_IS_NAN(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpz(const mpz_class& v) {
+ return Policy::handle_infinity
+ && get_mp_size(v) == Limits<mp_size_field_t>::min;
+}
+
+SPECIALIZE_IS_MINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpz(const mpz_class& v) {
+ return Policy::handle_infinity
+ && get_mp_size(v) == Limits<mp_size_field_t>::max;
+}
+
+SPECIALIZE_IS_PINF(mpz, mpz_class)
+
+template <typename Policy>
+inline bool
+is_int_mpz(const mpz_class& v) {
+ return !is_nan<Policy>(v);
+}
+
+SPECIALIZE_IS_INT(mpz, mpz_class)
+
+template <typename Policy>
+inline Result
+set_special_mpz(mpz_class& v, Result r) {
+ Result c = classify(r);
+ if (Policy::handle_nan && c == VC_NAN)
+ set_mp_size(v, Limits<mp_size_field_t>::min + 1);
+ else if (Policy::handle_infinity) {
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ set_mp_size(v, Limits<mp_size_field_t>::min);
+ break;
+ case VC_PLUS_INFINITY:
+ set_mp_size(v, Limits<mp_size_field_t>::max);
+ break;
+ default:
+ break;
+ }
+ }
+ return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpz, mpz_class)
+
+template <typename Policy>
+inline void
+copy_mpz(mpz_class& to, const mpz_class& from) {
+ if (is_nan_mpz<Policy>(from) ||
+ is_minf_mpz<Policy>(from) || is_pinf_mpz<Policy>(from))
+ set_mp_size(to, get_mp_size(from));
+ else
+ to = from;
+}
+
+SPECIALIZE_COPY(mpz, mpz_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+ new (&to) mpz_class(from);
+ return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, signed long)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpz_base, mpz_class, unsigned long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_base(mpz_class& to, const From from, Rounding_Dir) {
+ to = static_cast<signed long>(from);
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, signed long)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned char)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned short)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned int)
+SPECIALIZE_ASSIGN(mpz_base, mpz_class, unsigned long)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpz_signed_int, mpz_class, signed long long)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpz_unsigned_int, mpz_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpz_float(mpz_class& to, const From from, Rounding_Dir dir) {
+ if (dir == ROUND_IGNORE) {
+ to = from;
+ return V_LGE;
+ }
+ From n = rint(from);
+ to = n;
+ if (from < n)
+ return round_lt_mpz<Policy>(to, dir);
+ else if (from > n)
+ return round_gt_mpz<Policy>(to, dir);
+ else
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, float)
+SPECIALIZE_ASSIGN(mpz_float, mpz_class, double)
+
+template <typename Policy>
+inline Result
+assign_mpz_mpq(mpz_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (dir == ROUND_IGNORE) {
+ to = from;
+ return V_LGE;
+ }
+ mpz_srcptr n = from.get_num().get_mpz_t();
+ mpz_srcptr d = from.get_den().get_mpz_t();
+ if (dir == ROUND_DOWN) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+ }
+ else {
+ assert(dir == ROUND_UP);
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+ }
+}
+
+SPECIALIZE_ASSIGN(mpz_mpq, mpz_class, mpq_class)
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_minf(To& to, const Minus_Infinity&, Rounding_Dir) {
+ if (Policy::handle_infinity) {
+ set_special<Policy>(to, VC_MINUS_INFINITY);
+ return V_EQ;
+ }
+ return VC_MINUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_pinf(To& to, const Plus_Infinity&, Rounding_Dir) {
+ if (Policy::handle_infinity) {
+ set_special<Policy>(to, VC_PLUS_INFINITY);
+ return V_EQ;
+ }
+ return VC_PLUS_INFINITY;
+}
+
+template <typename Policy, typename To>
+inline Result
+assign_mp_nan(To& to, const Not_A_Number&, Rounding_Dir) {
+ if (Policy::handle_nan) {
+ set_special<Policy>(to, VC_NAN);
+ return V_EQ;
+ }
+ return VC_NAN;
+}
+
+SPECIALIZE_ASSIGN(mp_minf, mpz_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpz_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpz_class, Not_A_Number)
+SPECIALIZE_ASSIGN(mp_minf, mpq_class, Minus_Infinity)
+SPECIALIZE_ASSIGN(mp_pinf, mpq_class, Plus_Infinity)
+SPECIALIZE_ASSIGN(mp_nan, mpq_class, Not_A_Number)
+
+template <typename 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;
+}
+
+SPECIALIZE_NEG(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+add_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+SPECIALIZE_ADD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sub_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+SPECIALIZE_SUB(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+SPECIALIZE_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ mpz_srcptr n = x.get_mpz_t();
+ mpz_srcptr d = y.get_mpz_t();
+ if (dir == ROUND_IGNORE) {
+ mpz_divexact(to.get_mpz_t(), n, d);
+ return V_LGE;
+ }
+ if (dir == ROUND_DOWN) {
+ mpz_fdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_GT;
+ }
+ else {
+ assert(dir == ROUND_UP);
+ mpz_cdiv_q(to.get_mpz_t(), n, d);
+ return mpz_divisible_p(n, d) ? V_EQ : V_LT;
+ }
+}
+
+SPECIALIZE_DIV(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+rem_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, ::sgn(y) == 0))
+ return set_special<Policy>(to, V_MOD_ZERO);
+ to = x % y;
+ return V_EQ;
+}
+
+SPECIALIZE_REM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, dir);
+ mpz_mul_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_EQ;
+}
+
+SPECIALIZE_MUL2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpz(mpz_class& to, const mpz_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, dir);
+ mpz_srcptr n = x.get_mpz_t();
+ if (dir == ROUND_IGNORE) {
+ mpz_tdiv_q_2exp(to.get_mpz_t(), x.get_mpz_t(), exp);
+ return V_LGE;
+ }
+ if (dir == ROUND_DOWN) {
+ mpz_fdiv_q_2exp(to.get_mpz_t(), n, exp);
+ return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_GT;
+ }
+ else {
+ assert(dir == ROUND_UP);
+ mpz_cdiv_q_2exp(to.get_mpz_t(), n, exp);
+ return mpz_divisible_2exp_p(n, exp) ? V_EQ : V_LT;
+ }
+}
+
+SPECIALIZE_DIV2EXP(mpz, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+abs_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+SPECIALIZE_ABS(mpz, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_ADD_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_SUB_MUL(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_GCD(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+gcdext_mpz(mpz_class& to, const mpz_class& x, const mpz_class& y,
+ mpz_class& s, mpz_class& t, Rounding_Dir) {
+ mpz_gcdext(to.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(),
+ s.get_mpz_t(), t.get_mpz_t());
+ return V_EQ;
+}
+
+SPECIALIZE_GCDEXT(mpz, mpz_class, mpz_class, mpz_class, mpz_class, mpz_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_LCM(mpz, mpz_class, mpz_class, mpz_class)
+
+template <typename Policy>
+inline Result
+sqrt_mpz(mpz_class& to, const mpz_class& from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+ return set_special<Policy>(to, V_SQRT_NEG);
+ if (dir == ROUND_IGNORE) {
+ to = sqrt(from);
+ return V_GE;
+ }
+ 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<Policy>(to, dir);
+}
+
+SPECIALIZE_SQRT(mpz, mpz_class, mpz_class)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_mp(const Type& x) {
+ int i = ::sgn(x);
+ return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_SGN(mp, mpz_class)
+SPECIALIZE_SGN(mp, mpq_class)
+
+template <typename Policy, typename Type>
+inline Result
+cmp_mp(const Type& x, const Type& y) {
+ int i = ::cmp(x, y);
+ return i > 0 ? V_GT : i == 0 ? V_EQ : V_LT;
+}
+
+SPECIALIZE_CMP(mp, mpz_class, mpz_class)
+SPECIALIZE_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;
+}
+
+SPECIALIZE_INPUT(generic, mpz_class)
+SPECIALIZE_OUTPUT(mpz, mpz_class)
+
+inline memory_size_type
+external_memory_in_bytes(const mpz_class& x) {
+ return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+} // 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::handle_nan || Policy::handle_infinity)
+ && ::sgn(v.get_den()) == 0) {
+ int s = ::sgn(v.get_num());
+ if (Policy::handle_nan && (nan || sign) && s == 0)
+ return VC_NAN;
+ if (!inf && !sign)
+ return VC_NORMAL;
+ if (Policy::handle_infinity) {
+ if (s < 0)
+ return inf ? VC_MINUS_INFINITY : V_LT;
+ if (s > 0)
+ return inf ? VC_PLUS_INFINITY : V_GT;
+ }
+ }
+ if (sign)
+ return sgn<Policy>(v);
+ return VC_NORMAL;
+}
+
+SPECIALIZE_CLASSIFY(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_nan_mpq(const mpq_class& v) {
+ return Policy::handle_nan
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) == 0;
+}
+
+SPECIALIZE_IS_NAN(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_minf_mpq(const mpq_class& v) {
+ return Policy::handle_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) < 0;
+}
+
+SPECIALIZE_IS_MINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_pinf_mpq(const mpq_class& v) {
+ return Policy::handle_infinity
+ && ::sgn(v.get_den()) == 0
+ && ::sgn(v.get_num()) > 0;
+}
+
+SPECIALIZE_IS_PINF(mpq, mpq_class)
+
+template <typename Policy>
+inline bool
+is_int_mpq(const mpq_class& v) {
+ return !is_nan<Policy>(v) && v.get_den() == 1;
+}
+
+SPECIALIZE_IS_INT(mpq, mpq_class)
+
+template <typename Policy>
+inline Result
+set_special_mpq(mpq_class& v, Result r) {
+ Result c = classify(r);
+ if (Policy::handle_nan && c == VC_NAN) {
+ v.get_num() = 0;
+ v.get_den() = 0;
+ }
+ else if (Policy::handle_infinity) {
+ switch (c) {
+ case VC_MINUS_INFINITY:
+ v.get_num() = -1;
+ v.get_den() = 0;
+ break;
+ case VC_PLUS_INFINITY:
+ v.get_num() = 1;
+ v.get_den() = 0;
+ break;
+ default:
+ break;
+ }
+ }
+ return r;
+}
+
+SPECIALIZE_SET_SPECIAL(mpq, mpq_class)
+
+SPECIALIZE_COPY(generic, mpq_class)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+ new (&to) mpq_class(from);
+ return V_EQ;
+}
+
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, signed long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, float)
+SPECIALIZE_CONSTRUCT(mpq_base, mpq_class, double)
+
+template <typename Policy, typename From>
+inline Result
+construct_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+ // FIXME: this is an incredibly inefficient implementation!
+ new (&to) mpq_class;
+ std::stringstream ss;
+ output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+ return input_mpq(to, ss);
+}
+
+SPECIALIZE_CONSTRUCT(mpq_long_double, mpq_class, long double)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_base(mpq_class& to, const From& from, Rounding_Dir) {
+ to = from;
+ return V_EQ;
+}
+
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, mpz_class)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, signed long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned char)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned short)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned int)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, unsigned long)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, float)
+SPECIALIZE_ASSIGN(mpq_base, mpq_class, double)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpq_signed_int, mpq_class, signed long long)
+
+template <typename 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;
+}
+
+SPECIALIZE_ASSIGN(mpq_unsigned_int, mpq_class, unsigned long long)
+
+template <typename Policy, typename From>
+inline Result
+assign_mpq_long_double(mpq_class& to, const From& from, Rounding_Dir dir) {
+ // FIXME: this is an incredibly inefficient implementation!
+ std::stringstream ss;
+ output_float<Policy, long double>(ss, from, Numeric_Format(), dir);
+ return input_mpq(to, ss);
+}
+
+SPECIALIZE_ASSIGN(mpq_long_double, mpq_class, long double)
+
+template <typename 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;
+}
+
+SPECIALIZE_NEG(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+add_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x + y;
+ return V_EQ;
+}
+
+SPECIALIZE_ADD(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+sub_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x - y;
+ return V_EQ;
+}
+
+SPECIALIZE_SUB(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ to = x * y;
+ return V_EQ;
+}
+
+SPECIALIZE_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+ return set_special<Policy>(to, V_DIV_ZERO);
+ to = x / y;
+ return V_EQ;
+}
+
+SPECIALIZE_DIV(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+rem_mpq(mpq_class& to, const mpq_class& x, const mpq_class& y, Rounding_Dir) {
+ if (CHECK_P(Policy::check_div_zero, sgn(y) == 0))
+ return set_special<Policy>(to, V_MOD_ZERO);
+ to = x / y;
+ to.get_num() %= to.get_den();
+ return V_EQ;
+}
+
+SPECIALIZE_REM(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+mul2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return div2exp<Policy>(to, x, -exp, 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;
+}
+
+SPECIALIZE_MUL2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+div2exp_mpq(mpq_class& to, const mpq_class& x, int exp, Rounding_Dir dir) {
+ if (exp < 0)
+ return mul2exp<Policy>(to, x, -exp, 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;
+}
+
+SPECIALIZE_DIV2EXP(mpq, mpq_class, mpq_class)
+
+template <typename Policy>
+inline Result
+abs_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir) {
+ to = abs(from);
+ return V_EQ;
+}
+
+SPECIALIZE_ABS(mpq, mpq_class, mpq_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_ADD_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+template <typename 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;
+}
+
+SPECIALIZE_SUB_MUL(mpq, mpq_class, mpq_class, mpq_class)
+
+extern unsigned long rational_sqrt_precision_parameter;
+
+template <typename Policy>
+inline Result
+sqrt_mpq(mpq_class& to, const mpq_class& from, Rounding_Dir dir) {
+ if (CHECK_P(Policy::check_sqrt_neg, from < 0))
+ return set_special<Policy>(to, V_SQRT_NEG);
+ const unsigned long k = rational_sqrt_precision_parameter;
+ mpz_class& to_num = to.get_num();
+ mul2exp<Policy>(to_num, from.get_num(), 2*k, dir);
+ Result rdiv = div<Policy>(to_num, to_num, from.get_den(), dir);
+ Result rsqrt = sqrt<Policy>(to_num, to_num, dir);
+ mpz_class& to_den = to.get_den();
+ to_den = 1;
+ mul2exp<Policy>(to_den, to_den, k, dir);
+ to.canonicalize();
+ return rdiv != V_EQ ? rdiv : rsqrt;
+}
+
+SPECIALIZE_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);
+ if (r == VC_MINUS_INFINITY)
+ return assign<Policy>(to, MINUS_INFINITY, dir);
+ if (r == VC_PLUS_INFINITY)
+ return assign<Policy>(to, PLUS_INFINITY, dir);
+ return set_special<Policy>(to, r);
+}
+
+template <typename Policy>
+inline Result
+output_mpq(std::ostream& os,
+ const mpq_class& from,
+ const Numeric_Format&,
+ Rounding_Dir) {
+ os << from;
+ return V_EQ;
+}
+
+SPECIALIZE_INPUT(mpq, mpq_class)
+SPECIALIZE_OUTPUT(mpq, mpq_class)
+
+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());
+}
+
+} // namespace Checked
+
+//! Returns the precision parameter used for rational square root calculations.
+inline unsigned
+rational_sqrt_precision_parameter() {
+ return Checked::rational_sqrt_precision_parameter;
+}
+
+//! Sets the precision parameter used for rational square root calculations.
+/*!
+ If \p p is less than or equal to <CODE>INT_MAX</CODE>, sets the
+ precision parameter used for rational square root calculations to \p p.
+
+ \exception std::invalid_argument
+ Thrown if \p p is greater than <CODE>INT_MAX</CODE>.
+*/
+inline void
+set_rational_sqrt_precision_parameter(const unsigned p) {
+ if (p <= INT_MAX)
+ Checked::rational_sqrt_precision_parameter = p;
+ else
+ throw std::invalid_argument("PPL::set_rational_sqrt_precision_parameter(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 {
+
+namespace Checked {
+
+#define handle_ext_natively(T) (Float<T>::fpu_related)
+
+template <typename Policy, typename Type>
+inline Result
+sgn_ext(const Type& x) {
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x)))
+ return VC_NAN;
+ else if (is_minf<Policy>(x))
+ return V_LT;
+ else if (is_pinf<Policy>(x))
+ return V_GT;
+ else
+ return sgn<Policy>(x);
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+construct_ext(To& to, const From& from, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+ return construct<To_Policy>(to, NOT_A_NUMBER, dir);
+ else if (is_minf<From_Policy>(from))
+ return construct<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return construct<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return construct<To_Policy>(to, from, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+assign_ext(To& to, const From& from, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(from)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(from))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(from))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return assign<To_Policy>(to, from, 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 (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else {
+ native:
+ return neg<To_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 (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x) || is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return abs<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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 set_special<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ else if (is_pinf<From2_Policy>(y)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return add<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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 set_special<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto pinf;
+ }
+ else {
+ if (is_pinf<From2_Policy>(y)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ else if (is_minf<From2_Policy>(y)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ else {
+ native:
+ return sub<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto pinf;
+ case V_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto minf;
+ case V_GT:
+ goto pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ goto pinf;
+ case V_GT:
+ goto minf;
+ default:
+ goto inf_mul_zero;
+ }
+ } else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ case V_GT:
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ goto pinf;
+ default:
+ inf_mul_zero:
+ assert(To_Policy::check_inf_mul_zero);
+ return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ native:
+ return mul<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+ || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_minf;
+ case V_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ } else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_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 V_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_add_inf, is_minf<To_Policy>(to))) {
+ inf_add_inf:
+ return set_special<To_Policy>(to, V_INF_ADD_INF);
+ }
+ else
+ goto pinf;
+ default:
+ inf_mul_zero:
+ assert(To_Policy::check_inf_mul_zero);
+ return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ native:
+ return add_mul<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(To_Policy::check_nan_args, is_nan<To_Policy>(to))
+ || CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ if (is_minf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else if (is_pinf<From1_Policy>(x)) {
+ switch (sgn_ext<From2_Policy>(y)) {
+ case V_LT:
+ goto a_minf;
+ case V_GT:
+ goto a_pinf;
+ default:
+ goto inf_mul_zero;
+ }
+ }
+ else {
+ if (is_minf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_LT:
+ goto a_pinf;
+ case V_GT:
+ goto a_minf;
+ default:
+ goto inf_mul_zero;
+ }
+ } else if (is_pinf<From2_Policy>(y)) {
+ switch (sgn<From1_Policy>(x)) {
+ case V_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 V_GT:
+ a_pinf:
+ if (CHECK_P(To_Policy::check_inf_sub_inf, is_pinf<To_Policy>(to))) {
+ inf_sub_inf:
+ return set_special<To_Policy>(to, V_INF_SUB_INF);
+ }
+ else
+ goto minf;
+ default:
+ inf_mul_zero:
+ assert(To_Policy::check_inf_mul_zero);
+ return set_special<To_Policy>(to, V_INF_MUL_ZERO);
+ }
+ }
+ else {
+ if (is_minf<To_Policy>(to)) {
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ }
+ if (is_pinf<To_Policy>(to)) {
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ }
+ native:
+ return sub_mul<To_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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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 V_LT:
+ goto pinf;
+ case V_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 set_special<To_Policy>(to, V_INF_DIV_INF);
+ }
+ else {
+ switch (sgn<From2_Policy>(y)) {
+ case V_LT:
+ minf:
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ case V_GT:
+ pinf:
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ default:
+ div_zero:
+ assert(To_Policy::check_div_zero);
+ return set_special<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>(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 (handle_ext_natively(To)
+ && handle_ext_natively(From1)
+ && handle_ext_natively(From2))
+ goto native;
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (CHECK_P(To_Policy::check_inf_mod, is_minf<From1_Policy>(x)
+ || is_pinf<From1_Policy>(x)))
+ return set_special<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>(to, x, y, dir);
+ }
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+mul2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return mul2exp<To_Policy>(to, x, exp, dir);
+ }
+}
+
+template <typename To_Policy, typename From_Policy,
+ typename To, typename From>
+inline Result
+div2exp_ext(To& to, const From& x, int exp, Rounding_Dir dir) {
+ if (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return assign<To_Policy>(to, MINUS_INFINITY, dir);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return div2exp<To_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 (handle_ext_natively(To) && handle_ext_natively(From))
+ goto native;
+ if (CHECK_P(From_Policy::check_nan_args, is_nan<From_Policy>(x)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From_Policy>(x))
+ return set_special<To_Policy>(to, V_SQRT_NEG);
+ else if (is_pinf<From_Policy>(x))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else {
+ native:
+ return sqrt<To_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 (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ 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>(to, x, y, dir);
+}
+
+template <typename To1_Policy, typename From1_Policy, typename From2_Policy,
+ typename To2_Policy, typename To3_Policy,
+ typename To1, typename From1, typename From2, typename To2, typename To3>
+inline Result
+gcdext_ext(To1& to, const From1& x, const From2& y,
+ To2& s, To3& t, Rounding_Dir dir) {
+ if (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To1_Policy>(to, VC_NAN);
+ 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>(to, x, y, s, t, 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 (CHECK_P(From1_Policy::check_nan_args, is_nan<From1_Policy>(x))
+ || CHECK_P(From2_Policy::check_nan_args, is_nan<From2_Policy>(y)))
+ return set_special<To_Policy>(to, VC_NAN);
+ else if (is_minf<From1_Policy>(x) || is_pinf<From1_Policy>(x)
+ || is_minf<From2_Policy>(y) || is_pinf<From2_Policy>(y))
+ return assign<To_Policy>(to, PLUS_INFINITY, dir);
+ else
+ return lcm<To_Policy>(to, x, y, dir);
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline Result
+cmp_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return V_UNORD_COMP;
+ else if (is_minf<Policy1>(x))
+ return is_minf<Policy2>(y) ? V_EQ : V_LT;
+ else if (is_pinf<Policy1>(x))
+ return is_pinf<Policy2>(y) ? V_EQ : V_GT;
+ else {
+ if (is_minf<Policy2>(y))
+ return V_GT;
+ if (is_pinf<Policy2>(y))
+ return V_LT;
+ native:
+ return cmp<Policy1>(x, y);
+ }
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+lt_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, 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 x < y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+gt_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return false;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return false;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return true;
+ native:
+ return x > y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+le_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, 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 x <= y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ge_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return false;
+ if (is_pinf<Policy1>(x) || is_minf<Policy2>(y))
+ return true;
+ if (is_minf<Policy1>(x) || is_pinf<Policy2>(y))
+ return false;
+ native:
+ return x >= y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+eq_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, 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);
+ native:
+ return x == y;
+}
+
+template <typename Policy1, typename Policy2,
+ typename Type1, typename Type2>
+inline bool
+ne_ext(const Type1& x, const Type2& y) {
+ if (handle_ext_natively(Type1) && handle_ext_natively(Type2))
+ goto native;
+ if (CHECK_P(Policy1::check_nan_args, is_nan<Policy1>(x))
+ || CHECK_P(Policy2::check_nan_args, is_nan<Policy2>(y)))
+ return true;
+ if (is_minf<Policy1>(x))
+ return !is_minf<Policy2>(y);
+ if (is_pinf<Policy1>(x))
+ return !is_pinf<Policy2>(y);
+ native:
+ return 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 (handle_ext_natively(Type))
+ goto native;
+ if (CHECK_P(Policy::check_nan_args, is_nan<Policy>(x))) {
+ os << "nan";
+ return VC_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 391
+
+// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 28
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Transparent_Policy {
+ //! Checks for overflowed result.
+ static const int check_overflow = 0;
+
+ //! Checks for attempts to add infinities with different sign.
+ static const int check_inf_add_inf = 0;
+
+ //! Checks for attempts to sub infinities with same sign.
+ static const int check_inf_sub_inf = 0;
+
+ //! Checks for attempts to mul infinities by zero.
+ static const int check_inf_mul_zero = 0;
+
+ //! Checks for attempts to divide by zero.
+ static const int check_div_zero = 0;
+
+ //! Checks for attempts to divide infinities.
+ static const int check_inf_div_inf = 0;
+
+ //! Checks for attempts to compute remainder of infinities.
+ static const int check_inf_mod = 0;
+
+ //! Checks for attempts to take the square root of a negative number.
+ static const int check_sqrt_neg = 0;
+
+ //! Handles not-a-number special value.
+ static const int handle_nan = 0;
+
+ //! Handles infinity special values.
+ static const int handle_infinity = 0;
+
+ //! Representation is identical to primitive.
+ static const int convertible = 1;
+
+ //! Checks for FPU inexact result.
+ static const int fpu_check_inexact = 0;
+
+ //! Checks for NaN arguments
+ static const int check_nan_args = 0;
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Checked_Number_Default_Policy {
+ static const int check_overflow = 1;
+ static const int check_inf_add_inf = 0;
+ static const int check_inf_sub_inf = 0;
+ static const int check_inf_mul_zero = 0;
+ static const int check_div_zero = 0;
+ static const int check_inf_div_inf = 0;
+ static const int check_inf_mod = 0;
+ static const int check_sqrt_neg = 0;
+ static const int handle_nan = 0;
+ static const int handle_infinity = 0;
+ static const int convertible = 1;
+ static const int fpu_check_inexact = 0;
+ static const int check_nan_args = 1;
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_NATIVE;
+ static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_NATIVE;
+ static void handle_result(Result r);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+struct Extended_Number_Policy {
+ static const int check_overflow = 1;
+ static const int check_inf_add_inf = 0;
+ static const int check_inf_sub_inf = 0;
+ static const int check_inf_mul_zero = 0;
+ static const int check_div_zero = 0;
+ static const int check_inf_div_inf = 0;
+ static const int check_inf_mod = 0;
+ static const int check_sqrt_neg = 0;
+ static const int handle_nan = 1;
+ static const int handle_infinity = 1;
+ // Don't uncomment the following.
+ // The compile time error on conversions is the expected behaviour.
+ // static const int convertible = 0;
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ static const int fpu_check_inexact = 1;
+#else
+ static const int fpu_check_inexact = 0;
+#endif
+ static const int check_nan_args = 1;
+ static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR_INF = ROUND_NOT_NEEDED;
+ static const Rounding_Dir ROUND_DEFAULT_ASSIGN_INF = ROUND_NOT_NEEDED;
+ // Don't uncomment the following.
+ // The compile time error is the expected behaviour.
+ // static const Rounding_Dir ROUND_DEFAULT_CONSTRUCTOR = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_OPERATOR = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_FUNCTION = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_INPUT = ROUND_UP;
+ // static const Rounding_Dir ROUND_DEFAULT_OUTPUT = ROUND_UP;
+ static void handle_result(Result r);
+};
+
+typedef Checked::Check_Overflow_Policy Default_To_Policy;
+typedef Checked_Number_Transparent_Policy Default_From_Policy;
+
+template <typename T>
+struct Native_Checked_From_Wrapper {
+ typedef Default_From_Policy Policy;
+ static const T& raw_value(const T& v) {
+ return v;
+ }
+};
+
+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();
+ }
+};
+
+template <typename T>
+struct Native_Checked_To_Wrapper {
+ typedef Default_To_Policy Policy;
+ static T& raw_value(T& v) {
+ return v;
+ }
+};
+
+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();
+ }
+};
+
+//! 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 signed char and rounding mode.
+ Checked_Number(const signed char y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed short and rounding mode.
+ Checked_Number(const signed short y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed int and rounding mode.
+ Checked_Number(const signed int y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long and rounding mode.
+ Checked_Number(const signed long y, Rounding_Dir dir);
+
+ //! Direct initialization from a signed long long and rounding mode.
+ Checked_Number(const signed long long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned char and rounding mode.
+ Checked_Number(const unsigned char y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned short and rounding mode.
+ Checked_Number(const unsigned short y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned int and rounding mode.
+ Checked_Number(const unsigned int y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long and rounding mode.
+ Checked_Number(const unsigned long y, Rounding_Dir dir);
+
+ //! Direct initialization from an unsigned long long and rounding mode.
+ Checked_Number(const unsigned long long y, Rounding_Dir dir);
+
+#if PPL_SUPPORTED_FLOAT
+ //! Direct initialization from a float and rounding mode.
+ Checked_Number(const float y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_DOUBLE
+ //! Direct initialization from a double and rounding mode.
+ Checked_Number(const double y, Rounding_Dir dir);
+#endif
+
+#if PPL_SUPPORTED_LONG_DOUBLE
+ //! Direct initialization from a long double and rounding mode.
+ Checked_Number(const 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 minus infinity and rounding mode.
+ Checked_Number(const Minus_Infinity& y, Rounding_Dir dir);
+
+ //! Direct initialization from plus infinity and rounding mode.
+ Checked_Number(const Plus_Infinity& y, Rounding_Dir dir);
+
+ //! Direct initialization from NAN and rounding mode.
+ Checked_Number(const Not_A_Number& y, Rounding_Dir dir);
+
+ //! 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 signed char, default rounding mode.
+ Checked_Number(const signed char y);
+
+ //! Direct initialization from a signed short, default rounding mode.
+ Checked_Number(const signed short y);
+
+ //! Direct initialization from a signed int, default rounding mode.
+ Checked_Number(const signed int y);
+
+ //! Direct initialization from a signed long, default rounding mode.
+ Checked_Number(const signed long y);
+
+ //! Direct initialization from a signed long long, default rounding mode.
+ Checked_Number(const signed long long y);
+
+ //! Direct initialization from an unsigned char, default rounding mode.
+ Checked_Number(const unsigned char y);
+
+ //! Direct initialization from an unsigned short, default rounding mode.
+ Checked_Number(const unsigned short y);
+
+ //! Direct initialization from an unsigned int, default rounding mode.
+ Checked_Number(const unsigned int y);
+
+ //! Direct initialization from an unsigned long, default rounding mode.
+ Checked_Number(const unsigned long y);
+
+ //! Direct initialization from an unsigned long long, default rounding mode.
+ Checked_Number(const unsigned long long y);
+
+ //! Direct initialization from a float, default rounding mode.
+ Checked_Number(const float y);
+
+ //! Direct initialization from a double, default rounding mode.
+ Checked_Number(const double y);
+
+ //! Direct initialization from a long double, default rounding mode.
+ Checked_Number(const 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 minus infinity, default rounding mode.
+ Checked_Number(const Minus_Infinity& y);
+
+ //! Direct initialization from plus infinity, default rounding mode.
+ Checked_Number(const Plus_Infinity& y);
+
+ //! Direct initialization from NAN, default rounding mode.
+ Checked_Number(const Not_A_Number& y);
+
+ //@} // 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, typename From_Policy>
+ Checked_Number& operator=(const Checked_Number<From, From_Policy>& y);
+
+ //! Assignment operator.
+ template <typename From>
+ Checked_Number& operator=(const From& y);
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Not_A_Number& y);
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Minus_Infinity& y);
+
+ //! Assignment operator.
+ Checked_Number& operator=(const Plus_Infinity& 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 From_Policy>
+ Checked_Number& operator+=(const Checked_Number<From, From_Policy>& y);
+
+ template <typename From>
+ Checked_Number& 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 From_Policy>
+ Checked_Number& operator-=(const Checked_Number<From, From_Policy>& y);
+
+ //! Subtract and assign operator.
+ template <typename From>
+ Checked_Number& 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);
+ template <typename From, typename From_Policy>
+
+ //! Multiply and assign operator.
+ Checked_Number& operator*=(const Checked_Number<From, From_Policy>& y);
+
+ //! Multiply and assign operator.
+ template <typename From>
+ Checked_Number& 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 From_Policy>
+ Checked_Number& operator/=(const Checked_Number<From, From_Policy>& y);
+
+ //! Divide and assign operator.
+ template <typename From>
+ Checked_Number& 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 From_Policy>
+ Checked_Number& operator%=(const Checked_Number<From, From_Policy>& y);
+
+ //! Compute remainder and assign operator.
+ template <typename From>
+ Checked_Number& 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;
+};
+
+template <typename T, typename Policy>
+bool is_not_a_number(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_minus_infinity(const Checked_Number<T, Policy>& x);
+template <typename T, typename Policy>
+bool is_plus_infinity(const Checked_Number<T, Policy>& x);
+
+template <typename To>
+Result assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir);
+template <typename To>
+Result assign_r(To& to, const char* x, Rounding_Dir dir);
+template <typename To, typename To_Policy>
+Result assign_r(To& to, char* x, Rounding_Dir dir);
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, Rounding_Dir dir);
+
+FUNC1(assign_r)
+FUNC1(neg_assign_r)
+FUNC1(abs_assign_r)
+FUNC1(sqrt_assign_r)
+
+#undef FUNC1
+
+#define FUNC1(name) \
+template <typename To, typename From> \
+Result name(To& to, const From& x, int exp, Rounding_Dir dir);
+
+FUNC1(mul2exp_assign_r)
+FUNC1(div2exp_assign_r)
+
+#undef FUNC1
+
+#define FUNC2(name) \
+template <typename To, typename From1, typename From2> \
+Result name(To& to, const From1& x, const From2& y, Rounding_Dir dir);
+
+FUNC2(add_assign_r)
+FUNC2(sub_assign_r)
+FUNC2(mul_assign_r)
+FUNC2(div_assign_r)
+FUNC2(rem_assign_r)
+FUNC2(gcd_assign_r)
+FUNC2(lcm_assign_r)
+FUNC2(add_mul_assign_r)
+FUNC2(sub_mul_assign_r)
+
+#undef FUNC2
+
+#define FUNC4(name) \
+template <typename To1, typename From1, typename From2, \
+ typename To2, typename To3> \
+Result name(To1& to, const From1& x, const From2& y, \
+ To2& s, To3& t, Rounding_Dir dir);
+
+FUNC4(gcdext_assign_r)
+
+#undef FUNC4
+
+//! Swaps \p *this with \p y.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y);
+
+//! \name Accessor Functions
+//@{
+
+//! Returns a const reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+const T&
+raw_value(const Checked_Number<T, Policy>& x);
+
+//! Returns a reference to the underlying native integer value.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+T&
+raw_value(Checked_Number<T, Policy>& x);
+
+//@} // 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>
+size_t
+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>
+size_t
+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 its negation.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+void
+neg_assign(Checked_Number<T, Policy>& x);
+
+//! 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,
+ const Checked_Number<T, Policy>& y,
+ const Checked_Number<T, Policy>& z,
+ Checked_Number<T, Policy>& s,
+ Checked_Number<T, Policy>& t);
+
+//! 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);
+
+/*! \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 Policy1,
+ typename T2, typename Policy2>
+bool
+operator==(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Disequality operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator!=(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Greater than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator>=(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Greater than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator>(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Less than or equal to operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator<=(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//! Less than operator.
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+bool
+operator<(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& 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 T, typename Policy>
+int
+sgn(const Checked_Number<T, Policy>& 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 T1, typename Policy1,
+ typename T2, typename Policy2>
+int
+cmp(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y);
+
+//@} // Relational Operators and Comparison Functions
+
+//! \name Input-Output Operators
+//@{
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+Result
+output(std::ostream& os,
+ const Checked_Number<T, Policy>& x,
+ const Numeric_Format& fmt,
+ 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);
+
+//! 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>;
+ - 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 : unum | '+'
+ | SIGN unum ;
+
+unum : unum1 EXP : 'e'
+ | HEX unum1 | '*^'
+ | base BASE unum1 ;
+ ;
+ POINT : '.'
+unum1 : 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 Policy>
+Result
+input(std::istream& is, Checked_Number<T, Policy>& x, Rounding_Dir dir);
+
+//! Input operator.
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+std::istream&
+operator>>(std::istream& is, Checked_Number<T, Policy>& x);
+
+//@} // 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();
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Checked_Number.inlines.hh line 1
+/* Checked_Number class implementation: inline functions.
+*/
+
+
+#include <stdexcept>
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline Rounding_Dir
+rounding_dir(Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ return ROUND_DIRECT;
+#else
+ return ROUND_IGNORE;
+#endif
+ }
+ return dir;
+}
+
+inline Result
+check_result(Result r, Rounding_Dir dir) {
+ if (dir == ROUND_NOT_NEEDED && !is_special(r)) {
+#ifdef DEBUG_ROUND_NOT_NEEDED
+ // FIXME: this is wrong. If an overflow happens the Result may be
+ // V_LT or V_GT. What's the better way to cope with that?
+ assert(r == V_EQ);
+#else
+ return V_EQ;
+#endif
+ }
+ return r;
+}
+
+
+inline void
+Checked_Number_Transparent_Policy::handle_result(Result) {
+}
+
+inline void
+Checked_Number_Default_Policy::handle_result(Result r) {
+ if (is_special(r))
+ throw_result_exception(r);
+}
+
+inline void
+Extended_Number_Policy::handle_result(Result r) {
+ if (is_special(r))
+ 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>(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 DEF_CTOR(type) \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x, Rounding_Dir dir) { \
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+} \
+template <typename T, typename Policy> \
+inline \
+Checked_Number<T, Policy>::Checked_Number(const type x) { \
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR; \
+ Policy::handle_result(check_result(Checked::assign_ext<Policy, Default_From_Policy>(v, x, rounding_dir(dir)), dir)); \
+}
+
+#define COND_0(...)
+#define COND_1(...) __VA_ARGS__
+#define COND_(if, ...) COND_##if(__VA_ARGS__)
+#define COND(if, ...) COND_(if, __VA_ARGS__)
+
+DEF_CTOR(signed char)
+DEF_CTOR(signed short)
+DEF_CTOR(signed int)
+DEF_CTOR(signed long)
+DEF_CTOR(signed long long)
+DEF_CTOR(unsigned char)
+DEF_CTOR(unsigned short)
+DEF_CTOR(unsigned int)
+DEF_CTOR(unsigned long)
+DEF_CTOR(unsigned long long)
+COND(PPL_SUPPORTED_FLOAT, DEF_CTOR(float))
+COND(PPL_SUPPORTED_DOUBLE, DEF_CTOR(double))
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_CTOR(long double))
+DEF_CTOR(mpq_class&)
+DEF_CTOR(mpz_class&)
+
+#undef DEF_CTOR
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const char* x, Rounding_Dir dir) {
+ std::istringstream s(x);
+ 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* x) {
+ std::istringstream s(x);
+ 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>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Not_A_Number& x) {
+ // TODO: avoid default construction of value member
+ Rounding_Dir dir = ROUND_IGNORE;
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Minus_Infinity& x) {
+ // TODO: avoid default construction of value member
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x,
+ Rounding_Dir dir) {
+ // TODO: avoid default construction of value member
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T, typename Policy>
+inline
+Checked_Number<T, Policy>::Checked_Number(const Plus_Infinity& x) {
+ // TODO: avoid default construction of value member
+ Rounding_Dir dir = Policy::ROUND_DEFAULT_CONSTRUCTOR_INF;
+ Policy::handle_result(check_result(Checked::assign<Policy>(v,
+ x,
+ rounding_dir(dir)),
+ dir));
+}
+
+template <typename T>
+inline bool
+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 bool
+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 bool
+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 bool
+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 Checked::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 Checked::external_memory_in_bytes(x.raw_value());
+}
+
+template <typename To>
+inline Result
+assign_r(To& to, const Minus_Infinity& x, Rounding_Dir dir) {
+ return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Plus_Infinity& x, Rounding_Dir dir) {
+ return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+template <typename To>
+inline Result
+assign_r(To& to, const Not_A_Number& x, Rounding_Dir dir) {
+ return check_result(Checked::assign<typename Native_Checked_To_Wrapper<To>::Policy>(Native_Checked_To_Wrapper<To>::raw_value(to), x, rounding_dir(dir)), dir);
+}
+
+template <typename To>
+inline Result
+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 FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+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); \
+}
+
+FUNC1(construct, construct_ext)
+FUNC1(assign_r, assign_ext)
+FUNC1(neg_assign_r, neg_ext)
+FUNC1(abs_assign_r, abs_ext)
+FUNC1(sqrt_assign_r, sqrt_ext)
+
+#undef FUNC1
+
+#define FUNC1(name, func) \
+template <typename To, typename From> \
+inline Result \
+name(To& to, const From& x, 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); \
+}
+
+FUNC1(mul2exp_assign_r, mul2exp_ext)
+FUNC1(div2exp_assign_r, div2exp_ext)
+
+#undef FUNC1
+
+#define FUNC2(name, func) \
+template <typename To, \
+ typename From1, \
+ typename From2> \
+inline Result \
+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); \
+}
+
+FUNC2(add_assign_r, add_ext)
+FUNC2(sub_assign_r, sub_ext)
+FUNC2(mul_assign_r, mul_ext)
+FUNC2(div_assign_r, div_ext)
+FUNC2(rem_assign_r, rem_ext)
+FUNC2(gcd_assign_r, gcd_ext)
+FUNC2(lcm_assign_r, lcm_ext)
+FUNC2(add_mul_assign_r, add_mul_ext)
+FUNC2(sub_mul_assign_r, sub_mul_ext)
+
+#undef FUNC2
+
+#define FUNC4(name, func) \
+template <typename To1, \
+ typename From1, \
+ typename From2, \
+ typename To2, \
+ typename To3> \
+inline Result \
+name(To1& to, const From1& x, const From2& y, To2& s, To3& t, \
+ Rounding_Dir dir) { \
+ return \
+ check_result \
+ (Checked::func<typename Native_Checked_To_Wrapper<To1>::Policy, \
+ typename Native_Checked_From_Wrapper<From1>::Policy, \
+ typename Native_Checked_From_Wrapper<From2>::Policy, \
+ typename Native_Checked_To_Wrapper<To2>::Policy, \
+ typename Native_Checked_To_Wrapper<To3>::Policy> \
+ (Native_Checked_To_Wrapper<To1>::raw_value(to), \
+ Native_Checked_From_Wrapper<From1>::raw_value(x), \
+ Native_Checked_From_Wrapper<From2>::raw_value(y), \
+ Native_Checked_To_Wrapper<To2>::raw_value(s), \
+ Native_Checked_To_Wrapper<To3>::raw_value(t), \
+ rounding_dir(dir)), \
+ dir); \
+}
+
+FUNC4(gcdext_assign_r, gcdext_ext)
+
+#undef FUNC4
+
+#define DEF_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;\
+}
+
+DEF_INCREMENT(operator ++, add_assign_r)
+DEF_INCREMENT(operator --, sub_assign_r)
+
+#undef DEF_INCREMENT
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline void
+swap(Checked_Number<T, Policy>& x, Checked_Number<T, Policy>& y) {
+ std::swap(x.raw_value(), y.raw_value());
+}
+
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Checked_Number<T, Policy>& y) {
+ Checked::copy<Policy>(v, y.raw_value());
+ return *this;
+}
+template <typename T, typename Policy>
+template <typename From, typename From_Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>
+::operator=(const Checked_Number<From, From_Policy>& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_OPERATOR));
+ 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;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Not_A_Number& y) {
+ Policy::handle_result(assign_r(*this, y, ROUND_IGNORE));
+ return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Minus_Infinity& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+ return *this;
+}
+template <typename T, typename Policy>
+inline Checked_Number<T, Policy>&
+Checked_Number<T, Policy>::operator=(const Plus_Infinity& y) {
+ Policy::handle_result(assign_r(*this, y, Policy::ROUND_DEFAULT_ASSIGN_INF));
+ return *this;
+}
+
+#define DEF_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, typename From_Policy> \
+inline Checked_Number<T, Policy>& \
+Checked_Number<T, Policy>::f(const Checked_Number<From, From_Policy>& y) { \
+ Checked_Number<T, Policy> cy(y); \
+ Policy::handle_result(fun(*this, *this, cy, \
+ Policy::ROUND_DEFAULT_OPERATOR)); \
+ return *this; \
+} \
+template <typename T, typename Policy> \
+template <typename From> \
+inline Checked_Number<T, Policy>& \
+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; \
+}
+
+DEF_BINARY_OP_ASSIGN(operator +=, add_assign_r)
+DEF_BINARY_OP_ASSIGN(operator -=, sub_assign_r)
+DEF_BINARY_OP_ASSIGN(operator *=, mul_assign_r)
+DEF_BINARY_OP_ASSIGN(operator /=, div_assign_r)
+DEF_BINARY_OP_ASSIGN(operator %=, rem_assign_r)
+
+#undef DEF_BINARY_OP_ASSIGN
+
+#define DEF_BINARY_OP_TYPE(f, fun, Type) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+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> \
+inline Checked_Number<T, Policy> \
+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; \
+}
+
+#define DEF_BINARY_OP(f, fun) \
+template <typename T, typename Policy> \
+inline Checked_Number<T, Policy> \
+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; \
+} \
+DEF_BINARY_OP_TYPE(f, fun, signed char) \
+DEF_BINARY_OP_TYPE(f, fun, signed short) \
+DEF_BINARY_OP_TYPE(f, fun, signed int) \
+DEF_BINARY_OP_TYPE(f, fun, signed long) \
+DEF_BINARY_OP_TYPE(f, fun, signed long long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned char) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned short) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned int) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long) \
+DEF_BINARY_OP_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_BINARY_OP_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_BINARY_OP_TYPE(f, fun, long double)) \
+DEF_BINARY_OP_TYPE(f, fun, mpz_class&) \
+DEF_BINARY_OP_TYPE(f, fun, mpq_class&)
+
+DEF_BINARY_OP(operator +, add_assign_r)
+DEF_BINARY_OP(operator -, sub_assign_r)
+DEF_BINARY_OP(operator *, mul_assign_r)
+DEF_BINARY_OP(operator /, div_assign_r)
+DEF_BINARY_OP(operator %, rem_assign_r)
+
+#undef DEF_BINARY_OP_TYPE
+#undef DEF_BINARY_OP
+
+#define DEF_COMPARE_TYPE(f, fun, Type) \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Type x, const Checked_Number<From, From_Policy>& y) { \
+ return Checked::fun<Default_From_Policy, From_Policy>(x, y.raw_value()); \
+} \
+template <typename From, typename From_Policy> \
+inline bool \
+f(const Checked_Number<From, From_Policy>& x, const Type y) { \
+ return Checked::fun<From_Policy, Default_From_Policy>(x.raw_value(), y); \
+}
+
+#define DEF_COMPARE(f, fun) \
+template <typename T1, typename Policy1, \
+ typename T2, typename Policy2> \
+inline bool \
+f(const Checked_Number<T1, Policy1>& x, \
+ const Checked_Number<T2, Policy2>& y) { \
+ return Checked::fun<Policy1, Policy2>(x.raw_value(), y.raw_value()); \
+} \
+DEF_COMPARE_TYPE(f, fun, signed char) \
+DEF_COMPARE_TYPE(f, fun, signed short) \
+DEF_COMPARE_TYPE(f, fun, signed int) \
+DEF_COMPARE_TYPE(f, fun, signed long) \
+DEF_COMPARE_TYPE(f, fun, signed long long) \
+DEF_COMPARE_TYPE(f, fun, unsigned char) \
+DEF_COMPARE_TYPE(f, fun, unsigned short) \
+DEF_COMPARE_TYPE(f, fun, unsigned int) \
+DEF_COMPARE_TYPE(f, fun, unsigned long) \
+DEF_COMPARE_TYPE(f, fun, unsigned long long) \
+COND(PPL_SUPPORTED_FLOAT, DEF_COMPARE_TYPE(f, fun, float)) \
+COND(PPL_SUPPORTED_DOUBLE, DEF_COMPARE_TYPE(f, fun, double)) \
+COND(PPL_SUPPORTED_LONG_DOUBLE, DEF_COMPARE_TYPE(f, fun, long double)) \
+DEF_COMPARE_TYPE(f, fun, mpz_class&) \
+DEF_COMPARE_TYPE(f, fun, mpq_class&)
+
+
+DEF_COMPARE(operator ==, eq_ext)
+DEF_COMPARE(operator !=, ne_ext)
+DEF_COMPARE(operator >=, ge_ext)
+DEF_COMPARE(operator >, gt_ext)
+DEF_COMPARE(operator <=, le_ext)
+DEF_COMPARE(operator <, lt_ext)
+
+#undef DEF_COMPARE_TYPE
+#undef DEF_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 DEF_ASSIGN_FUN2_1(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x) { \
+ Policy::handle_result(fun(x, x, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN2_2(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y) { \
+ Policy::handle_result(fun(x, y, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+#define DEF_ASSIGN_FUN3_3(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+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 DEF_ASSIGN_FUN5_5(f, fun) \
+template <typename T, typename Policy> \
+inline void \
+f(Checked_Number<T, Policy>& x, const Checked_Number<T, Policy>& y, \
+ const Checked_Number<T, Policy>& z, \
+ Checked_Number<T, Policy>& s, Checked_Number<T, Policy>& t) { \
+ Policy::handle_result(fun(x, y, z, s, t, Policy::ROUND_DEFAULT_FUNCTION)); \
+}
+
+DEF_ASSIGN_FUN2_2(sqrt_assign, sqrt_assign_r)
+
+DEF_ASSIGN_FUN2_1(neg_assign, neg_assign_r)
+DEF_ASSIGN_FUN2_2(neg_assign, neg_assign_r)
+
+DEF_ASSIGN_FUN3_3(add_mul_assign, add_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(sub_mul_assign, sub_mul_assign_r)
+
+DEF_ASSIGN_FUN3_3(gcd_assign, gcd_assign_r)
+
+DEF_ASSIGN_FUN5_5(gcdext_assign, gcdext_assign_r)
+
+DEF_ASSIGN_FUN3_3(lcm_assign, lcm_assign_r)
+
+#undef DEF_ASSIGN_FUN2_1
+#undef DEF_ASSIGN_FUN2_2
+#undef DEF_ASSIGN_FUN3_2
+#undef DEF_ASSIGN_FUN3_3
+
+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 T, typename Policy>
+inline int
+sgn(const Checked_Number<T, Policy>& x) {
+ Result r = Checked::sgn_ext<Policy>(x.raw_value());
+ switch (r) {
+ case V_LT:
+ return -1;
+ case V_EQ:
+ return 0;
+ case V_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename T1, typename Policy1,
+ typename T2, typename Policy2>
+inline int
+cmp(const Checked_Number<T1, Policy1>& x,
+ const Checked_Number<T2, Policy2>& y) {
+ Result r = Checked::cmp_ext<Policy1, Policy2>(x.raw_value(), y.raw_value());
+ switch (r) {
+ case V_LT:
+ return -1;
+ case V_EQ:
+ return 0;
+ case V_GT:
+ return 1;
+ default:
+ throw(0);
+ }
+}
+
+/*! \relates Checked_Number */
+template <typename T, typename Policy>
+inline Result
+output(std::ostream& os, const Checked_Number<T, Policy>& x,
+ const Numeric_Format& fmt, Rounding_Dir dir) {
+ return check_result(Checked::output_ext<Policy>(os,
+ x.raw_value(),
+ fmt,
+ 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 Policy>
+inline Result
+input(Checked_Number<T, Policy>& x, std::istream& is, Rounding_Dir dir) {
+ return check_result(Checked::input_ext<Policy>(x.raw_value(),
+ 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;
+}
+
+} // 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/mp_numeric_limits.hh line 1
+/* Specializations of std::numeric_limits for multi-precision types.
+ This will become obsolete when GMP and MPFR will provide the
+ specializations by themselves.
+*/
+
+
+#include <gmpxx.h>
+#include <limits>
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specialization of std::numeric_limits.
+#endif // 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 // 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
+
+// Automatically generated from PPL source file ../src/checked_numeric_limits.hh line 29
+#include <limits>
+
+namespace std {
+
+#define PPL_SPECIALIZE_LIMITS_INT(T) \
+/*! \brief Partial specialization of std::numeric_limits. */ \
+template <typename Policy> \
+class numeric_limits<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+ : public numeric_limits<T> { \
+ private: \
+ typedef Parma_Polyhedra_Library::Checked_Number<T, Policy> Type; \
+ \
+ public: \
+ static const bool has_infinity = Policy::handle_infinity; \
+ static const bool has_quiet_NaN = Policy::handle_nan; \
+ \
+ static Type min() { \
+ return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::min; \
+ } \
+ \
+ static Type max() { \
+ return Parma_Polyhedra_Library::Checked::Extended_Int<Policy, T>::max; \
+ } \
+ \
+ static Type infinity() { \
+ return \
+ Policy::handle_infinity \
+ ? Parma_Polyhedra_Library::PLUS_INFINITY \
+ : static_cast<Type>(0); \
+ } \
+ \
+ static Type quiet_NaN() { \
+ return \
+ Policy::handle_nan \
+ ? Parma_Polyhedra_Library::NOT_A_NUMBER \
+ : static_cast<Type>(0); \
+ } \
+};
+
+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<Parma_Polyhedra_Library::Checked_Number<T, Policy> > \
+ : public numeric_limits<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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> >
+ : public numeric_limits<mpz_class> {
+private:
+ typedef Parma_Polyhedra_Library::Checked_Number<mpz_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::handle_infinity;
+ static const bool has_quiet_NaN = Policy::handle_nan;
+
+ static Type infinity() {
+ return
+ Policy::handle_infinity
+ ? Parma_Polyhedra_Library::PLUS_INFINITY
+ : static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return
+ Policy::handle_nan
+ ? Parma_Polyhedra_Library::NOT_A_NUMBER
+ : static_cast<Type>(0);
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partial specialization of std::numeric_limits.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename Policy>
+class
+numeric_limits<Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> >
+: public numeric_limits<mpq_class> {
+private:
+ typedef Parma_Polyhedra_Library::Checked_Number<mpq_class, Policy> Type;
+
+public:
+ static const bool has_infinity = Policy::handle_infinity;
+ static const bool has_quiet_NaN = Policy::handle_nan;
+
+ static Type infinity() {
+ return
+ Policy::handle_infinity
+ ? Parma_Polyhedra_Library::PLUS_INFINITY
+ : static_cast<Type>(0);
+ }
+
+ static Type quiet_NaN() {
+ return
+ Policy::handle_nan
+ ? Parma_Polyhedra_Library::NOT_A_NUMBER
+ : static_cast<Type>(0);
+ }
+};
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Checked_Number.defs.hh line 912
+
+// Automatically generated from PPL source file ../src/Coefficient.types.hh line 16
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Coefficient traits specialization for 8 bits checked integers.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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 // 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 // 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 // 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(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+
+#ifdef GMP_INTEGERS
+// Automatically generated from PPL source file ../src/Coefficient.types.hh line 67
+#endif
+
+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 its default
+ policy (Checked_Number_Default_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 COEFFICIENT_TYPE Coefficient;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An alias for easily naming the coefficient traits.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+typedef Coefficient_traits_template<Coefficient> Coefficient_traits;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Interval.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Boundary;
+class LBoundary;
+class UBoundary;
+class Interval;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Bounding_Box.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Bounding_Box;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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/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/Congruence.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence;
+
+}
+
+// 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/Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Row_Impl_Handler;
+class Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Linear_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Matrix;
+
+} // 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_Expression.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_Expression;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Linear_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Linear_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Saturation_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Saturation_Matrix;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Constraint_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Constraint_System;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Generator_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Generator_System;
+
+} // 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/Congruence_System.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Congruence_System;
+
+}
+
+// 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/LP_Problem.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Possible outcomes of the LP_Problem solver.
+/*! \ingroup PPL_CXX_interface */
+enum LP_Problem_Status {
+ //! The problem is unfeasible.
+ UNFEASIBLE_LP_PROBLEM,
+ //! The problem is unbounded.
+ UNBOUNDED_LP_PROBLEM,
+ //! The problem has an optimal solution.
+ OPTIMIZED_LP_PROBLEM
+};
+
+class LP_Problem;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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/BHRZ03_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class BHRZ03_Certificate;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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/Grid_Certificate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid_Certificate;
+
+}
+
+// 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/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/Grid.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+class Grid;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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/DB_Row.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename BT>
+class DB_Row_Impl_Handler;
+
+template <typename BT>
+class DB_Row;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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/BD_Shape.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+class BD_Shape;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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 28
+#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 Memory Size Inspection Functions
+//@{
+
+//! Returns the total size in bytes of the memory occupied by \p x.
+/*! \relates GMP_Integer */
+memory_size_type total_memory_in_bytes(const GMP_Integer& x);
+
+//! Returns the size in bytes of the memory managed by \p x.
+/*! \relates GMP_Integer */
+memory_size_type external_memory_in_bytes(const GMP_Integer& x);
+
+//@} // Memory Size Inspection 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 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,
+ const GMP_Integer& y, const GMP_Integer& z,
+ GMP_Integer& s, GMP_Integer& t);
+
+//! 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);
+
+/*! \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
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+void swap(Parma_Polyhedra_Library::GMP_Integer& x,
+ Parma_Polyhedra_Library::GMP_Integer& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/GMP_Integer.inlines.hh line 1
+/* GMP_Integer class implementation: inline functions.
+*/
+
+
+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
+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
+gcdext_assign(GMP_Integer& x,
+ const GMP_Integer& y, const GMP_Integer& z,
+ GMP_Integer& s, GMP_Integer& t) {
+ 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
+exact_div_assign(GMP_Integer& x, const GMP_Integer& y, const GMP_Integer& z) {
+ 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;
+}
+
+inline memory_size_type
+external_memory_in_bytes(const GMP_Integer& x) {
+ return x.get_mpz_t()[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+total_memory_in_bytes(const GMP_Integer& x) {
+ return sizeof(x) + external_memory_in_bytes(x);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::GMP_Integer */
+inline void
+std::swap(Parma_Polyhedra_Library::GMP_Integer& x,
+ Parma_Polyhedra_Library::GMP_Integer& y) {
+ mpz_swap(x.get_mpz_t(), y.get_mpz_t());
+}
+
+// Automatically generated from PPL source file ../src/GMP_Integer.defs.hh line 135
+
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 1
+/* Coefficient class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 27
+#include <iosfwd>
+
+#if defined(CHECKED_INTEGERS) || defined(NATIVE_INTEGERS)
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 32
+#endif
+
+#ifdef GMP_INTEGERS
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 36
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+Coefficient_traits::const_reference Coefficient_zero();
+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 {
+
+inline Coefficient_traits::const_reference
+Coefficient_zero() {
+ static Coefficient z(0);
+ return z;
+}
+
+inline Coefficient_traits::const_reference
+Coefficient_one() {
+ static Coefficient o(1);
+ return o;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Coefficient.defs.hh line 46
+
+// Automatically generated from PPL source file ../src/globals.defs.hh line 1
+/* Declarations of global objects.
+*/
+
+
+// Automatically generated from PPL source file ../src/globals.defs.hh line 28
+#include <exception>
+
+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
+//! A node of the list of available coefficients.
+/*! \ingroup PPL_CXX_interface */
+// FIXME: rewrite the comment.
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Coefficient_free_list_element {
+private:
+ Coefficient i;
+ Coefficient_free_list_element* p;
+
+public:
+ Coefficient_free_list_element()
+ : i() {
+ }
+
+ Coefficient& integer() {
+ return i;
+ }
+
+ Coefficient_free_list_element*& next() {
+ return p;
+ }
+};
+
+extern Coefficient_free_list_element* Coefficient_free_list_first;
+
+inline Coefficient&
+get_tmp_Coefficient() {
+ Coefficient* p;
+ if (Coefficient_free_list_first != 0) {
+ p = &Coefficient_free_list_first->integer();
+ Coefficient_free_list_first = Coefficient_free_list_first->next();
+ }
+ else
+ p = reinterpret_cast<Coefficient*>(new Coefficient_free_list_element());
+ return *p;
+}
+
+inline void
+release_tmp_Coefficient(Coefficient& i) {
+ Coefficient_free_list_element& e
+ = reinterpret_cast<Coefficient_free_list_element&>(i);
+ e.next() = Coefficient_free_list_first;
+ Coefficient_free_list_first = &e;
+}
+
+class Temp_Coefficient_Holder {
+private:
+ Coefficient& hold;
+
+public:
+ Temp_Coefficient_Holder(Coefficient& i)
+ : hold(i) {
+ }
+ ~Temp_Coefficient_Holder() {
+ release_tmp_Coefficient(hold);
+ }
+};
+
+#if 1
+#define TEMP_INTEGER(id) \
+Coefficient& id = get_tmp_Coefficient(); \
+Temp_Coefficient_Holder temp_Coefficient_holder_ ## id = (id)
+#else
+#define TEMP_INTEGER(id) static Coefficient id
+#endif
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+dimension_type
+compute_capacity(dimension_type requested_size,
+ dimension_type maximum_size);
+
+//! 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 differentiate the C_Polyhedron and NNC_Polyhedron
+ constructors that build a polyhedron out of a bounding box.
+*/
+struct From_Bounding_Box {
+};
+
+//! A tag class.
+/*! \ingroup PPL_CXX_interface
+ Tag class to make the Grid covering box constructor unique.
+*/
+struct From_Covering_Box {
+};
+
+#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 nx and \p ny, respectively.
+
+ \note
+ \p x and \p nx may be the same object and likewise for
+ \p y and \p ny. Any other aliasing results in undefined behavior.
+*/
+#endif
+void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& nx, Coefficient& ny);
+
+#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);
+
+// 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)
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#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;
+#else
+#define PPL_OUTPUT_DECLARATIONS \
+ void ascii_dump() const; \
+ void ascii_dump(std::ostream& s) const; \
+ void print() const;
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+#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 namespace IO_Operators; \
+ 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 namespace IO_Operators; \
+ 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; \
+ }
+
+} // namespace Parma_Polyhedra_Library
+
+// 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 27
+#include <limits>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+not_a_dimension() {
+ return std::numeric_limits<dimension_type>::max();
+}
+
+inline
+Throwable::~Throwable() {
+}
+
+inline void
+maybe_abandon() {
+ if (const Throwable* 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;
+}
+
+inline void
+normalize2(Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y,
+ Coefficient& nx, Coefficient& ny) {
+ TEMP_INTEGER(gcd);
+ gcd_assign(gcd, x, y);
+ exact_div_assign(nx, x, gcd);
+ exact_div_assign(ny, y, gcd);
+}
+
+template <typename T>
+inline T
+low_bits_mask(const unsigned n) {
+ assert(n < unsigned(std::numeric_limits<T>::digits));
+ return n == 0 ? 0 : ~(~(T(0u)) << n);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/globals.defs.hh line 289
+
+// 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/Interval.defs.hh line 29
+#include <gmpxx.h>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+typedef Checked_Number<mpq_class, Extended_Number_Policy> ERational;
+
+}
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is less than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator<(const Boundary& x, const Boundary& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Returns <CODE>true</CODE> if and only if \p x is greater than \p y.
+/*! \relates Boundary */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator>(const Boundary& x, const Boundary& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An extended rational bound of an interval.
+/*! \ingroup PPL_CXX_interface
+ An object of class Boundary represents either an upper or a lower
+ bound of an interval over the set of extended rational numbers.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Boundary {
+protected:
+ //! Kinds of bounds.
+ enum Flag {
+ //! An open upper bound.
+ NEG = -1,
+ //! A closed (lower or upper) bound.
+ ZERO = 0,
+ //! An open lower bound.
+ POS = 1
+ };
+
+ //! The extended rational value of the bound.
+ ERational value;
+ //! The kind of the bound.
+ Flag flag;
+
+ //! Builds a bound of kind \p f and having value \p v.
+ Boundary(const ERational& v, Flag f);
+
+ friend bool
+ Parma_Polyhedra_Library::operator<(const Boundary& x, const Boundary& y);
+ friend bool
+ Parma_Polyhedra_Library::operator>(const Boundary& x, const Boundary& y);
+
+public:
+ //! Returns <CODE>true</CODE> if and only if \p *this is a closed bound.
+ bool is_closed() const;
+
+ //! Returns a const reference to the value of the bound.
+ const ERational& bound() const;
+
+ //! Returns a reference to the value of the bound.
+ ERational& bound();
+};
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The lower bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::LBoundary : public Boundary {
+public:
+ //! Kinds of lower bounds.
+ enum Open_Closed {
+ //! An open lower bound.
+ OPEN = Boundary::POS,
+ //! A closed lower bound.
+ CLOSED = Boundary::ZERO
+ };
+
+ //! Builds a lower bound of kind \p f and having value \p v.
+ LBoundary(const ERational& v, Open_Closed f);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The upper bound of an extended rational interval.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::UBoundary : public Boundary {
+public:
+ //! Kinds of upper bounds.
+ enum Open_Closed {
+ //! An open upper bound.
+ OPEN = Boundary::NEG,
+ //! A closed upper bound.
+ CLOSED = Boundary::ZERO
+ };
+
+ //! Builds an upper bound of kind \p f and having value \p v.
+ UBoundary(const ERational& v, Open_Closed f);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A interval over the set of rational numbers.
+/*! \ingroup PPL_CXX_interface
+ An object of class Interval represents a closed/half-closed/open
+ interval over the set of rational numbers \f$\Qset\f$.
+
+ Note that, even though the implementation is capable to represent
+ any interval on the set of <EM>extended</EM> rational numbers,
+ the available public methods only allows for the construction
+ and manipulation of intervals over \f$\Qset\f$.
+ Namely, it is not possible to create a non-empty interval having
+ a <EM>closed</EM> bound whose value is \f$-\infty\f$ or \f$+\infty\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Interval {
+public:
+ //! Constructs the universe interval \f$(-\infty, +\infty) = \Qset\f$.
+ Interval();
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+ bool is_empty() const;
+
+ //! Returns a const reference to the interval's lower bound.
+ const LBoundary& lower_bound() const;
+
+ //! Returns a reference to the interval's lower bound.
+ LBoundary& lower_bound();
+
+ //! Returns a const reference to the interval's upper bound.
+ const UBoundary& upper_bound() const;
+
+ //! Returns a reference to the interval's upper bound.
+ UBoundary& upper_bound();
+
+ /*! \brief
+ Raises the interval's lower bound, if \p new_lower is higher
+ than the current one.
+ */
+ void raise_lower_bound(LBoundary new_lower);
+
+ /*! \brief
+ Lowers the interval's upper bound, if \p new_upper is lower
+ than the current one.
+ */
+ void lower_upper_bound(UBoundary new_upper);
+
+ //! Turns \p *this into the empty interval.
+ void set_empty();
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+private:
+ //! The interval's lower bound.
+ LBoundary lower;
+
+ //! The interval's upper bound.
+ UBoundary upper;
+};
+
+// Automatically generated from PPL source file ../src/Interval.inlines.hh line 1
+/* Inline functions for the Interval class and its constituents.
+*/
+
+
+#include <cassert>
+// Automatically generated from PPL source file ../src/Interval.inlines.hh line 29
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Boundary::Boundary(const ERational& v, Flag f)
+ : value(v), flag(f) {
+}
+
+inline bool
+Boundary::is_closed() const {
+ return flag == ZERO;
+}
+
+inline const ERational&
+Boundary::bound() const {
+ return value;
+}
+
+inline ERational&
+Boundary::bound() {
+ return value;
+}
+
+inline
+LBoundary::LBoundary(const ERational& v, Open_Closed f)
+ : Boundary(v, f == CLOSED ? ZERO : POS) {
+}
+
+inline
+UBoundary::UBoundary(const ERational& v, Open_Closed f)
+ : Boundary(v, f == CLOSED ? ZERO : NEG) {
+}
+
+/*! \relates Boundary */
+inline bool
+operator<(const Boundary& x, const Boundary& y) {
+ return x.value < y.value ||
+ (x.value == y.value && x.flag < y.flag);
+}
+
+/*! \relates Boundary */
+inline bool
+operator>(const Boundary& x, const Boundary& y) {
+ return y < x;
+}
+
+inline
+Interval::Interval()
+ : lower(ERational(MINUS_INFINITY), LBoundary::OPEN),
+ upper(ERational(PLUS_INFINITY), UBoundary::OPEN) {
+}
+
+inline bool
+Interval::is_empty() const {
+ return lower > upper;
+}
+
+inline const LBoundary&
+Interval::lower_bound() const {
+ return lower;
+}
+
+inline LBoundary&
+Interval::lower_bound() {
+ return lower;
+}
+
+inline const UBoundary&
+Interval::upper_bound() const {
+ return upper;
+}
+
+inline UBoundary&
+Interval::upper_bound() {
+ return upper;
+}
+
+inline void
+Interval::raise_lower_bound(LBoundary new_lower) {
+ if (new_lower > lower)
+ lower = new_lower;
+}
+
+inline void
+Interval::lower_upper_bound(UBoundary new_upper) {
+ if (new_upper < upper)
+ upper = new_upper;
+}
+
+inline void
+Interval::set_empty() {
+ lower = LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN);
+ upper = UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN);
+ assert(is_empty());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Interval.defs.hh line 203
+
+// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 1
+/* Bounding_Box class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 1
+/* Constraint_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 1
+/* Linear_System class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Matrix.defs.hh line 1
+/* Matrix class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Row.defs.hh line 1
+/* Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Row.defs.hh line 29
+#include <vector>
+#include <limits>
+
+#ifndef EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*!
+ \brief
+ Enables extra debugging information for class Row.
+
+ \ingroup PPL_CXX_interface
+ When <CODE>EXTRA_ROW_DEBUG</CODE> evaluates to <CODE>true</CODE>,
+ each instance of the class Row carries its own capacity; this enables
+ extra consistency checks to be performed.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The handler of the actual 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler {
+public:
+ //! Default constructor.
+ Row_Impl_Handler();
+
+ //! Destructor.
+ ~Row_Impl_Handler();
+
+ class Impl;
+
+ //! A pointer to the actual implementation.
+ Impl* impl;
+
+#if EXTRA_ROW_DEBUG
+ //! The capacity of \p impl (only available during debugging).
+ dimension_type capacity_;
+#endif // EXTRA_ROW_DEBUG
+
+private:
+ //! Private and unimplemented: copy construction is not allowed.
+ Row_Impl_Handler(const Row_Impl_Handler&);
+
+ //! Private and unimplemented: copy assignment is not allowed.
+ Row_Impl_Handler& operator=(const Row_Impl_Handler&);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A finite sequence of coefficients.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row : private Row_Impl_Handler {
+public:
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Wrapper class to represent a set of flags with bits in a native
+ unsigned integral type.
+ \ingroup PPL_CXX_interface
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ class Flags {
+ public:
+ //! Constructs an object with all the flags unset.
+ Flags();
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+ bool operator==(const Flags& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are different.
+ */
+ bool operator!=(const Flags& y) const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Flags representation from \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by
+ \ref Parma_Polyhedra_Library::Row::Flags::ascii_dump.
+ */
+ bool ascii_load(std::istream& s);
+
+ protected:
+ //! A native integral type holding the bits that encode the flags.
+ typedef unsigned int base_type;
+
+ //! Index of the first bit derived classes can use.
+ static const unsigned first_free_bit = 0;
+
+ //! Total number of bits that can be stored.
+ static const unsigned num_bits = std::numeric_limits<base_type>::digits;
+
+ //! Constructs an object with flags set as in \p n.
+ explicit Flags(base_type n);
+
+ //! Returns the integer encoding \p *this.
+ base_type get_bits() const;
+
+ //! Sets the bits in \p mask.
+ void set_bits(base_type mask);
+
+ //! Resets the bits in \p mask.
+ void reset_bits(base_type mask);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if all the bits
+ in \p mask are set.
+ */
+ bool test_bits(base_type mask) const;
+
+ private:
+ //! The integer encoding \p *this.
+ base_type bits;
+
+ friend class Row;
+ };
+
+ //! Pre-constructs a row: construction must be completed by construct().
+ Row();
+
+ //! \name Post-constructors
+ //@{
+ //! Constructs properly a default-constructed element.
+ /*!
+ Builds a row with size and capacity \p sz and flags \p f.
+ */
+ void construct(dimension_type sz, Flags f);
+
+ //! Constructs properly a default-constructed element.
+ /*!
+ \param sz
+ The size of the row that will be constructed;
+
+ \param capacity
+ The capacity of the row that will be constructed;
+
+ \param f
+ Flags for 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.
+ The row flags are set to \p f.
+ */
+ void construct(dimension_type sz, dimension_type capacity, Flags f);
+ //@} // Post-constructors
+
+ //! Tight constructor: resizing may require reallocation.
+ /*!
+ Constructs a row with size and capacity \p sz, and flags \p f.
+ */
+ Row(dimension_type sz, Flags f);
+
+ //! 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;
+
+ \param f
+ Flags for 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.
+ The row flags are set to \p f.
+ */
+ Row(dimension_type sz, dimension_type capacity, Flags f);
+
+ //! Ordinary copy constructor.
+ Row(const Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to
+ the size of \p y.
+ */
+ Row(const 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.
+ */
+ Row(const Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~Row();
+
+ //! Assignment operator.
+ Row& operator=(const Row& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Row& y);
+
+ //! Assigns the implementation of \p y to \p *this.
+ /*!
+ To be used with extra care, since it may easily cause memory leaks
+ or undefined behavior.
+ */
+ void assign(Row& y);
+
+ /*! \brief
+ Allocates memory for a default constructed Row object, setting
+ flags to \p f and 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 Row object is zero.
+ */
+ void allocate(dimension_type capacity, Flags f);
+
+ //! 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 a const reference to the flags of \p *this.
+ const Flags& flags() const;
+
+ //! Returns a non-const reference to the flags of \p *this.
+ Flags& flags();
+
+ //! Returns the size() of the largest possible 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();
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Row representation at \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by \ref ascii_dump.
+ */
+ 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(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+ //! Exception-safe copy construction mechanism for coefficients.
+ void copy_construct_coefficients(const Row& y);
+
+#if EXTRA_ROW_DEBUG
+ //! Returns the capacity of the row (only available during debugging).
+ dimension_type capacity() const;
+#endif // EXTRA_ROW_DEBUG
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Row */
+bool operator==(const Row& x, const Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Row */
+bool operator!=(const Row& x, const Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Row& x,
+ Parma_Polyhedra_Library::Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Row>::iterator y);
+
+} // namespace std
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The actual implementation of a Row object.
+/*! \ingroup PPL_CXX_interface
+ The class Row_Impl_Handler::Impl provides the implementation of Row
+ objects and, in particular, of the corresponding memory allocation
+ functions.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Row_Impl_Handler::Impl {
+public:
+ //! \name Custom allocator and deallocator
+ //@{
+
+ /*! \brief
+ Allocates a chunk of memory able to contain \p capacity Coefficient 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);
+ //@} // Custom allocator and deallocator
+
+ //! Constructor.
+ Impl(Row::Flags f);
+
+ //! 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);
+
+ //! Returns the size() of the largest possible Impl.
+ static dimension_type max_size();
+
+ //! \name Flags accessors
+ //@{
+ //! Returns a const reference to the flags of \p *this.
+ const Row::Flags& flags() const;
+
+ //! Returns a non-const reference to the flags of \p *this.
+ Row::Flags& flags();
+ //@} // Flags accessors
+
+ //! \name Size accessors
+ //@{
+ //! Returns the actual size of \p this.
+ dimension_type size() const;
+
+ //! Sets to \p new_size the actual size of \p *this.
+ void set_size(dimension_type new_size);
+
+ //! Increment the size of \p *this by 1.
+ void bump_size();
+ //@} // Size accessors
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the element of \p *this indexed by \p k.
+ Coefficient& operator[](dimension_type k);
+
+ //! Returns a constant reference to the element of \p *this indexed by \p k.
+ Coefficient_traits::const_reference operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ /*! \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:
+ //! The number of coefficients in the row.
+ dimension_type size_;
+
+ //! The flags of this row.
+ Row::Flags flags_;
+
+ //! The vector of coefficients.
+ Coefficient vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ 1
+#endif
+ ];
+
+ //! Private and unimplemented: default construction is not allowed.
+ Impl();
+
+ //! Private and unimplemented: copy construction is not allowed.
+ Impl(const Impl& y);
+
+ //! Private and unimplemented: assignment is not allowed.
+ Impl& operator=(const Impl&);
+};
+
+// Automatically generated from PPL source file ../src/Row.inlines.hh line 1
+/* Row class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Row.inlines.hh line 27
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Row::Flags::Flags()
+ : bits(0) {
+}
+
+inline
+Row::Flags::Flags(base_type n)
+ : bits(n) {
+}
+
+inline Row::Flags::base_type
+Row::Flags::get_bits() const {
+ return bits;
+}
+
+inline void
+Row::Flags::set_bits(const base_type mask) {
+ bits |= mask;
+}
+
+inline void
+Row::Flags::reset_bits(const base_type mask) {
+ bits &= ~mask;
+}
+
+inline bool
+Row::Flags::test_bits(const base_type mask) const {
+ return (bits & mask) == mask;
+}
+
+inline bool
+Row::Flags::operator==(const Flags& y) const {
+ base_type mask = low_bits_mask<base_type>(first_free_bit);
+ return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Row::Flags::operator!=(const Flags& y) const {
+ return !operator==(y);
+}
+
+inline void*
+Row_Impl_Handler::Impl::operator new(const size_t fixed_size,
+ const dimension_type capacity) {
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ return ::operator new(fixed_size + capacity*sizeof(Coefficient));
+#else
+ assert(capacity >= 1);
+ return ::operator new(fixed_size + (capacity-1)*sizeof(Coefficient));
+#endif
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p) {
+ ::operator delete(p);
+}
+
+inline void
+Row_Impl_Handler::Impl::operator delete(void* p, dimension_type) {
+ ::operator delete(p);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::max_size() {
+ return size_t(-1)/sizeof(Coefficient);
+}
+
+inline dimension_type
+Row_Impl_Handler::Impl::size() const {
+ return size_;
+}
+
+inline void
+Row_Impl_Handler::Impl::set_size(const dimension_type new_size) {
+ size_ = new_size;
+}
+
+inline void
+Row_Impl_Handler::Impl::bump_size() {
+ ++size_;
+}
+
+inline
+Row_Impl_Handler::Impl::Impl(const Row::Flags f)
+ : size_(0), flags_(f) {
+}
+
+inline
+Row_Impl_Handler::Impl::~Impl() {
+ shrink(0);
+}
+
+inline const Row::Flags&
+Row_Impl_Handler::Impl::flags() const {
+ return flags_;
+}
+
+inline Row::Flags&
+Row_Impl_Handler::Impl::flags() {
+ return flags_;
+}
+
+inline Coefficient&
+Row_Impl_Handler::Impl::operator[](const dimension_type k) {
+ assert(k < size());
+ return vec_[k];
+}
+
+inline Coefficient_traits::const_reference
+Row_Impl_Handler::Impl::operator[](const dimension_type k) const {
+ assert(k < size());
+ return vec_[k];
+}
+
+inline memory_size_type
+Row_Impl_Handler::Impl::total_memory_in_bytes(dimension_type capacity) const {
+ return
+ sizeof(*this)
+ + capacity*sizeof(Coefficient)
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ - 1*sizeof(Coefficient)
+#endif
+ + external_memory_in_bytes();
+}
+
+inline memory_size_type
+Row_Impl_Handler::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_);
+}
+
+inline dimension_type
+Row::max_size() {
+ return Impl::max_size();
+}
+
+inline dimension_type
+Row::size() const {
+ return impl->size();
+}
+
+inline const Row::Flags&
+Row::flags() const {
+ return impl->flags();
+}
+
+inline Row::Flags&
+Row::flags() {
+ return impl->flags();
+}
+
+#if EXTRA_ROW_DEBUG
+inline dimension_type
+Row::capacity() const {
+ return capacity_;
+}
+#endif
+
+inline
+Row_Impl_Handler::Row_Impl_Handler()
+ : impl(0) {
+#if EXTRA_ROW_DEBUG
+ capacity_ = 0;
+#endif
+}
+
+inline
+Row_Impl_Handler::~Row_Impl_Handler() {
+ delete impl;
+}
+
+inline
+Row::Row()
+ : Row_Impl_Handler() {
+}
+
+inline void
+Row::allocate(
+#if CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ const
+#endif
+ dimension_type capacity,
+ const Flags f) {
+ assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ if (capacity == 0)
+ ++capacity;
+#endif
+ assert(impl == 0);
+ impl = new (capacity) Impl(f);
+#if EXTRA_ROW_DEBUG
+ assert(capacity_ == 0);
+ capacity_ = capacity;
+#endif
+}
+
+inline void
+Row::expand_within_capacity(const dimension_type new_size) {
+ assert(impl);
+#if EXTRA_ROW_DEBUG
+ assert(new_size <= capacity_);
+#endif
+ impl->expand_within_capacity(new_size);
+}
+
+inline void
+Row::copy_construct_coefficients(const Row& y) {
+ assert(impl && y.impl);
+#if EXTRA_ROW_DEBUG
+ assert(y.size() <= capacity_);
+#endif
+ impl->copy_construct_coefficients(*(y.impl));
+}
+
+inline void
+Row::construct(const dimension_type sz,
+ const dimension_type capacity,
+ const Flags f) {
+ assert(sz <= capacity && capacity <= max_size());
+ allocate(capacity, f);
+ expand_within_capacity(sz);
+}
+
+inline void
+Row::construct(const dimension_type sz, const Flags f) {
+ construct(sz, sz, f);
+}
+
+inline
+Row::Row(const dimension_type sz,
+ const dimension_type capacity,
+ const Flags f)
+ : Row_Impl_Handler() {
+ construct(sz, capacity, f);
+}
+
+inline
+Row::Row(const dimension_type sz, const Flags f)
+ : Row_Impl_Handler() {
+ construct(sz, f);
+}
+
+inline
+Row::Row(const Row& y)
+ : Row_Impl_Handler() {
+ if (y.impl) {
+ allocate(compute_capacity(y.size(), max_size()), y.flags());
+ copy_construct_coefficients(y);
+ }
+}
+
+inline
+Row::Row(const Row& y,
+ const dimension_type capacity)
+ : Row_Impl_Handler() {
+ assert(y.impl);
+ assert(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity, y.flags());
+ copy_construct_coefficients(y);
+}
+
+inline
+Row::Row(const Row& y,
+ const dimension_type sz,
+ const dimension_type capacity)
+ : Row_Impl_Handler() {
+ assert(y.impl);
+ assert(y.size() <= sz && sz <= capacity && capacity <= max_size());
+ allocate(capacity, y.flags());
+ copy_construct_coefficients(y);
+ expand_within_capacity(sz);
+}
+
+inline
+Row::~Row() {
+}
+
+inline void
+Row::shrink(const dimension_type new_size) {
+ assert(impl);
+ impl->shrink(new_size);
+}
+
+inline void
+Row::swap(Row& y) {
+ std::swap(impl, y.impl);
+#if EXTRA_ROW_DEBUG
+ std::swap(capacity_, y.capacity_);
+#endif
+}
+
+inline void
+Row::assign(Row& y) {
+ impl = y.impl;
+#if EXTRA_ROW_DEBUG
+ capacity_ = y.capacity_;
+#endif
+}
+
+inline Row&
+Row::operator=(const Row& y) {
+ // Copy-construct `tmp' from `y'.
+ Row tmp(y);
+ // Swap the implementation of `*this' with the one of `tmp'.
+ swap(tmp);
+ // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+ return *this;
+}
+
+inline Coefficient&
+Row::operator[](const dimension_type k) {
+ assert(impl);
+ return (*impl)[k];
+}
+
+inline Coefficient_traits::const_reference
+Row::operator[](const dimension_type k) const {
+ assert(impl);
+ return (*impl)[k];
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes(dimension_type capacity) const {
+ return impl->total_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes(dimension_type capacity) const {
+ return sizeof(*this) + external_memory_in_bytes(capacity);
+}
+
+inline memory_size_type
+Row::external_memory_in_bytes() const {
+#if EXTRA_ROW_DEBUG
+ return impl->total_memory_in_bytes(capacity_);
+#else
+ return impl->total_memory_in_bytes();
+#endif
+}
+
+inline memory_size_type
+Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+/*! \relates Row */
+inline bool
+operator!=(const Row& x, const Row& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+swap(Parma_Polyhedra_Library::Row& x, Parma_Polyhedra_Library::Row& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Row.defs.hh line 495
+
+// Automatically generated from PPL source file ../src/Matrix.defs.hh line 31
+#include <vector>
+#include <cstddef>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A 2-dimensional matrix of coefficients.
+/*! \ingroup PPL_CXX_interface
+ A Matrix object is a sequence of Row objects and is characterized
+ by the matrix dimensions (the number of rows and columns).
+ All the rows in a matrix, besides having the same size (corresponding
+ to the number of columns of the matrix), are also bound to have the
+ same capacity.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Matrix {
+public:
+ //! Returns the maximum number of rows of a Matrix.
+ static dimension_type max_num_rows();
+
+ //! Returns the maximum number of columns of a Matrix.
+ static dimension_type max_num_columns();
+
+ //! Builds an empty matrix.
+ /*!
+ Rows' size and capacity are initialized to \f$0\f$.
+ */
+ Matrix();
+
+ //! Builds a zero matrix with specified dimensions and flags.
+ /*!
+ \param n_rows
+ The number of rows of the matrix that will be created;
+
+ \param n_columns
+ The number of columns of the matrix that will be created.
+
+ \param row_flags
+ The flags used to build the rows of the matrix;
+ by default, the rows will have all flags unset.
+ */
+ Matrix(dimension_type n_rows, dimension_type n_columns,
+ Row::Flags row_flags = Row::Flags());
+
+ //! Copy-constructor.
+ Matrix(const Matrix& y);
+
+ //! Destructor.
+ ~Matrix();
+
+ //! Assignment operator.
+ Matrix& operator=(const Matrix& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! An iterator over a matrix.
+ /*! \ingroup PPL_CXX_interface
+ A const_iterator is used to provide read-only access
+ to each row contained in a Matrix object.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ class const_iterator {
+ private:
+ typedef std::vector<Row>::const_iterator Iter;
+ //! The const iterator on the rows' vector \p rows.
+ Iter i;
+
+ public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef std::iterator_traits<Iter>::value_type value_type;
+ typedef std::iterator_traits<Iter>::difference_type difference_type;
+ typedef std::iterator_traits<Iter>::pointer pointer;
+ typedef 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;
+
+ // FIXME: the following section must become private.
+protected:
+ //! Contains the rows of the matrix.
+ std::vector<Row> rows;
+
+ //! Size of the initialized part of each row.
+ dimension_type row_size;
+
+ //! Capacity allocated for each row.
+ dimension_type row_capacity;
+
+public:
+ //! Swaps \p *this with \p y.
+ void swap(Matrix& y);
+
+ //! Adds to the matrix \p n rows of zeroes with flags set to \p row_flags.
+ /*!
+ \param n
+ The number of rows to be added: must be strictly positive.
+
+ \param row_flags
+ Flags for the newly added rows.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times c\f$ matrix \f$M \choose 0\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_zero_rows(dimension_type n, Row::Flags row_flags);
+
+ //! 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$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_zero_columns(dimension_type n);
+
+ //! 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.
+
+ \param row_flags
+ Flags for the newly added rows.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+n) \times (c+m)\f$ matrix
+ \f$\bigl({M \atop 0}{0 \atop 0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_zero_rows_and_columns(dimension_type n, dimension_type m,
+ Row::Flags row_flags);
+
+ //! Adds a copy of the row \p y to the matrix.
+ /*!
+ \param y
+ The row to be copied: it must have the same number of columns as
+ the matrix.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+1) \times c\f$ matrix
+ \f$\bigl({M \atop 0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_row(const Row& y);
+
+ //! 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.
+
+ Turns the \f$r \times c\f$ matrix \f$M\f$ into
+ the \f$(r+1) \times c\f$ matrix
+ \f$\bigl({M \atop 0}\bigr)\f$.
+ The matrix is expanded avoiding reallocation whenever possible.
+ */
+ void add_recycled_row(Row& y);
+
+ //! Makes the matrix shrink by removing its \p n trailing columns.
+ void remove_trailing_columns(dimension_type n);
+
+ //! Resizes the matrix without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized matrix;
+
+ \param new_n_columns
+ The number of columns of the resized matrix.
+
+ \param row_flags
+ The flags of the rows eventually added to the matrix.
+
+ The matrix is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original matrix is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns,
+ Row::Flags row_flags);
+
+ //! Swaps the columns having indexes \p i and \p j.
+ void swap_columns(dimension_type i, dimension_type j);
+
+ //! Permutes the columns of the matrix.
+ /*
+ \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 non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the matrix has 6
+ 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.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+
+ //! \name Accessors
+ //@{
+
+ //! Returns the number of columns of the matrix (i.e., the size of the rows).
+ dimension_type num_columns() const;
+
+ //! Returns the number of rows in the matrix.
+ dimension_type num_rows() const;
+ //@} // Accessors
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the \p k-th row of the matrix.
+ Row& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the matrix.
+ const Row& operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ //! Clears the matrix deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+ 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
+ Erases from the matrix all the rows but those having
+ an index less than \p first_to_erase.
+ */
+ void erase_to_end(dimension_type first_to_erase);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ //! Specializes <CODE>std::swap</CODE>.
+ /*! \relates Parma_Polyhedra_Library::Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Matrix& x,
+ Parma_Polyhedra_Library::Matrix& 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 Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Matrix& x, const Matrix& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Matrix& x, const Matrix& y);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Matrix.inlines.hh line 1
+/* Matrix class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Matrix.inlines.hh line 27
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Matrix::max_num_rows() {
+ return std::vector<Row>().max_size();
+}
+
+inline dimension_type
+Matrix::max_num_columns() {
+ return Row::max_size();
+}
+
+inline memory_size_type
+Matrix::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline
+Matrix::const_iterator::const_iterator()
+ : i(Iter()) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const Iter& b)
+ : i(b) {
+}
+
+inline
+Matrix::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i) {
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ return *this;
+}
+
+inline Matrix::const_iterator::reference
+Matrix::const_iterator::operator*() const {
+ return *i;
+}
+
+inline Matrix::const_iterator::pointer
+Matrix::const_iterator::operator->() const {
+ return &*i;
+}
+
+inline Matrix::const_iterator&
+Matrix::const_iterator::operator++() {
+ ++i;
+ return *this;
+}
+
+inline Matrix::const_iterator
+Matrix::const_iterator::operator++(int) {
+ return const_iterator(i++);
+}
+
+inline bool
+Matrix::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Matrix::const_iterator::operator!=(const const_iterator& y) const {
+ return !operator==(y);
+}
+
+inline Matrix::const_iterator
+Matrix::begin() const {
+ return const_iterator(rows.begin());
+}
+
+inline Matrix::const_iterator
+Matrix::end() const {
+ return const_iterator(rows.end());
+}
+
+inline void
+Matrix::swap(Matrix& y) {
+ std::swap(rows, y.rows);
+ std::swap(row_size, y.row_size);
+ std::swap(row_capacity, y.row_capacity);
+}
+
+inline
+Matrix::Matrix()
+ : rows(),
+ row_size(0),
+ row_capacity(0) {
+}
+
+inline
+Matrix::Matrix(const Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size),
+ row_capacity(compute_capacity(y.row_size, max_num_columns())) {
+}
+
+inline
+Matrix::~Matrix() {
+}
+
+inline Matrix&
+Matrix::operator=(const 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;
+}
+
+inline void
+Matrix::add_row(const Row& y) {
+ Row new_row(y, row_capacity);
+ add_recycled_row(new_row);
+}
+
+inline Row&
+Matrix::operator[](const dimension_type k) {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline const Row&
+Matrix::operator[](const dimension_type k) const {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline dimension_type
+Matrix::num_rows() const {
+ return rows.size();
+}
+
+inline dimension_type
+Matrix::num_columns() const {
+ return row_size;
+}
+
+/*! \relates Matrix */
+inline bool
+operator!=(const Matrix& x, const Matrix& y) {
+ return !(x == y);
+}
+
+inline void
+Matrix::erase_to_end(const dimension_type first_to_erase) {
+ assert(first_to_erase <= rows.size());
+ if (first_to_erase < rows.size())
+ rows.erase(rows.begin() + first_to_erase, rows.end());
+}
+
+inline void
+Matrix::clear() {
+ // Clear `rows' and minimize its capacity.
+ std::vector<Row>().swap(rows);
+ row_size = 0;
+ row_capacity = 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Matrix& x,
+ Parma_Polyhedra_Library::Matrix& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Matrix.defs.hh line 355
+
+// Automatically generated from PPL source file ../src/Topology.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Kinds of polyhedra domains.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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/Linear_Row.defs.hh line 1
+/* Linear_Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 33
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The base class for linear expressions, constraints and generators.
+/*! \ingroup PPL_CXX_interface
+ The class Linear_Row allows us to build objects of the form
+ \f$[b, a_0, \ldots, a_{d-1}]_{(t, k)}\f$,
+ i.e., a finite sequence of coefficients subscripted by a pair of flags,
+ which are both stored in a Linear_Row::Flags object.
+ The flag \f$t \in \{ \mathrm{c}, \mathrm{nnc} \}\f$ represents
+ the <EM>topology</EM> and
+ the flag \f$k \in \{\mathord{=}, \mathord{\geq} \}\f$ represents
+ the <EM>kind</EM> of the Linear_Row object.
+ Note that, even though all the four possible combinations of topology
+ and kind values will result in a legal Linear_Row::Flags object, some
+ of these pose additional constraints on the values of the Linear_Row's
+ coefficients.
+
+ When \f$t = c\f$, we have the following cases
+ (\f$d\f$ is the dimension of the vector space):
+ - \f$[b, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+ represents the equality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+ represents the non-strict inequality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$
+ represents the line of direction
+ \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$
+ represents the ray of direction
+ \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}]_{(c,\geq)}\f$, with \f$b > 0\f$,
+ represents the point
+ \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+ When \f$t = \mathrm{nnc}\f$, the last coefficient of the Linear_Row is
+ associated to the slack variable \f$\epsilon\f$, so that we have the
+ following cases (\f$d\f$ is again the dimension of the vector space,
+ but this time we have \f$d+2\f$ coefficients):
+ - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+ represents the equality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b = 0\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+ represents the non-strict inequality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b \geq 0\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+ with \f$e < 0\f$, represents the strict inequality constraint
+ \f$\sum_{i=0}^{d-1} a_i x_i + b > 0\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},=)}\f$
+ represents the line of direction
+ \f$\vect{l} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[0, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$
+ represents the ray of direction
+ \f$\vect{r} = (a_0, \ldots, a_{d-1})^\transpose\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, e]_{(\mathrm{nnc},\geq)}\f$,
+ with \f$b > 0\f$ and \f$e > 0\f$, represents the point
+ \f$\vect{p} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+ - \f$[b, a_0, \ldots, a_{d-1}, 0]_{(\mathrm{nnc},\geq)}\f$,
+ with \f$b > 0\f$, represents the closure point
+ \f$\vect{c} = (\frac{a_0}{b}, \ldots, \frac{a_{d-1}}{b})^\transpose\f$.
+
+ So, a Linear_Row can be both a constraint and a generator: it can be an
+ equality, a strict or non-strict inequality, a line, a ray, a point
+ or a closure point.
+
+ The inhomogeneous term of a constraint can be zero or different from zero.
+
+ Points and closure points must have a positive inhomogeneous term
+ (which is used as a common divisor for all the other coefficients),
+ lines and rays must have the inhomogeneous term equal to zero.
+ If needed, the coefficients of points and closure points are negated
+ at creation time so that they satisfy this invariant.
+ The invariant is maintained because, when combining a point or closure
+ point with another generator, we only consider positive combinations.
+
+ The \f$\epsilon\f$ coefficient, when present, is negative for strict
+ inequality constraints, positive for points and equal to zero in all
+ the other cases.
+ Note that the above description corresponds to the end-user, high-level
+ view of a Linear_Row object. In the implementation, to allow for code reuse,
+ it is sometimes useful to regard an \f$\mathrm{nnc}\f$-object on
+ the vector space \f$\Rset^d\f$ as if it was a \f$\mathrm{c}\f$-object
+ on the vector space \f$\Rset^{d+1}\f$, therefore interpreting the slack
+ variable \f$\epsilon\f$ as an ordinary dimension of the vector space.
+
+ A Linear_Row object implementing a Linear_Expression is always of the form
+ \f$[0, a_0, \ldots, a_{d-1}]_{(c,=)}\f$, which represents the
+ linear expression \f$\sum_{i=0}^{d-1} a_i x_i\f$.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_Row : public Row {
+public:
+ //! The possible kinds of Linear_Row objects.
+ enum Kind {
+ LINE_OR_EQUALITY = 0,
+ RAY_OR_POINT_OR_INEQUALITY = 1
+ };
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ The type of the object to which the coefficients refer to,
+ encoding both topology and kind.
+
+ \ingroup PPL_CXX_interface
+ This combines the information about the topology (necessarily closed
+ or not) and the kind (line/equality or ray/point/inequality)
+ of a Linear_Row object.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ class Flags : public Row::Flags {
+ public:
+ //! Default constructor: builds an object where all flags are invalid.
+ Flags();
+
+ //! Builds an object corresponding to the topology \p t.
+ explicit Flags(Topology t);
+
+ //! Builds an object corresponding to the topology \p t and kind \p k.
+ Flags(Topology t, Kind k);
+
+ //! \name Testing and setting the type
+ //@{
+ Topology topology() const;
+ bool is_necessarily_closed() const;
+ bool is_not_necessarily_closed() const;
+ bool is_line_or_equality() const;
+ bool is_ray_or_point_or_inequality() const;
+
+ void set_necessarily_closed();
+ void set_not_necessarily_closed();
+ void set_is_line_or_equality();
+ void set_is_ray_or_point_or_inequality();
+ //@} // Testing and setting the type
+
+ //! Returns <CODE>true</CODE> if and only if \p *this and \p y are equal.
+ bool operator==(const Flags& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this and \p y
+ are different.
+ */
+ bool operator!=(const Flags& y) const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Flags representation from \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by \ref ascii_dump.
+ */
+ bool ascii_load(std::istream& s);
+
+ private:
+ //! Builds the type from a bit-mask.
+ explicit Flags(base_type mask);
+
+ //! \name The bits that are currently in use
+ //@{
+ // NB: ascii_load assumes that these are sequential.
+ static const unsigned rpi_validity_bit
+ = Row::Flags::first_free_bit + 0;
+ static const unsigned rpi_bit
+ = Row::Flags::first_free_bit + 1;
+ static const unsigned nnc_validity_bit
+ = Row::Flags::first_free_bit + 2;
+ static const unsigned nnc_bit
+ = Row::Flags::first_free_bit + 3;
+ //@}
+
+ protected:
+ //! Index of the first bit derived classes can use.
+ static const unsigned first_free_bit
+ = Row::Flags::first_free_bit + 4;
+
+ friend class Parma_Polyhedra_Library::Linear_Row;
+ };
+
+ //! Pre-constructs a row: construction must be completed by construct().
+ Linear_Row();
+
+ //! \name Post-constructors
+ //@{
+ //! Constructs properly a default-constructed element.
+ /*!
+ Builds a row with type \p t, size \p sz and minimum capacity.
+ */
+ void construct(dimension_type sz, Flags f);
+
+ //! 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.
+
+ \param f
+ Flags for the row that will be constructed.
+
+ The row that we are constructing has a minimum capacity, i.e., it
+ can contain at least \p capacity elements, \p sz of which will be
+ default-constructed now. The row flags are set to \p f.
+ */
+ void construct(dimension_type sz, dimension_type capacity, Flags f);
+ //@} // Post-constructors
+
+ //! Tight constructor: resizing will require reallocation.
+ Linear_Row(dimension_type sz, Flags f);
+
+ //! Sizing constructor with capacity.
+ Linear_Row(dimension_type sz, dimension_type capacity, Flags f);
+
+ //! Ordinary copy constructor.
+ Linear_Row(const Linear_Row& y);
+
+ //! Copy constructor with specified capacity.
+ /*!
+ It is assumed that \p capacity is greater than or equal to \p y size.
+ */
+ Linear_Row(const Linear_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.
+ */
+ Linear_Row(const Linear_Row& y, dimension_type sz, dimension_type capacity);
+
+ //! Destructor.
+ ~Linear_Row();
+
+ //! \name Flags inspection methods
+ //@{
+ //! Returns a const reference to the flags of \p *this.
+ const Flags& flags() const;
+
+ //! Returns a non-const reference to the flags of \p *this.
+ Flags& flags();
+
+ //! 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 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
+
+ //! Returns the maximum space dimension a Linear_Row 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 inhomogeneous term.
+ Coefficient_traits::const_reference inhomogeneous_term() const;
+
+ //! Returns the coefficient \f$a_n\f$.
+ Coefficient_traits::const_reference coefficient(dimension_type n) const;
+
+ /*! \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 Linear_Row objects
+ represent different hyperplanes or hyperspaces.
+
+ Applies both Linear_Row::normalize() and Linear_Row::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 <CODE>*this[k]</CODE> is 0.
+ /*!
+ \param y
+ The Linear_Row that will be combined with \p *this object;
+
+ \param k
+ The position of \p *this that have to be \f$0\f$.
+
+ Computes a linear combination of \p *this and \p y having
+ the element of index \p k equal to \f$0\f$. Then it assigns
+ the resulting Linear_Row to \p *this and normalizes it.
+ */
+ void linear_combine(const Linear_Row& y, dimension_type k);
+
+ /*! \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;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ //! Uses the ASCII Linear_Row representation from \p s to recreate *this.
+ /*!
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE>
+ otherwise. The ASCII representation is as output by \ref ascii_dump.
+ */
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK(dimension_type row_size, dimension_type row_capacity) const;
+
+private:
+ friend class Parma_Polyhedra_Library::Linear_Expression;
+ friend class Parma_Polyhedra_Library::Constraint;
+ friend class Parma_Polyhedra_Library::Generator;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equal.
+/*! \relates Linear_Row */
+bool operator==(const Linear_Row& x, const Linear_Row& y);
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are different.
+/*! \relates Linear_Row */
+bool operator!=(const Linear_Row& x, const Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Linear_Row
+ \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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Linear_Row& x, const Linear_Row& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_Row& x,
+ Parma_Polyhedra_Library::Linear_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 1
+/* Linear_Row class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Linear_Row.inlines.hh line 27
+#include <cassert>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_Row::Flags::Flags()
+ : Row::Flags() {
+ // Note that the constructed type has its validity bit unset.
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t)
+ : Row::Flags(t << nnc_bit) {
+#ifndef NDEBUG
+ set_bits(1 << nnc_validity_bit);
+#endif
+}
+
+inline
+Linear_Row::Flags::Flags(const Topology t, const Kind k)
+ : Row::Flags((k << rpi_bit) | (t << nnc_bit)) {
+#ifndef NDEBUG
+ set_bits((1 << rpi_validity_bit)
+ | (1 << nnc_validity_bit));
+#endif
+}
+
+inline bool
+Linear_Row::Flags::is_ray_or_point_or_inequality() const {
+ assert(test_bits(1 << rpi_validity_bit));
+ return test_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline void
+Linear_Row::Flags::set_is_ray_or_point_or_inequality() {
+#ifndef NDEBUG
+ set_bits(1 << rpi_validity_bit);
+#endif
+ set_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_line_or_equality() const {
+ assert(test_bits(1 << rpi_validity_bit));
+ return !is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::Flags::set_is_line_or_equality() {
+#ifndef NDEBUG
+ set_bits(1 << rpi_validity_bit);
+#endif
+ reset_bits(RAY_OR_POINT_OR_INEQUALITY << rpi_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_not_necessarily_closed() const {
+ assert(test_bits(1 << nnc_validity_bit));
+ return test_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline bool
+Linear_Row::Flags::is_necessarily_closed() const {
+ assert(test_bits(1 << nnc_validity_bit));
+ return !is_not_necessarily_closed();
+}
+
+inline void
+Linear_Row::Flags::set_not_necessarily_closed() {
+#ifndef NDEBUG
+ set_bits(1 << nnc_validity_bit);
+#endif
+ set_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline void
+Linear_Row::Flags::set_necessarily_closed() {
+#ifndef NDEBUG
+ set_bits(1 << nnc_validity_bit);
+#endif
+ reset_bits(NOT_NECESSARILY_CLOSED << nnc_bit);
+}
+
+inline Topology
+Linear_Row::Flags::topology() const {
+ return is_necessarily_closed() ? NECESSARILY_CLOSED : NOT_NECESSARILY_CLOSED;
+}
+
+inline bool
+Linear_Row::Flags::operator==(const Flags& y) const {
+ base_type mask = low_bits_mask<base_type>(first_free_bit);
+ return (get_bits() & mask) == (y.get_bits() & mask);
+}
+
+inline bool
+Linear_Row::Flags::operator!=(const Flags& y) const {
+ return !operator==(y);
+}
+
+inline const Linear_Row::Flags&
+Linear_Row::flags() const {
+ return static_cast<const Flags&>(Row::flags());
+}
+
+inline Linear_Row::Flags&
+Linear_Row::flags() {
+ return static_cast<Flags&>(Row::flags());
+}
+
+inline bool
+Linear_Row::is_necessarily_closed() const {
+ return flags().is_necessarily_closed();
+}
+
+inline dimension_type
+Linear_Row::max_space_dimension() {
+ // The first coefficient holds the inhomogeneous term or the divisor.
+ // In NNC rows, the last coefficient is for the epsilon dimension.
+ return max_size() - 2;
+}
+
+inline dimension_type
+Linear_Row::space_dimension() const {
+ const dimension_type sz = size();
+ return (sz == 0)
+ ? 0
+ : sz - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline
+Linear_Row::Linear_Row()
+ : Row() {
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const dimension_type capacity,
+ const Flags f) {
+ Row::construct(sz, capacity, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const dimension_type capacity,
+ const Flags f) {
+ construct(sz, capacity, f);
+}
+
+inline void
+Linear_Row::construct(const dimension_type sz, const Flags f) {
+ construct(sz, sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const dimension_type sz, const Flags f) {
+ construct(sz, f);
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y)
+ : Row(y) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+ const dimension_type capacity)
+ : Row(y, capacity) {
+}
+
+inline
+Linear_Row::Linear_Row(const Linear_Row& y,
+ const dimension_type sz, const dimension_type capacity)
+ : Row(y, sz, capacity) {
+}
+
+inline
+Linear_Row::~Linear_Row() {
+}
+
+inline bool
+Linear_Row::is_line_or_equality() const {
+ return flags().is_line_or_equality();
+}
+
+inline bool
+Linear_Row::is_ray_or_point_or_inequality() const {
+ return flags().is_ray_or_point_or_inequality();
+}
+
+inline Topology
+Linear_Row::topology() const {
+ return flags().topology();
+}
+
+inline void
+Linear_Row::set_is_line_or_equality() {
+ flags().set_is_line_or_equality();
+}
+
+inline void
+Linear_Row::set_is_ray_or_point_or_inequality() {
+ flags().set_is_ray_or_point_or_inequality();
+}
+
+inline void
+Linear_Row::set_necessarily_closed() {
+ flags().set_necessarily_closed();
+}
+
+inline void
+Linear_Row::set_not_necessarily_closed() {
+ flags().set_not_necessarily_closed();
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::inhomogeneous_term() const {
+ return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Linear_Row::coefficient(const dimension_type k) const {
+ return (*this)[k+1];
+}
+
+inline void
+Linear_Row::strong_normalize() {
+ normalize();
+ sign_normalize();
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator==(const Linear_Row& x, const Linear_Row& y) {
+ return x.flags() == y.flags()
+ && static_cast<const Row&>(x) == static_cast<const Row&>(y);
+}
+
+/*! \relates Linear_Row */
+inline bool
+operator!=(const Linear_Row& x, const Linear_Row& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Row& x,
+ Parma_Polyhedra_Library::Linear_Row& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Linear_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Linear_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_Row.defs.hh line 457
+
+// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 33
+
+#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 Linear_Row objects,
+ where each Linear_Row implements a constraint or a generator.
+ Linear systems are characterized by the matrix of coefficients,
+ also encoding the number, size and capacity of Linear_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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Linear_System : public Matrix {
+public:
+ //! Builds an empty linear system with specified topology.
+ /*!
+ Rows size and capacity are initialized to \f$0\f$.
+ */
+ Linear_System(Topology topol);
+
+ //! Builds a system with specified topology and dimensions.
+ /*!
+ \param topol
+ The topology of the system that will be created;
+
+ \param n_rows
+ The number of rows of the system that will be created;
+
+ \param n_columns
+ The number of columns of the system that will be created.
+
+ Creates a \p n_rows \f$\times\f$ \p n_columns system whose
+ coefficients are all zero and whose rows are all initialized
+ to be of the given topology.
+ */
+ Linear_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns);
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ struct With_Pending {
+ };
+
+ //! Copy-constructor: pending rows are transformed into non-pending ones.
+ Linear_System(const Linear_System& y);
+
+ //! Full copy-constructor: pending rows are copied as pending.
+ Linear_System(const Linear_System& y, 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 swap(Linear_System& y);
+
+ //! 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;
+
+ //! Makes the system shrink by removing its \p n trailing columns.
+ void remove_trailing_columns(dimension_type n);
+
+ //! Permutes the columns of the system.
+ /*
+ \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 non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the system has 6
+ 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.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+
+ //! \name Subscript operators
+ //@{
+ //! Returns a reference to the \p k-th row of the system.
+ Linear_Row& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k-th row of the system.
+ const Linear_Row& operator[](dimension_type k) const;
+ //@} // Subscript operators
+
+ //! 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 <CODE>NECESSARILY_CLOSED</CODE>.
+ void set_necessarily_closed();
+
+ //! Sets the system topology to <CODE>NOT_NECESSARILY_CLOSED</CODE>.
+ void set_not_necessarily_closed();
+
+ //! Sets the topology of all rows equal to the system topology.
+ void set_rows_topology();
+
+ //! 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);
+
+ //! Resizes the system without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized system;
+
+ \param new_n_columns
+ The number of columns of the resized system.
+
+ The system is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original system is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+
+ //! Adds \p n rows and columns to the system.
+ /*!
+ \param n
+ The number of rows and columns 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_rows_and_columns(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 Linear_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 Linear_Row& r);
+
+ //! Adds a copy of the given row to the system.
+ void add_row(const Linear_Row& r);
+
+ //! Adds a new empty row to the system, setting only its flags.
+ void add_pending_row(Linear_Row::Flags flags);
+
+ //! Adds a copy of the given row to the pending part of the system.
+ void add_pending_row(const Linear_Row& r);
+
+ //! Adds to \p *this a copy of the rows of `y'.
+ /*!
+ It is assumed that \p *this has no pending rows.
+ */
+ void add_rows(const Linear_System& y);
+
+ //! Adds a copy of the rows of `y' to the pending part of `*this'.
+ void add_pending_rows(const Linear_System& y);
+
+ /*! \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();
+
+ class With_Saturation_Matrix_iterator;
+
+ /*! \brief
+ Sorts the system, removing duplicates, keeping the saturation
+ matrix consistent.
+
+ \param sat
+ Saturation matrix with rows corresponding to the rows of \p *this.
+ */
+ void sort_and_remove_with_sat(Saturation_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 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);
+
+ /*! \brief
+ Applies Gaussian's elimination and back-substitution so as to
+ simplify the linear system.
+ */
+ void simplify();
+
+ /*! \brief
+ Normalizes the system by dividing each row for the GCD of the
+ row's elements.
+ */
+ void normalize();
+
+ //! Clears the system deallocating all its rows.
+ void clear();
+
+ PPL_OUTPUT_DECLARATIONS;
+
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) 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 <CODE>ascii_dump()</CODE>. 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;
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ \param check_strong_normalized
+ <CODE>true</CODE> if and only if the strong normalization of all
+ the rows in the system has to be checked.
+
+ By default, the strong normalization check is performed.
+ This check may be turned off to avoid useless repeated checking;
+ e.g., when re-checking a well-formed Linear_System after the permutation
+ or deletion of some of its rows.
+ */
+ bool OK(bool check_strong_normalized = true) const;
+
+private:
+ //! The topological kind of the rows in the system.
+ 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 Linear_Row&, const Linear_Row&)</CODE>.
+ If <CODE>false</CODE> may not be sorted.
+ */
+ bool sorted;
+
+ //! Ordering predicate (used when implementing the sort algorithm).
+ struct Row_Less_Than {
+ bool operator()(const Row& x, const Row& y) const;
+ };
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Linear_System& x,
+ Parma_Polyhedra_Library::Linear_System& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Linear_System& x, const Linear_System& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Linear_System& x, const Linear_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator keeping a Linear_System consistent with a Saturation_Matrix.
+/*! \ingroup PPL_CXX_interface
+ An iterator on the vector of Row objects encoded in a Linear_System
+ extended to maintain a corresponding iterator on a vector of
+ Saturation_Row objects. Access to values is always done on the Row
+ objects, but iterator
+ movements and swaps are done on both components.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator {
+public:
+ typedef std::vector<Row>::iterator Iter1;
+ typedef std::vector<Saturation_Row>::iterator Iter2;
+
+private:
+ Iter1 i1;
+ Iter2 i2;
+
+public:
+ // Same traits as Iter1.
+ typedef std::iterator_traits<Iter1>::iterator_category iterator_category;
+ typedef std::iterator_traits<Iter1>::value_type value_type;
+ typedef std::iterator_traits<Iter1>::difference_type difference_type;
+ typedef std::iterator_traits<Iter1>::pointer pointer;
+ typedef std::iterator_traits<Iter1>::reference reference;
+
+ //! Constructor.
+ With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2);
+
+ //! Copy-constructor.
+ With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y);
+
+ //! Destructor.
+ ~With_Saturation_Matrix_iterator();
+
+ //! Assignment operator.
+ With_Saturation_Matrix_iterator&
+ operator=(const With_Saturation_Matrix_iterator& y);
+
+ //! \name Operators Implementing Iterator Movement
+ //@{
+ With_Saturation_Matrix_iterator& operator++();
+ With_Saturation_Matrix_iterator operator++(int);
+
+ With_Saturation_Matrix_iterator& operator--();
+ With_Saturation_Matrix_iterator operator--(int);
+
+ With_Saturation_Matrix_iterator& operator+=(difference_type d);
+ With_Saturation_Matrix_iterator operator+(difference_type d) const;
+
+ With_Saturation_Matrix_iterator& operator-=(difference_type d);
+ With_Saturation_Matrix_iterator operator-(difference_type d) const;
+ //@}
+
+ //! Distance operator.
+ difference_type operator-(const With_Saturation_Matrix_iterator& y) const;
+
+ //! \name Comparisons between Iterators
+ //@{
+ bool operator==(const With_Saturation_Matrix_iterator& y) const;
+ bool operator!=(const With_Saturation_Matrix_iterator& y) const;
+ bool operator<(const With_Saturation_Matrix_iterator& y) const;
+ //@}
+
+ //! Dereferencing operator.
+ reference operator*() const;
+
+ //! Access-through operator.
+ pointer operator->() const;
+
+ //! Swaps the pointed Row objects while keeping Saturation_Matrix consistent.
+ void iter_swap(const With_Saturation_Matrix_iterator& y) const;
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator x,
+ Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator y);
+
+} // namespace std
+
+// 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/Saturation_Row.defs.hh line 1
+/* Saturation_Row class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 28
+#include <iosfwd>
+#include <gmp.h>
+#include <vector>
+
+namespace Parma_Polyhedra_Library {
+
+// 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 Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator==(const Saturation_Row& x, const Saturation_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 Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool operator!=(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! The basic comparison function.
+/*! \relates Saturation_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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+int compare(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_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 Saturation_Row
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool subset_or_equal(const Saturation_Row& x, const Saturation_Row& y,
+ bool& strict_subset);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic strict inclusion test.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool strict_subset(const Saturation_Row& x, const Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Set-theoretic union.
+/*! \relates Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void set_union(const Saturation_Row& x,
+ const Saturation_Row& y,
+ Saturation_Row& z);
+
+} // namespace Parma_Polyhedra_Library
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A row of a saturation matrix.
+/*! \ingroup PPL_CXX_interface
+ An object of this class represents a single row of a saturation matrix.
+ The saturation row corresponds to a constraint and a system of generators
+ (resp., a generator and a system of constraints) and records whether or
+ not the constraint is saturated by each one of the generators (resp.,
+ the generator saturates each one of the constraints).
+
+ The saturation relation is encoded by using a bitset, so that the
+ constraint is saturated by the \f$i\f$-th generator in the system
+ (resp., the generator saturates the \f$i\f$-th constraint in the system)
+ if and only if the \f$i\f$-th bit is not set.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Parma_Polyhedra_Library::Saturation_Row {
+public:
+ //! Default constructor.
+ Saturation_Row();
+
+ //! Copy-constructor.
+ Saturation_Row(const Saturation_Row& y);
+
+ //! Destructor.
+ ~Saturation_Row();
+
+ //! Assignment operator.
+ Saturation_Row& operator=(const Saturation_Row& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Saturation_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);
+
+ //! 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();
+
+ friend int
+ Parma_Polyhedra_Library::compare(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator!=(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend bool
+ Parma_Polyhedra_Library::subset_or_equal(const Saturation_Row& x,
+ const Saturation_Row& y,
+ bool& strict_subset);
+
+ friend bool
+ Parma_Polyhedra_Library::strict_subset(const Saturation_Row& x,
+ const Saturation_Row& y);
+
+ friend void
+ Parma_Polyhedra_Library::set_union(const Saturation_Row& x,
+ const Saturation_Row& y,
+ Saturation_Row& z);
+
+ //! 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;
+
+ //! Assuming \p w is nonzero, returns the index of the first set bit in \p w.
+ static unsigned int first_one(mp_limb_t w);
+
+ //! Assuming \p w is nonzero, returns the index of the last set bit in \p w.
+ static unsigned int last_one(mp_limb_t w);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Row& x,
+ Parma_Polyhedra_Library::Saturation_Row& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Row.inlines.hh line 1
+/* Saturation_Row class implementation: inline functions.
+*/
+
+
+#include <cassert>
+// For the declaration of ffs(3).
+#include <cstring>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Row::Saturation_Row() {
+ mpz_init(vec);
+}
+
+inline
+Saturation_Row::Saturation_Row(const Saturation_Row& y) {
+ mpz_init_set(vec, y.vec);
+}
+
+inline
+Saturation_Row::~Saturation_Row() {
+ mpz_clear(vec);
+}
+
+inline Saturation_Row&
+Saturation_Row::operator=(const Saturation_Row& y) {
+ mpz_set(vec, y.vec);
+ return *this;
+}
+
+inline void
+Saturation_Row::set(const unsigned long k) {
+ mpz_setbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear(const unsigned long k) {
+ mpz_clrbit(vec, k);
+}
+
+inline void
+Saturation_Row::clear_from(const unsigned long k) {
+ mpz_tdiv_r_2exp(vec, vec, k);
+}
+
+inline unsigned long
+Saturation_Row::count_ones() const {
+ assert(vec->_mp_size >= 0);
+ return mpn_popcount(vec->_mp_d, vec->_mp_size);
+}
+
+inline bool
+Saturation_Row::empty() const {
+ return mpz_sgn(vec) == 0;
+}
+
+inline void
+Saturation_Row::swap(Saturation_Row& y) {
+ mpz_swap(vec, y.vec);
+}
+
+inline void
+Saturation_Row::clear() {
+ mpz_set_ui(vec, 0UL);
+}
+
+inline memory_size_type
+Saturation_Row::external_memory_in_bytes() const {
+ return vec[0]._mp_alloc * SIZEOF_MP_LIMB_T;
+}
+
+inline memory_size_type
+Saturation_Row::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+#if HAVE_DECL_FFS && SIZEOF_MP_LIMB_T == SIZEOF_INT
+
+inline unsigned int
+Saturation_Row::first_one(mp_limb_t w) {
+ return ffs(w)-1;
+}
+
+#endif
+
+/*! \relates Saturation_Row */
+inline void
+set_union(const Saturation_Row& x, const Saturation_Row& y,
+ Saturation_Row& z) {
+ mpz_ior(z.vec, x.vec, y.vec);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Row& x,
+ Parma_Polyhedra_Library::Saturation_Row& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Row */
+inline void
+iter_swap(std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator x,
+ std::vector<Parma_Polyhedra_Library::Saturation_Row>::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Row.defs.hh line 238
+
+// Automatically generated from PPL source file ../src/Linear_System.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline memory_size_type
+Linear_System::external_memory_in_bytes() const {
+ return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_System::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Linear_System::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'.
+ assert(!sorted || check_sorted());
+ return sorted;
+}
+
+inline void
+Linear_System::set_sorted(const bool b) {
+ sorted = b;
+}
+
+inline
+Linear_System::Linear_System(Topology topol)
+ : Matrix(),
+ row_topology(topol),
+ index_first_pending(0),
+ sorted(true) {
+}
+
+inline
+Linear_System::Linear_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns)
+ : Matrix(n_rows, n_columns, Linear_Row::Flags(topol)),
+ row_topology(topol),
+ index_first_pending(n_rows),
+ sorted(true) {
+}
+
+inline dimension_type
+Linear_System::first_pending_row() const {
+ return index_first_pending;
+}
+
+inline dimension_type
+Linear_System::num_pending_rows() const {
+ assert(num_rows() >= first_pending_row());
+ return num_rows() - first_pending_row();
+}
+
+inline void
+Linear_System::unset_pending_rows() {
+ index_first_pending = num_rows();
+}
+
+inline void
+Linear_System::set_index_first_pending_row(const dimension_type i) {
+ index_first_pending = i;
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y)
+ : Matrix(y),
+ row_topology(y.row_topology) {
+ unset_pending_rows();
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ assert(num_pending_rows() == 0);
+}
+
+inline
+Linear_System::Linear_System(const Linear_System& y, With_Pending)
+ : Matrix(y),
+ row_topology(y.row_topology),
+ index_first_pending(y.index_first_pending),
+ sorted(y.sorted) {
+}
+
+inline Linear_System&
+Linear_System::operator=(const Linear_System& y) {
+ Matrix::operator=(y);
+ row_topology = y.row_topology;
+ unset_pending_rows();
+ // Previously pending rows may violate sortedness.
+ sorted = (y.num_pending_rows() > 0) ? false : y.sorted;
+ assert(num_pending_rows() == 0);
+ return *this;
+}
+
+inline void
+Linear_System::assign_with_pending(const Linear_System& y) {
+ Matrix::operator=(y);
+ row_topology = y.row_topology;
+ index_first_pending = y.index_first_pending;
+ sorted = y.sorted;
+}
+
+inline void
+Linear_System::swap(Linear_System& y) {
+ Matrix::swap(y);
+ std::swap(row_topology, y.row_topology);
+ std::swap(index_first_pending, y.index_first_pending);
+ std::swap(sorted, y.sorted);
+}
+
+inline void
+Linear_System::clear() {
+ // Note: do NOT modify the value of `row_topology'.
+ Matrix::clear();
+ index_first_pending = 0;
+ sorted = true;
+}
+
+inline void
+Linear_System::resize_no_copy(const dimension_type new_n_rows,
+ const dimension_type new_n_columns) {
+ Matrix::resize_no_copy(new_n_rows, new_n_columns,
+ Linear_Row::Flags(row_topology));
+ // Even though `*this' may happen to keep its sortedness, we believe
+ // that checking such a property is not worth the effort. In fact,
+ // it is very likely that the system will be overwritten as soon as
+ // we return.
+ set_sorted(false);
+}
+
+inline void
+Linear_System::set_necessarily_closed() {
+ row_topology = NECESSARILY_CLOSED;
+ if (num_rows() > 0)
+ set_rows_topology();
+}
+
+inline void
+Linear_System::set_not_necessarily_closed() {
+ row_topology = NOT_NECESSARILY_CLOSED;
+ if (num_rows() > 0)
+ set_rows_topology();
+}
+
+inline bool
+Linear_System::is_necessarily_closed() const {
+ return row_topology == NECESSARILY_CLOSED;
+}
+
+inline Linear_Row&
+Linear_System::operator[](const dimension_type k) {
+ return static_cast<Linear_Row&>(Matrix::operator[](k));
+}
+
+inline const Linear_Row&
+Linear_System::operator[](const dimension_type k) const {
+ return static_cast<const Linear_Row&>(Matrix::operator[](k));
+}
+
+inline Topology
+Linear_System::topology() const {
+ return row_topology;
+}
+
+inline dimension_type
+Linear_System::max_space_dimension() {
+ // Column zero holds the inhomogeneous term or the divisor.
+ // In NNC linear systems, the last column holds the coefficient
+ // of the epsilon dimension.
+ return max_num_columns() - 2;
+}
+
+inline dimension_type
+Linear_System::space_dimension() const {
+ const dimension_type n_columns = num_columns();
+ return (n_columns == 0)
+ ? 0
+ : n_columns - (is_necessarily_closed() ? 1 : 2);
+}
+
+inline void
+Linear_System::remove_trailing_columns(const dimension_type n) {
+ Matrix::remove_trailing_columns(n);
+ // Have to re-normalize the rows of the system,
+ // since we removed some coefficients.
+ strong_normalize();
+}
+
+inline void
+Linear_System::permute_columns(const std::vector<dimension_type>& cycles) {
+ Matrix::permute_columns(cycles);
+ // The rows with permuted columns are still normalized but may
+ // be not strongly normalized: sign normalization is necessary.
+ sign_normalize();
+}
+
+/*! \relates Linear_System */
+inline bool
+operator!=(const Linear_System& x, const Linear_System& y) {
+ return !(x == y);
+}
+
+inline bool
+Linear_System::Row_Less_Than::operator()(const Row& x, const Row& y) const {
+ return compare(static_cast<const Linear_Row&>(x),
+ static_cast<const Linear_Row&>(y)) < 0;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_System */
+inline void
+swap(Parma_Polyhedra_Library::Linear_System& x,
+ Parma_Polyhedra_Library::Linear_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(Iter1 iter1, Iter2 iter2)
+ : i1(iter1), i2(iter2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+With_Saturation_Matrix_iterator(const With_Saturation_Matrix_iterator& y)
+ : i1(y.i1), i2(y.i2) {
+}
+
+inline
+Linear_System::With_Saturation_Matrix_iterator::
+~With_Saturation_Matrix_iterator() {
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::
+operator=(const With_Saturation_Matrix_iterator& y) {
+ i1 = y.i1;
+ i2 = y.i2;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator++() {
+ ++i1;
+ ++i2;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator++(int) {
+ With_Saturation_Matrix_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator--() {
+ --i1;
+ --i2;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::operator--(int) {
+ With_Saturation_Matrix_iterator tmp = *this;
+ operator--();
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator+=(difference_type d) {
+ i1 += d;
+ i2 += d;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator+(difference_type d) const {
+ With_Saturation_Matrix_iterator tmp = *this;
+ tmp += d;
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator&
+Linear_System::With_Saturation_Matrix_iterator::operator-=(difference_type d) {
+ i1 -= d;
+ i2 -= d;
+ return *this;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(difference_type d) const {
+ With_Saturation_Matrix_iterator tmp = *this;
+ tmp -= d;
+ return tmp;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::difference_type
+Linear_System::With_Saturation_Matrix_iterator::
+operator-(const With_Saturation_Matrix_iterator& y) const {
+ return i1 - y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator==(const With_Saturation_Matrix_iterator& y) const {
+ return i1 == y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator!=(const With_Saturation_Matrix_iterator& y) const {
+ return i1 != y.i1;
+}
+
+inline bool
+Linear_System::With_Saturation_Matrix_iterator::
+operator<(const With_Saturation_Matrix_iterator& y) const {
+ return i1 < y.i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::reference
+Linear_System::With_Saturation_Matrix_iterator::operator*() const {
+ return *i1;
+}
+
+inline Linear_System::With_Saturation_Matrix_iterator::pointer
+Linear_System::With_Saturation_Matrix_iterator::operator->() const {
+ return &*i1;
+}
+
+inline void
+Linear_System::With_Saturation_Matrix_iterator::
+iter_swap(const With_Saturation_Matrix_iterator& y) const {
+ std::iter_swap(i1, y.i1);
+ std::iter_swap(i2, y.i2);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::Linear_System::With_Saturation_Matrix_iterator */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+inline void
+iter_swap(Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator x,
+ Parma_Polyhedra_Library
+ ::Linear_System::With_Saturation_Matrix_iterator y) {
+ x.iter_swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_System.defs.hh line 516
+
+// Automatically generated from PPL source file ../src/Constraint_System.defs.hh line 33
+#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
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+void swap(Parma_Polyhedra_Library::Constraint_System& x,
+ Parma_Polyhedra_Library::Constraint_System& y);
+
+} // namespace std
+
+//! 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 : private Linear_System {
+public:
+ //! Default constructor: builds an empty system of constraints.
+ Constraint_System();
+
+ //! Builds the singleton system containing only constraint \p c.
+ explicit Constraint_System(const Constraint& c);
+
+ //! Ordinary copy-constructor.
+ Constraint_System(const Constraint_System& cs);
+
+ //! Destructor.
+ ~Constraint_System();
+
+ //! Assignment operator.
+ Constraint_System& operator=(const Constraint_System& y);
+
+ //! 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;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this
+ contains one or more strict inequality constraints.
+ */
+ bool has_strict_inequalities() const;
+
+ /*! \brief
+ Removes all the constraints from the constraint system
+ and sets its space dimension to 0.
+ */
+ void clear();
+
+ /*! \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);
+
+ /*! \brief
+ Returns the singleton system containing only
+ Constraint::zero_dim_false().
+ */
+ static const Constraint_System& zero_dim_empty();
+
+ //! 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
+ */
+ class const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Constraint,
+ ptrdiff_t,
+ const Constraint*,
+ const Constraint&> {
+ 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 Constraint& operator*() const;
+
+ //! Indirect member selector.
+ const Constraint* 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 Constraint_System;
+
+ //! The const iterator over the matrix of constraints.
+ Linear_System::const_iterator i;
+
+ //! A const pointer to the matrix of constraints.
+ const Linear_System* csp;
+
+ //! Constructor.
+ const_iterator(const Linear_System::const_iterator& iter,
+ const Constraint_System& csys);
+
+ //! \p *this skips to the next non-trivial constraint.
+ void skip_forward();
+ };
+
+ /*! \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.
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*!
+ Returns <CODE>true</CODE> if and only if \p *this is a valid
+ Linear_System and each row in the system is a valid Constraint.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(Constraint_System& y);
+
+private:
+ friend class const_iterator;
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ friend class Parma_Polyhedra_Library::LP_Problem;
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+ const Polyhedron& y);
+
+ //! Builds an empty system of constraints having the specified topology.
+ explicit Constraint_System(Topology topol);
+
+ /*! \brief
+ Builds a system of \p n_rows constraints on a \p n_columns - 1
+ dimensional space (including the \f$\epsilon\f$ dimension, if
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+ */
+ Constraint_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns);
+
+ /*! \brief
+ Adjusts \p *this so that it matches the topology and
+ the number of space dimensions given as parameters
+ (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 topol,
+ dimension_type num_dimensions);
+
+ //! Returns the \p k- th constraint of the system.
+ Constraint& operator[](dimension_type k);
+
+ //! 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
+ 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 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(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! 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's 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
+ 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();
+};
+
+// Constraint_System.inlines.hh is not included here on purpose.
+
+// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 31
+#include <vector>
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A not necessarily closed bounding-box.
+/*! \ingroup PPL_CXX_interface
+ A Bounding_Box object represents the Cartesian product of \f$n\f$
+ not necessarily closed and possibly unbounded intervals,
+ where \f$n\f$ is the space dimension of the box.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+class Bounding_Box {
+public:
+ //! Constructs a universe bounding box of dimension \p num_dimensions.
+ Bounding_Box(dimension_type num_dimensions);
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ /*! \brief
+ Returns a reference the interval that bounds
+ the box on the <CODE>k</CODE>-th space dimension.
+ */
+ const Interval& operator[](dimension_type k) const;
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is empty.
+ bool is_empty() const;
+
+ /*! \brief
+ If the <CODE>k</CODE>-th space dimension is unbounded below, returns
+ <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+ \p closed, \p n and \p d accordingly.
+
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+
+ An undefined behavior is obtained if \p k is greater than
+ or equal to the space dimension of \p *this.
+ */
+ bool get_lower_bound(dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const;
+
+ /*! \brief
+ If the <CODE>k</CODE>-th space dimension is unbounded above, returns
+ <CODE>false</CODE>. Otherwise returns <CODE>true</CODE> and set
+ \p closed, \p n and \p d accordingly.
+
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+
+ An undefined behavior is obtained if \p k is greater than
+ or equal to the space dimension of \p *this.
+ */
+ bool get_upper_bound(dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const;
+
+ //! Causes the box to become empty, i.e., to represent the empty set.
+ void set_empty();
+
+ /*! \brief
+ Raises the lower bound of the interval corresponding
+ to the <CODE>k</CODE>-th space dimension.
+
+ Intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+ An undefined behavior is obtained if \p k is greater than or equal to
+ the space dimension of \p *this or if \p d is equal to zero.
+ */
+ void raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d);
+
+ /*! \brief
+ Lowers the upper bound of the interval corresponding
+ to the <CODE>k</CODE>-th space dimension.
+
+ Intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+ is <CODE>false</CODE>.
+ An undefined behavior is obtained if \p k is greater than or equal to
+ the space dimension of \p *this or if \p d is equal to zero.
+ */
+ void lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d);
+
+ //! Returns a system of constraints corresponding to \p *this.
+ Constraint_System constraints() const;
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A bounding box that <EM>must</EM> be contained in \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void CC76_widening_assign(const Bounding_Box& y);
+
+ /*! \brief
+ Assigns to \p *this the result of computing the
+ \ref CC76_extrapolation "CC76-widening" between \p *this and \p y.
+
+ \param y
+ A bounding 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 Iterator>
+ void CC76_widening_assign(const Bounding_Box& y,
+ Iterator first, Iterator last);
+
+private:
+ /*! \brief
+ A vector of rational intervals, one for each dimension
+ of the vector space.
+ */
+ std::vector<Interval> vec;
+ /*! \brief
+ A boolean flag indicating emptiness of the bounding box.
+ Only meaningful when \p empty_up_to_date is <CODE>true</CODE>.
+ */
+ mutable bool empty;
+ //! Tells whether or not the flag \p empty is meaningful.
+ mutable bool empty_up_to_date;
+
+ //! Records the stop points for CC76_widening_assign(const Bounding_Box&).
+ static ERational default_stop_points[];
+};
+
+namespace IO_Operators {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Bounding_Box */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+std::ostream& operator<<(std::ostream& s, const Bounding_Box& bbox);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Bounding_Box.inlines.hh line 1
+/* Bounding_Box class implementation: inline functions.
+*/
+
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Bounding_Box::Bounding_Box(dimension_type num_dimensions)
+ : vec(num_dimensions), empty(false), empty_up_to_date(true) {
+}
+
+inline dimension_type
+Bounding_Box::space_dimension() const {
+ return vec.size();
+}
+
+inline const Interval&
+Bounding_Box::operator[](const dimension_type k) const {
+ assert(k < vec.size());
+ return vec[k];
+}
+
+inline bool
+Bounding_Box::is_empty() const {
+ if (empty_up_to_date)
+ return empty;
+ else {
+ empty_up_to_date = true;
+ for (dimension_type k = vec.size(); k-- > 0; )
+ if (vec[k].is_empty()) {
+ empty = true;
+ return true;
+ }
+ empty = false;
+ return false;
+ }
+}
+
+inline bool
+Bounding_Box::get_lower_bound(const dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const {
+ assert(k < vec.size());
+ const LBoundary& lb = vec[k].lower_bound();
+ const ERational& lr = lb.bound();
+
+ if (is_plus_infinity(lr) || is_minus_infinity(lr))
+ return false;
+
+ closed = lb.is_closed();
+ n = raw_value(lr).get_num();
+ d = raw_value(lr).get_den();
+
+ return true;
+}
+
+inline bool
+Bounding_Box::get_upper_bound(const dimension_type k, bool& closed,
+ Coefficient& n, Coefficient& d) const {
+ assert(k < vec.size());
+ const UBoundary& ub = vec[k].upper_bound();
+ const ERational& ur = ub.bound();
+
+ if (is_plus_infinity(ur) || is_minus_infinity(ur))
+ return false;
+
+ closed = ub.is_closed();
+ n = raw_value(ur).get_num();
+ d = raw_value(ur).get_den();
+
+ return true;
+}
+
+inline void
+Bounding_Box::set_empty() {
+ for (dimension_type k = vec.size(); k-- > 0; )
+ vec[k].set_empty();
+ empty = empty_up_to_date = true;
+}
+
+inline void
+Bounding_Box::raise_lower_bound(const dimension_type k, const bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d) {
+ assert(k < vec.size());
+ assert(d != 0);
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ vec[k].raise_lower_bound(LBoundary(ERational(q, ROUND_NOT_NEEDED),
+ (closed
+ ? LBoundary::CLOSED
+ : LBoundary::OPEN)));
+ empty_up_to_date = false;
+}
+
+inline void
+Bounding_Box::lower_upper_bound(const dimension_type k, const bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d) {
+ assert(k < vec.size());
+ assert(d != 0);
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ vec[k].lower_upper_bound(UBoundary(ERational(q, ROUND_NOT_NEEDED),
+ (closed
+ ? UBoundary::CLOSED
+ : UBoundary::OPEN)));
+ empty_up_to_date = false;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Bounding_Box.defs.hh line 206
+
+// Automatically generated from PPL source file ../src/Variable.defs.hh line 1
+/* Variable class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Variable.defs.hh line 29
+#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);
+
+} // 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 the <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);
+
+ //! 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;
+ };
+
+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;
+
+ //! The default output function.
+ static void default_output_function(std::ostream& s, const Variable& v);
+};
+
+// Automatically generated from PPL source file ../src/Variable.inlines.hh line 1
+/* Variable class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Variable.inlines.hh line 27
+#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);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Variable.defs.hh line 147
+
+namespace Parma_Polyhedra_Library {
+
+//! An std::set containing variables in increasing order of dimension index.
+/*! \ingroup PPL_CXX_interface */
+typedef std::set<Variable, Variable::Compare> Variables_Set;
+
+} // namespace Parma_Polyhedra_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 28
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Init {
+private:
+ //! Count the number of objects created.
+ static unsigned int count;
+ static fpu_rounding_direction_type old_rounding_direction;
+
+public:
+ //! Initializes the PPL.
+ Init();
+
+ //! Finalizes the PPL.
+ ~Init();
+};
+
+// 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/initializer.hh line 27
+
+namespace {
+
+Parma_Polyhedra_Library::Init Parma_Polyhedra_Library_initializer;
+
+} // namespace
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 1
+/* Saturation_Matrix class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 29
+#include <vector>
+#include <iosfwd>
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A saturation matrix.
+/*! \ingroup PPL_CXX_interface
+ A saturation matrix is used to encode the relation between the
+ generators and the constraints of a polyhedron: if a generator
+ saturates a constraint the corresponding element of the saturation
+ matrix is \f$0\f$, otherwise (i.e., if the generator satisfies but
+ does not saturate the constraint) the corresponding element is \f$1\f$.
+ \note
+ since the constraints and generators are taken from the same polyhedron
+ description, it cannot be the case that a generator <EM>violates</EM>
+ a constraint.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+
+class Parma_Polyhedra_Library::Saturation_Matrix {
+public:
+ //! Default constructor.
+ Saturation_Matrix();
+
+ /*! \brief
+ Construct a saturation matrix with \p n_rows rows
+ and \p n_columns columns.
+ */
+ Saturation_Matrix(dimension_type n_rows, dimension_type n_columns);
+
+ //! Copy-constructor.
+ Saturation_Matrix(const Saturation_Matrix& y);
+
+ //! Destructor.
+ ~Saturation_Matrix();
+
+ //! Assignment operator.
+ Saturation_Matrix& operator=(const Saturation_Matrix& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Saturation_Matrix& y);
+
+ //! Subscript operator.
+ Saturation_Row& operator[](dimension_type k);
+
+ //! Constant subscript operator.
+ const Saturation_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 Saturation_Matrix& y);
+
+ //! Returns the maximum number of rows of a Saturation_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 saturation matrix (this ensures better efficiency),
+ tells whether it contains the given row.
+ */
+ bool sorted_contains(const Saturation_Row& row) const;
+
+ //! Adds \p row to \p *this.
+ void add_row(const Saturation_Row& row);
+
+ //! Erases the rows from the \p first_to_erase -th to the last one.
+ void rows_erase_to_end(dimension_type first_to_erase);
+
+ //! Erases the columns from the \p first_to_erase -th to the last one.
+ void columns_erase_to_end(dimension_type first_to_erase);
+
+ //! 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 \ref ascii_dump)
+ 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<Saturation_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 Saturation_Row_Less_Than {
+ bool operator()(const Saturation_Row& x, const Saturation_Row& y) const;
+ };
+
+ friend
+ void Parma_Polyhedra_Library::
+ Linear_System::sort_and_remove_with_sat(Saturation_Matrix& sat);
+
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+void swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+ Parma_Polyhedra_Library::Saturation_Matrix& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.inlines.hh line 1
+/* Saturation_Matrix class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Saturation_Matrix::Saturation_Matrix()
+ : rows(),
+ row_size(0) {
+}
+
+inline dimension_type
+Saturation_Matrix::max_num_rows() {
+ return std::vector<Saturation_Row>().max_size();
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const dimension_type n_rows,
+ const dimension_type n_columns)
+ : rows(n_rows),
+ row_size(n_columns) {
+}
+
+inline
+Saturation_Matrix::Saturation_Matrix(const Saturation_Matrix& y)
+ : rows(y.rows),
+ row_size(y.row_size) {
+}
+
+inline
+Saturation_Matrix::~Saturation_Matrix() {
+}
+
+inline void
+Saturation_Matrix::rows_erase_to_end(const dimension_type first_to_erase) {
+ // The first row to be erased cannot be greater
+ // than the actual number of the rows of the matrix.
+ assert(first_to_erase <= rows.size());
+ if (first_to_erase < rows.size())
+ rows.erase(rows.begin() + first_to_erase, rows.end());
+ assert(OK());
+}
+
+inline void
+Saturation_Matrix::columns_erase_to_end(const dimension_type first_to_erase) {
+ // The first column to be erased cannot be greater
+ // than the actual number of the columns of the matrix.
+ assert(first_to_erase <= row_size);
+ row_size = first_to_erase;
+ assert(OK());
+}
+
+inline void
+Saturation_Matrix::swap(Saturation_Matrix& y) {
+ std::swap(row_size, y.row_size);
+ std::swap(rows, y.rows);
+}
+
+inline Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline const Saturation_Row&
+Saturation_Matrix::operator[](const dimension_type k) const {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+inline dimension_type
+Saturation_Matrix::num_columns() const {
+ return row_size;
+}
+
+inline dimension_type
+Saturation_Matrix::num_rows() const {
+ return rows.size();
+}
+
+inline void
+Saturation_Matrix::clear() {
+ // Clear `rows' and minimize its capacity.
+ std::vector<Saturation_Row>().swap(rows);
+ row_size = 0;
+}
+
+inline memory_size_type
+Saturation_Matrix::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline bool
+Saturation_Matrix::Saturation_Row_Less_Than::
+operator()(const Saturation_Row& x, const Saturation_Row& y) const {
+ return compare(x, y) < 0;
+}
+
+inline bool
+Saturation_Matrix::sorted_contains(const Saturation_Row& row) const {
+ assert(check_sorted());
+ return std::binary_search(rows.begin(), rows.end(), row,
+ Saturation_Row_Less_Than());
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Saturation_Matrix */
+inline void
+swap(Parma_Polyhedra_Library::Saturation_Matrix& x,
+ Parma_Polyhedra_Library::Saturation_Matrix& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Saturation_Matrix.defs.hh line 176
+
+// Automatically generated from PPL source file ../src/Generator_System.defs.hh line 1
+/* Generator_System class declaration.
+*/
+
+
+// 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 28
+#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
+ Parma_Polyhedra_Library::operator==(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator!=(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ Parma_Polyhedra_Library::operator&&(const Poly_Con_Relation& x,
+ const Poly_Con_Relation& y);
+
+ friend Poly_Con_Relation
+ Parma_Polyhedra_Library::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 foreign
+ 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 169
+
+// 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
+
+// Put it in the namespace here to declare it friend later.
+/*! \relates Polyhedron */
+bool operator==(const Polyhedron& x, const Polyhedron& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator_System */
+void swap(Parma_Polyhedra_Library::Generator_System& x,
+ Parma_Polyhedra_Library::Generator_System& y);
+
+} // namespace std
+
+//! 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 : private Linear_System {
+public:
+ //! Default constructor: builds an empty system of generators.
+ Generator_System();
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Generator_System(const Generator& g);
+
+ //! Ordinary copy-constructor.
+ Generator_System(const Generator_System& gs);
+
+ //! Destructor.
+ ~Generator_System();
+
+ //! Assignment operator.
+ Generator_System& operator=(const Generator_System& y);
+
+ //! 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;
+
+ /*! \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
+ Returns the singleton system containing only
+ Generator::zero_dim_point().
+ */
+ static const Generator_System& zero_dim_univ();
+
+ //! 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 const_iterator
+ : public std::iterator<std::forward_iterator_tag,
+ Generator,
+ ptrdiff_t,
+ const Generator*,
+ const 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 Generator& operator*() const;
+
+ //! Indirect member selector.
+ const 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 Generator_System;
+
+ //! The const iterator over the Linear_System.
+ Linear_System::const_iterator i;
+
+ //! A const pointer to the Linear_System.
+ const Linear_System* gsp;
+
+ //! Constructor.
+ const_iterator(const Linear_System::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();
+ };
+
+ /*! \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.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p *this is a valid
+ Linear_System and each row in the system is a valid Generator.
+ */
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) 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.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(Generator_System& y);
+
+private:
+ friend class const_iterator;
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Polyhedron& x,
+ const Polyhedron& y);
+
+ //! Builds an empty system of generators having the specified topology.
+ explicit Generator_System(Topology topol);
+
+ /*! \brief
+ Builds a system of \p n_rows rays/points on a \p n_columns - 1
+ dimensional space (including the \f$\epsilon\f$ dimension, if
+ \p topol is <CODE>NOT_NECESSARILY_CLOSED</CODE>).
+ */
+ Generator_System(Topology topol,
+ dimension_type n_rows, dimension_type n_columns);
+
+ /*! \brief
+ Adjusts \p *this so that it matches the topology and
+ the number of space dimensions given as parameters
+ (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 topol,
+ dimension_type num_dimensions);
+
+ /*! \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;
+
+ //! Returns the \p k- th generator of the system.
+ Generator& operator[](dimension_type k);
+
+ //! 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
+ Index of the column 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 \p v -th
+ 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(dimension_type 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's 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);
+};
+
+// Generator_System.inlines.hh is not included here on purpose.
+
+// 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 30
+#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
+
+//! 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
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator_System */
+void swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+ Parma_Polyhedra_Library::Grid_Generator_System& y);
+
+} // namespace std
+
+
+//! 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
+ : private Generator_System {
+public:
+ // FIXME: Add wrappers of any other public Generator_System methods.
+
+ //! Default constructor: builds an empty system of generators.
+ Grid_Generator_System();
+
+ //! Ordinary copy-constructor.
+ Grid_Generator_System(const Grid_Generator_System& gs);
+
+ //! Builds an empty system of generators of dimension \p dim.
+ explicit Grid_Generator_System(dimension_type dim);
+
+ //! Builds the singleton system containing only generator \p g.
+ explicit Grid_Generator_System(const Grid_Generator& g);
+
+ //! 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 recycling_insert(Grid_Generator& g);
+
+ /*! \brief
+ Inserts into \p *this the generators in \p gs, increasing the
+ number of space dimensions if needed.
+ */
+ void recycling_insert(Grid_Generator_System& gs);
+
+ //! 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& gs = gr.generators();
+ for (Grid_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 = gr.generators();
+ copy(gs.begin(), gs.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&>,
+ private Generator_System::const_iterator {
+ 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;
+
+ //! Copy-constructor from Generator_System::const_iterator.
+ const_iterator(const Generator_System::const_iterator& y);
+ };
+
+ /*! \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;
+
+ //! Swaps \p *this with \p y.
+ void swap(Grid_Generator_System& y);
+
+ //! Returns the size in bytes of the memory managed by \p *this.
+ memory_size_type external_memory_in_bytes() const;
+
+ //! Returns the total size in bytes of the memory occupied by \p *this.
+ memory_size_type total_memory_in_bytes() const;
+
+ //! Assigns to a given variable an affine expression.
+ /*!
+ \param v
+ Index of the column 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 each element of \p v -th
+ 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(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Returns the number of generators in the system.
+ dimension_type num_generators() 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;
+
+ //! Returns the \p k- th generator of the system.
+ Grid_Generator& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k- th generator of the system.
+ const Grid_Generator& operator[](dimension_type k) const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) 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.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ /*!
+ Returns <CODE>true</CODE> if and only if \p *this is a valid
+ Linear_System and each row in the system is a valid Grid_Generator.
+ */
+ bool OK() const;
+
+ /*! \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({A \atop 0}{0 \atop B}\bigr)\f$
+ where \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the
+ form \f$\bigl({1 \atop 0}{0 \atop 1}\bigr)\f$. The matrix is
+ expanded avoiding reallocation whenever possible.
+ */
+ void add_universe_rows_and_columns(dimension_type dims);
+
+ //! Removes all the specified dimensions from the generator system.
+ /*!
+ \exception std::invalid_argument
+ Thrown if the highest space dimension of the variables in \p
+ to_be_removed is higher than the space dimension of \p *this.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \brief
+ Removes the higher dimensions of the system so that the resulting
+ system will have dimension \p new_dimension.
+
+ \exception std::invalid_argument
+ Thrown if the \p new_dimension is higher than the space dimension
+ of \p *this.
+ */
+ void remove_higher_space_dimensions(dimension_type new_dimension);
+
+private:
+ friend bool operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y);
+ // FIXME: The following friend declaration grants Grid::conversion
+ // access to Matrix (for the Grid::reduce_reduced call) and
+ // Matrix::resize_no_copy, and the following methods.
+ friend class Grid;
+
+ //! Sets the sortedness flag of the system to \p b.
+ void set_sorted(bool b);
+
+ //! 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);
+
+ //! Resizes the system without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized system;
+
+ \param new_n_columns
+ The number of columns of the resized system.
+
+ The system is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original system is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows,
+ dimension_type new_n_columns);
+
+ /*! \brief
+ Returns the number of columns of the matrix (i.e., the size of the
+ rows).
+ */
+ dimension_type num_columns() const;
+
+ /*! \brief
+ Erases from the matrix all the rows but those having an index less
+ than \p first_to_erase.
+ */
+ void erase_to_end(dimension_type first_to_erase);
+
+ //! Permutes the columns of the matrix.
+ /*
+ \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 non-zero column indexes. Each cycle is
+ terminated by zero. For example, assuming the matrix has 6
+ 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.
+ */
+ void permute_columns(const std::vector<dimension_type>& cycles);
+};
+
+// Grid_Generator_System.inlines.hh is not included here on purpose.
+
+// 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 33
+#include <iosfwd>
+
+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
+
+// Put this in the namespace here to declare it a friend later.
+
+//! Returns <CODE>true</CODE> if and only if \p x and \p y are equivalent.
+/*! \relates Congruence_System */
+bool
+operator==(const Congruence_System& x, const Congruence_System& y);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+ Parma_Polyhedra_Library::Congruence_System& y);
+
+} // namespace std
+
+//! 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 : private Matrix {
+public:
+ //! Default constructor: builds an empty system of congruences.
+ Congruence_System();
+
+ //! Builds the singleton system containing only congruence \p cg.
+ explicit Congruence_System(const Congruence& cg);
+
+ /*! \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);
+
+ //! Builds a system containing copies of any equalities in \p cs.
+ explicit Congruence_System(const Constraint_System& cs);
+
+ //! Ordinary copy-constructor.
+ Congruence_System(const Congruence_System& cgs);
+
+ //! Destructor.
+ ~Congruence_System();
+
+ //! Assignment operator.
+ Congruence_System& operator=(const Congruence_System& cgs);
+
+ //! 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 cgs.
+ */
+ bool is_equal_to(const Congruence_System& cgs) 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 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 relation.
+ */
+ void insert(const Constraint& c);
+
+ // TODO: Consider adding a recycling_insert(cg).
+
+ /*! \brief
+ Inserts in \p *this a copy of the congruences in \p cgs,
+ increasing the number of space dimensions if needed.
+
+ The inserted copies will be strongly normalized.
+ */
+ void insert(const Congruence_System& cgs);
+
+ /*! \brief
+ Inserts into \p *this the congruences in \p cgs, increasing the
+ number of space dimensions if needed.
+ */
+ void recycling_insert(Congruence_System& cgs);
+
+ //! 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 matrix of congruences.
+ Matrix::const_iterator i;
+
+ //! A const pointer to the matrix of congruences.
+ const Matrix* csp;
+
+ //! Constructor.
+ const_iterator(const Matrix::const_iterator& iter,
+ const Congruence_System& cgs);
+
+ //! \p *this skips to the next non-trivial congruence.
+ void skip_forward();
+ };
+
+ /*! \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 \p *this is a valid
+ Matrix, each row in the system is a valid Congruence and the
+ number of columns is consistent with the number of congruences.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) and sets \p *this accordingly. Returns
+ <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(Congruence_System& cgs);
+
+ /*! \brief
+ Adds \p dims rows and \p dims columns of zeroes to the matrix,
+ initializing the added rows as in the unit congruence 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({0 \atop A}{B \atop A}\bigr)\f$ where
+ \f$B\f$ is the \f$dims \times dims\f$ unit matrix of the form
+ \f$\bigl({0 \atop 1}{1 \atop 0}\bigr)\f$. The matrix is expanded
+ avoiding reallocation whenever possible.
+ */
+ void add_unit_rows_and_columns(dimension_type dims);
+
+ /*! \brief
+ Concatenates copies of the congruences from \p cgs onto \p *this.
+
+ 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 cgs in the lower right-hand side, and padding
+ with zeroes.
+ */
+ void concatenate(const Congruence_System& cgs);
+
+protected:
+
+ //! Returns <CODE>true</CODE> if \p g satisfies all the congruences.
+ bool satisfies_all_congruences(const Grid_Generator& g) const;
+
+private:
+
+ //! Adjusts all expressions to have the same moduli.
+ void normalize_moduli();
+
+ //! Increase the number of space dimensions to \p new_space_dim.
+ /*!
+ \p new_space_dim must at least equal to the current space
+ dimension.
+ */
+ bool increase_space_dimension(const dimension_type new_space_dim);
+
+ /*! \brief
+ Inserts in \p *this an exact copy of the congruence \p cg,
+ increasing the number of space dimensions if needed.
+
+ This method inserts a copy of \p cg in the given form, instead of
+ first strong normalizing \p cg as \ref insert would do.
+ */
+ void insert_verbatim(const Congruence& cg);
+
+ friend class const_iterator;
+ // FIXME: Reduce the dependence on this declaration.
+ friend class Grid;
+ friend class Grid_Certificate;
+
+ friend void std::swap(Parma_Polyhedra_Library::Congruence_System& x,
+ Parma_Polyhedra_Library::Congruence_System& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator==(const Congruence_System& x,
+ const Congruence_System& y);
+
+ //! Returns the \p k- th congruence of the system.
+ Congruence& operator[](dimension_type k);
+
+ //! Returns a constant reference to the \p k- th congruence of the system.
+ const Congruence& operator[](dimension_type k) const;
+
+ /*! \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;
+
+ /*! \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(dimension_type v,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator);
+
+ //! Resizes the system without worrying about the old contents.
+ /*!
+ \param new_n_rows
+ The number of rows of the resized system;
+
+ \param new_n_columns
+ The number of columns of the resized system.
+
+ The system is expanded to the specified dimensions avoiding
+ reallocation whenever possible.
+ The contents of the original system is lost.
+ */
+ void resize_no_copy(dimension_type new_n_rows, dimension_type new_n_columns);
+};
+
+// Congruence_System.inlines.hh is not included here on purpose.
+
+// 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 42
+#include <cstddef>
+
+namespace Parma_Polyhedra_Library {
+// Put them in the namespace here to declare them friend later.
+
+//! Returns the congruence \p e1 = \p e2 \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+//! Returns the congruence \p e = \p n \p \pmod{1}.
+/*! \relates Congruence */
+Congruence
+operator%=(const Linear_Expression& e, Coefficient_traits::const_reference n);
+
+//! 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);
+
+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
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+void swap(Parma_Polyhedra_Library::Linear_Expression& x,
+ Parma_Polyhedra_Library::Linear_Expression& y);
+
+} // namespace std
+
+//! 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 : private Linear_Row {
+public:
+ //! Default constructor: returns a copy of Linear_Expression::zero().
+ Linear_Expression();
+
+ //! Ordinary copy-constructor.
+ Linear_Expression(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);
+
+ //! Builds the linear expression corresponding to the variable \p v.
+ /*! \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(Variable v);
+
+ //! Builds the linear expression corresponding to constraint \p c.
+ /*!
+ Given the constraint
+ \f$c = \bigl(\sum_{i=0}^{n-1} a_i x_i + b \relsym 0\bigr)\f$,
+ where \f$\mathord{\relsym} \in \{ =, \geq, > \}\f$,
+ this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+ If \p c is an inequality (resp., equality) constraint, then
+ the built linear expression is unique up to a positive
+ (resp., non-zero) factor.
+ */
+ explicit Linear_Expression(const Constraint& c);
+
+ /*! \brief
+ Builds the linear expression corresponding to generator \p g
+ (for points and closure points, the divisor is not copied).
+
+ Given the generator
+ \f$g = (\frac{a_0}{d}, \ldots, \frac{a_{n-1}}{d})^\transpose\f$
+ (where, for lines and rays, we have \f$d = 1\f$),
+ this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i\f$.
+ The inhomogeneous term of the linear expression will always be 0.
+ If \p g is a ray, point or closure point (resp., a line), then
+ the linear expression is unique up to a positive
+ (resp., non-zero) factor.
+ */
+ explicit Linear_Expression(const Generator& g);
+
+ //! Builds the linear expression corresponding to congruence \p cg.
+ /*!
+ Given the congruence
+ \f$cg = \bigl(\sum_{i=0}^{n-1} a_i x_i + b = 0 \pmod{m}\bigr)\f$,
+ this builds the linear expression \f$\sum_{i=0}^{n-1} a_i x_i + b\f$.
+ */
+ explicit Linear_Expression(const Congruence& cg);
+
+ //! 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;
+
+ //! 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 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;
+
+ //! Swaps \p *this with \p y.
+ void swap(Linear_Expression& y);
+
+private:
+ friend class Parma_Polyhedra_Library::Scalar_Products;
+ friend class Parma_Polyhedra_Library::Constraint;
+ friend class Parma_Polyhedra_Library::Generator;
+ // The following declaration grants access to Grid_Generator::parameter.
+ friend class Parma_Polyhedra_Library::Grid_Generator;
+ friend class Parma_Polyhedra_Library::Congruence;
+ // FIXME: the following friend declaration should be avoided.
+ friend class Parma_Polyhedra_Library::Polyhedron;
+ friend class Parma_Polyhedra_Library::Grid;
+ friend class Parma_Polyhedra_Library::LP_Problem;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Constraint_System::affine_preimage().
+ friend class Parma_Polyhedra_Library::Constraint_System;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Generator_System::affine_image().
+ friend class Parma_Polyhedra_Library::Generator_System;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Congruence_System::affine_preimage().
+ friend class Parma_Polyhedra_Library::Congruence_System;
+
+ // FIXME: the following friend declaration is only to grant access to
+ // Grid_Generator_System::affine_image().
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+ //! Copy-constructor with a specified space dimension.
+ Linear_Expression(const Linear_Expression& e, dimension_type sz);
+
+ //! 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 sz, bool);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator+(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator+(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator+(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(const Linear_Expression& e);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator-(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator*(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+ friend Linear_Expression
+ Parma_Polyhedra_Library::operator*(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator+=(Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+ Variable v);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator+=(Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator-=(Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+ Variable v);
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator-=(Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend Linear_Expression&
+ Parma_Polyhedra_Library::operator*=(Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Linear_Expression& e);
+
+ friend Congruence
+ Parma_Polyhedra_Library::operator%=(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+
+ friend Congruence
+ Parma_Polyhedra_Library::operator%=(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+};
+
+// 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
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Linear_Expression::max_space_dimension() {
+ return Linear_Row::max_space_dimension();
+}
+
+inline
+Linear_Expression::Linear_Expression()
+ : Linear_Row(1, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(dimension_type sz, bool)
+ : Linear_Row(sz, Linear_Row::Flags()) {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Variable v)
+ : Linear_Row(v.space_dimension() <= max_space_dimension()
+ ? v.id() + 2
+ : (throw std::length_error("PPL::Linear_Expression::"
+ "Linear_Expression(v):\n"
+ "v exceeds the maximum allowed "
+ "space dimension."),
+ v.id() + 2)
+ , Linear_Row::Flags()) {
+ (*this)[v.id() + 1] = 1;
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e)
+ : Linear_Row(e) {
+}
+
+inline
+Linear_Expression::~Linear_Expression() {
+}
+
+inline
+Linear_Expression::Linear_Expression(const Linear_Expression& e,
+ dimension_type sz)
+ : Linear_Row(e, sz, sz) {
+}
+
+inline
+Linear_Expression::Linear_Expression(Coefficient_traits::const_reference n)
+ : Linear_Row(1, Linear_Row::Flags()) {
+ (*this)[0] = n;
+}
+
+inline dimension_type
+Linear_Expression::space_dimension() const {
+ return size() - 1;
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::coefficient(Variable v) const {
+ if (v.space_dimension() > space_dimension())
+ return Coefficient_zero();
+ return Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Linear_Expression::inhomogeneous_term() const {
+ return Linear_Row::inhomogeneous_term();
+}
+
+inline const Linear_Expression&
+Linear_Expression::zero() {
+ static Linear_Expression z = Linear_Expression(Coefficient_zero());
+ return z;
+}
+
+inline memory_size_type
+Linear_Expression::external_memory_in_bytes() const {
+ return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Linear_Expression::total_memory_in_bytes() const {
+ return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \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) {
+ return n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Variable w) {
+ // FIXME: provide a better implementation.
+ return Linear_Expression(v) + Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Variable v, const Linear_Expression& e) {
+ // FIXME: provide a better implementation.
+ return e + Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator+(const Linear_Expression& e, const Variable v) {
+ return v + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return -n + e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Variable w) {
+ // FIXME: provide a better implementation.
+ return Linear_Expression(v) - Linear_Expression(w);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Variable v, const Linear_Expression& e) {
+ // FIXME: provide a better implementation.
+ return Linear_Expression(v) - e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator-(const Linear_Expression& e, const Variable v) {
+ // FIXME: provide a better implementation.
+ return e - Linear_Expression(v);
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression
+operator*(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ return n * e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator+=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ e[0] += n;
+ return e;
+}
+
+/*! \relates Linear_Expression */
+inline Linear_Expression&
+operator-=(Linear_Expression& e, Coefficient_traits::const_reference n) {
+ e[0] -= n;
+ return e;
+}
+
+inline void
+Linear_Expression::swap(Linear_Expression& y) {
+ Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Linear_Expression */
+inline void
+swap(Parma_Polyhedra_Library::Linear_Expression& x,
+ Parma_Polyhedra_Library::Linear_Expression& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Linear_Expression.defs.hh line 443
+
+// Automatically generated from PPL source file ../src/Constraint.defs.hh line 1
+/* Constraint class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Constraint.defs.hh line 33
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+//! 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);
+
+//! Returns the constraint \p e1 = \p e2.
+/*! \relates Constraint */
+Constraint
+operator==(const Linear_Expression& e1, const Linear_Expression& e2);
+//! 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 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 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 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 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);
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Constraint */
+void swap(Parma_Polyhedra_Library::Constraint& x,
+ Parma_Polyhedra_Library::Constraint& y);
+
+} // namespace std
+
+//! 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 (int i = c1.space_dimension() - 1; i >= 0; i--)
+ 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 : private Linear_Row {
+public:
+ //! Ordinary copy-constructor.
+ Constraint(const Constraint& c);
+
+ //! Destructor.
+ ~Constraint();
+
+ //! 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;
+
+ //! 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
+ };
+
+ //! 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;
+
+ //! 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;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void swap(Constraint& y);
+
+private:
+ friend class Parma_Polyhedra_Library::Congruence;
+ friend class Parma_Polyhedra_Library::Scalar_Products;
+ friend class Parma_Polyhedra_Library::Topology_Adjusted_Scalar_Product_Sign;
+ friend class Parma_Polyhedra_Library::Constraint_System;
+ friend class Parma_Polyhedra_Library::Constraint_System::const_iterator;
+ // FIXME: the following friend declaration should be avoided.
+ friend class Parma_Polyhedra_Library::Polyhedron;
+
+ friend
+ Parma_Polyhedra_Library
+ ::Linear_Expression::Linear_Expression(const Constraint& c);
+
+ //! Default constructor: private and not implemented.
+ Constraint();
+
+ /*! \brief
+ Builds a constraint of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+ */
+ Constraint(Linear_Expression& e, Type type, Topology topology);
+
+ /*! \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;
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator==(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator==(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator==(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator>=(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>=(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>=(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator<=(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<=(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<=(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator>(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator>(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ friend Constraint
+ Parma_Polyhedra_Library::operator<(const Linear_Expression& e1,
+ const Linear_Expression& e2);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<(const Linear_Expression& e,
+ Coefficient_traits::const_reference n);
+ friend Constraint
+ Parma_Polyhedra_Library::operator<(Coefficient_traits::const_reference n,
+ const Linear_Expression& e);
+
+ //! Copy-constructor with given size.
+ Constraint(const Constraint& c, dimension_type sz);
+
+ /*! \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();
+
+ //! 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();
+
+ //! 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();
+};
+
+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
+
+} // 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 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint::Constraint(Linear_Expression& e, Type type, Topology topology) {
+ assert(type != STRICT_INEQUALITY || topology == NOT_NECESSARILY_CLOSED);
+ Linear_Row::swap(e);
+ flags() = Flags(topology, (type == EQUALITY
+ ? LINE_OR_EQUALITY
+ : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Constraint::Constraint(const Constraint& c)
+ : Linear_Row(c) {
+}
+
+inline
+Constraint::Constraint(const Constraint& c, const dimension_type sz)
+ : Linear_Row(c, sz, sz) {
+}
+
+inline
+Constraint::~Constraint() {
+}
+
+inline Constraint&
+Constraint::operator=(const Constraint& c) {
+ Linear_Row::operator=(c);
+ return *this;
+}
+
+inline dimension_type
+Constraint::max_space_dimension() {
+ return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Constraint::space_dimension() const {
+ return Linear_Row::space_dimension();
+}
+
+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;
+ else
+ return ((*this)[size() - 1] < 0)
+ ? STRICT_INEQUALITY
+ : 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 Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Constraint::inhomogeneous_term() const {
+ return Linear_Row::inhomogeneous_term();
+}
+
+inline memory_size_type
+Constraint::external_memory_in_bytes() const {
+ return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint::total_memory_in_bytes() const {
+ return Linear_Row::total_memory_in_bytes();
+}
+
+/*! \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 - e2;
+ Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.strong_normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff = e1 - e2;
+ Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e1, const Linear_Expression& e2) {
+ Linear_Expression diff;
+ // Setting the epsilon coefficient to -1.
+ // NOTE: this also enforces normalization.
+ const dimension_type e1_dim = e1.space_dimension();
+ const dimension_type e2_dim = e2.space_dimension();
+ if (e1_dim > e2_dim)
+ diff -= Variable(e1_dim);
+ else
+ diff -= Variable(e2_dim);
+ diff += e1;
+ diff -= e2;
+
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff = n - e;
+ Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.strong_normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff = n - e;
+ Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(Coefficient_traits::const_reference n, const Linear_Expression& e) {
+ Linear_Expression diff;
+ // Setting the epsilon coefficient to -1.
+ // NOTE: this also enforces normalization.
+ diff -= Variable(e.space_dimension());
+ diff += n;
+ diff -= e;
+
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator==(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff = e - n;
+ Constraint c(diff, Constraint::EQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.strong_normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>=(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff = e - n;
+ Constraint c(diff, Constraint::NONSTRICT_INEQUALITY, NECESSARILY_CLOSED);
+ // Enforce normalization.
+ c.normalize();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator>(const Linear_Expression& e, Coefficient_traits::const_reference n) {
+ Linear_Expression diff;
+ // Setting the epsilon coefficient to -1.
+ // NOTE: this also enforces normalization.
+ diff -= Variable(e.space_dimension());
+ diff += e;
+ diff -= n;
+
+ Constraint c(diff, Constraint::STRICT_INEQUALITY, NOT_NECESSARILY_CLOSED);
+ c.set_not_necessarily_closed();
+ c.set_is_inequality();
+ return c;
+}
+
+/*! \relates Constraint */
+inline Constraint
+operator<=(const Linear_Expression& e1, const Linear_Expression& e2) {
+ return e2 >= e1;
+}
+
+/*! \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<(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() {
+ static const Constraint zdf(Linear_Expression::zero() == Coefficient_one());
+ return zdf;
+}
+
+inline const Constraint&
+Constraint::zero_dim_positivity() {
+ static const Constraint zdp(Linear_Expression::zero() <= Coefficient_one());
+ return zdp;
+}
+
+inline const Constraint&
+Constraint::epsilon_geq_zero() {
+ static const Constraint eps_geq_zero = construct_epsilon_geq_zero();
+ return eps_geq_zero;
+}
+
+inline const Constraint&
+Constraint::epsilon_leq_one() {
+ static const Constraint
+ eps_leq_one(Linear_Expression::zero() < Coefficient_one());
+ return eps_leq_one;
+}
+
+inline void
+Constraint::ascii_dump(std::ostream& s) const {
+ Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Constraint::ascii_load(std::istream& s) {
+ return Linear_Row::ascii_load(s);
+}
+
+inline void
+Constraint::swap(Constraint& y) {
+ Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint */
+inline void
+swap(Parma_Polyhedra_Library::Constraint& x,
+ Parma_Polyhedra_Library::Constraint& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Constraint.defs.hh line 488
+
+// 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 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Constraint_System::Constraint_System()
+ : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint& c)
+ : Linear_System(c.topology()) {
+ Linear_System::insert(c);
+}
+
+inline
+Constraint_System::Constraint_System(const Constraint_System& cs)
+ : Linear_System(cs) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol)
+ : Linear_System(topol) {
+}
+
+inline
+Constraint_System::Constraint_System(const Topology topol,
+ const dimension_type n_rows,
+ const dimension_type n_columns)
+ : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Constraint_System::~Constraint_System() {
+}
+
+inline Constraint_System&
+Constraint_System::operator=(const Constraint_System& y) {
+ Linear_System::operator=(y);
+ return *this;
+}
+
+inline Constraint&
+Constraint_System::operator[](const dimension_type k) {
+ return static_cast<Constraint&>(Linear_System::operator[](k));
+}
+
+inline const Constraint&
+Constraint_System::operator[](const dimension_type k) const {
+ return static_cast<const Constraint&>(Linear_System::operator[](k));
+}
+
+inline dimension_type
+Constraint_System::max_space_dimension() {
+ return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Constraint_System::space_dimension() const {
+ return Linear_System::space_dimension();
+}
+
+inline void
+Constraint_System::clear() {
+ Linear_System::clear();
+}
+
+inline const Constraint_System&
+Constraint_System::zero_dim_empty() {
+ static const Constraint_System zdf(Constraint::zero_dim_false());
+ return zdf;
+}
+
+inline
+Constraint_System::const_iterator::const_iterator()
+ : i(), csp(0) {
+}
+
+inline
+Constraint_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i), csp(y.csp) {
+}
+
+inline
+Constraint_System::const_iterator::~const_iterator() {
+}
+
+inline Constraint_System::const_iterator&
+Constraint_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ csp = y.csp;
+ return *this;
+}
+
+inline const Constraint&
+Constraint_System::const_iterator::operator*() const {
+ return static_cast<const Constraint&>(*i);
+}
+
+inline const Constraint*
+Constraint_System::const_iterator::operator->() const {
+ return static_cast<const Constraint*>(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 const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Constraint_System::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Constraint_System::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Constraint_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+ const Constraint_System& csys)
+ : i(iter), csp(&csys) {
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::begin() const {
+ const_iterator i(Linear_System::begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Constraint_System::const_iterator
+Constraint_System::end() const {
+ const const_iterator i(Linear_System::end(), *this);
+ return i;
+}
+
+inline void
+Constraint_System::add_low_level_constraints() {
+ if (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::swap(Constraint_System& y) {
+ Linear_System::swap(y);
+}
+
+inline memory_size_type
+Constraint_System::external_memory_in_bytes() const {
+ return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Constraint_System::total_memory_in_bytes() const {
+ return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Constraint_System::simplify() {
+ Linear_System::simplify();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Constraint_System& x,
+ Parma_Polyhedra_Library::Constraint_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Generator.defs.hh line 1
+/* Generator class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Generator.defs.hh line 37
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put them in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Generator */
+std::ostream& operator<<(std::ostream& s, const Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Generator */
+void swap(Parma_Polyhedra_Library::Generator& x,
+ Parma_Polyhedra_Library::Generator& y);
+
+} // namespace std
+
+
+//! 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 (int i = g1.space_dimension() - 1; i >= 0; i--)
+ 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 : private Linear_Row {
+public:
+ //! 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);
+
+ //! 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);
+
+ //! 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());
+
+ //! 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());
+
+ //! Ordinary copy-constructor.
+ Generator(const Generator& g);
+
+ //! Destructor.
+ ~Generator();
+
+ //! Assignment operator.
+ Generator& operator=(const Generator& g);
+
+ //! 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;
+
+ //! 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 // 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;
+
+ //! 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;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void swap(Generator& y);
+
+private:
+ /*! \brief
+ Builds a generator of type \p type and topology \p topology,
+ stealing the coefficients from \p e.
+ */
+ Generator(Linear_Expression& e, Type type, Topology topology);
+
+ /*! \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,
+ 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 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;
+ friend class Parma_Polyhedra_Library::Grid_Generator;
+ // This is for access to Row and Linear_Row in `insert'.
+ friend class Parma_Polyhedra_Library::Grid_Generator_System;
+
+ friend
+ Parma_Polyhedra_Library
+ ::Linear_Expression::Linear_Expression(const Generator& g);
+
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const Generator& g);
+
+ //! Copy-constructor with given space dimension.
+ Generator(const Generator& g, dimension_type dimension);
+
+ //! Returns <CODE>true</CODE> if and only if \p *this is not a line.
+ bool is_ray_or_point() const;
+
+ //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Linear_Row 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;
+
+ //! Default constructor: private and not implemented.
+ Generator();
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Shorthand for Generator Generator::line(const Linear_Expression& e).
+/*! \relates Generator */
+Generator line(const Linear_Expression& e);
+
+//! Shorthand for Generator Generator::ray(const Linear_Expression& e).
+/*! \relates Generator */
+Generator ray(const Linear_Expression& e);
+
+/*! \brief
+ Shorthand for Generator
+ Generator::point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+ \relates Generator
+*/
+Generator
+point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+ Shorthand for Generator
+ Generator::closure_point(const Linear_Expression& e, Coefficient_traits::const_reference d).
+
+ \relates Generator
+*/
+Generator
+closure_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+//! 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);
+
+
+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
+Generator::Generator(Linear_Expression& e, Type type, Topology topology) {
+ assert(type != CLOSURE_POINT || topology == NOT_NECESSARILY_CLOSED);
+ Linear_Row::swap(e);
+ flags() = Flags(topology, (type == LINE
+ ? LINE_OR_EQUALITY
+ : RAY_OR_POINT_OR_INEQUALITY));
+}
+
+inline
+Generator::Generator(const Generator& g)
+ : Linear_Row(g) {
+}
+
+inline
+Generator::Generator(const Generator& g, dimension_type dimension)
+ : Linear_Row(g, dimension, dimension) {
+}
+
+inline
+Generator::~Generator() {
+}
+
+inline Generator&
+Generator::operator=(const Generator& g) {
+ Linear_Row::operator=(g);
+ return *this;
+}
+
+inline dimension_type
+Generator::max_space_dimension() {
+ return Linear_Row::max_space_dimension();
+}
+
+inline dimension_type
+Generator::space_dimension() const {
+ return Linear_Row::space_dimension();
+}
+
+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 (*this)[0] == 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.
+ const Generator& g = *this;
+ return (g[size() - 1] == 0) ? CLOSURE_POINT : 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 Linear_Row::coefficient(v.id());
+}
+
+inline Coefficient_traits::const_reference
+Generator::divisor() const {
+ Coefficient_traits::const_reference d = Linear_Row::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 memory_size_type
+Generator::external_memory_in_bytes() const {
+ return Linear_Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator::total_memory_in_bytes() const {
+ return Linear_Row::total_memory_in_bytes();
+}
+
+inline const Generator&
+Generator::zero_dim_point() {
+ static const Generator zdp = point();
+ return zdp;
+}
+
+inline const Generator&
+Generator::zero_dim_closure_point() {
+ static const Generator zdcp = closure_point();
+ return zdcp;
+}
+
+/*! \relates Generator */
+inline Generator
+line(const Linear_Expression& e) {
+ return Generator::line(e);
+}
+
+/*! \relates Generator */
+inline Generator
+ray(const Linear_Expression& e) {
+ return Generator::ray(e);
+}
+
+/*! \relates Generator */
+inline Generator
+point(const Linear_Expression& e, Coefficient_traits::const_reference d) {
+ return Generator::point(e, d);
+}
+
+/*! \relates Generator */
+inline Generator
+closure_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ return Generator::closure_point(e, d);
+}
+
+/*! \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 {
+ Linear_Row::ascii_dump(s);
+}
+
+inline bool
+Generator::ascii_load(std::istream& s) {
+ return Linear_Row::ascii_load(s);
+}
+
+inline void
+Generator::swap(Generator& y) {
+ Linear_Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Generator */
+inline void
+swap(Parma_Polyhedra_Library::Generator& x,
+ Parma_Polyhedra_Library::Generator& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Generator.defs.hh line 507
+
+// Automatically generated from PPL source file ../src/Grid_Generator.inlines.hh line 1
+/* Grid Generator class implementation: inline functions.
+*/
+
+
+// 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 30
+#include <iosfwd>
+
+namespace Parma_Polyhedra_Library {
+
+// Put these in the namespace here to declare them friend later.
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+std::ostream& operator<<(std::ostream& s, const Grid_Generator& g);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+void swap(Parma_Polyhedra_Library::Grid_Generator& x,
+ Parma_Polyhedra_Library::Grid_Generator& y);
+
+} // namespace std
+
+//! A line, parameter or point.
+/*! \ingroup PPL_CXX_interface
+ An object of the class Grid_Generator is one of the following:
+
+ - a 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 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 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>line</CODE>, <CODE>parameter</CODE> or <CODE>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 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 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 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 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 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 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 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 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 << "Point g1: " << g1 << endl;
+ Linear_Expression e;
+ for (int i = g1.space_dimension() - 1; i >= 0; i--)
+ 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 point." << endl;
+ \endcode
+ Therefore, for the point
+ \code
+ Grid_Generator g1 = grid_point(2*x - y + 3*z, 2);
+ \endcode
+ we would obtain the following output:
+ \code
+ Point g1: p((2*A - B + 3*C)/2)
+ Parameter g2: parameter((2*A - 2*B + 9*C)/2)
+ \endcode
+ When working with 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 : private Generator {
+public:
+ // FIXME: Add wrappers of any other public Generator methods.
+
+ //! Returns the dimension of the vector space enclosing \p *this.
+ dimension_type space_dimension() const;
+
+ //! The generator type.
+ enum Type {
+ /*! The generator is a line. */
+ LINE,
+ /*! The generator is a parameter. */
+ PARAMETER,
+ /*! The generator is a 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 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 line(const Linear_Expression& e);
+
+ //! Returns the parameter at \p 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());
+
+ //! 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 point(const Linear_Expression& e
+ = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d
+ = Coefficient_one());
+
+ //! Assignment operator.
+ Grid_Generator& operator=(const Grid_Generator& g);
+
+ //! Assignment operator.
+ Grid_Generator& operator=(const Generator& g);
+
+ //! Returns the divisor of \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ Coefficient_traits::const_reference divisor() 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 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 exactly equal to \p y.
+ 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;
+
+ /*! \brief
+ Scales \p *this to be represented with a divisor of \p d (if
+ \*this is a parameter or point).
+
+ \exception std::invalid_argument
+ Thrown if \p d is zero.
+ */
+ void scale_to_divisor(Coefficient_traits::const_reference d);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //! Swaps \p *this with \p y.
+ void swap(Grid_Generator& y);
+
+ /*! \brief
+ Swaps \p *this with \p y, leaving \p *this with the original
+ capacity.
+
+ All up to and including the last element of the smaller of \p
+ *this and \p y are swapped. The parameter divisor element of \p y
+ is swapped with the divisor element of \p *this.
+ */
+ void coefficient_swap(Grid_Generator& y);
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+private:
+ /*! \brief
+ Constructs from polyhedron generator \p g, stealing the underlying
+ data structures from \p g.
+
+ The last column in \p g becomes the parameter divisor column of
+ the new Grid_Generator.
+ */
+ explicit Grid_Generator(Generator g);
+
+ //! Returns the actual size of \p this.
+ dimension_type size() const;
+
+ //! Negates the elements from index \p start to index \p end.
+ void negate(dimension_type start, dimension_type end);
+
+ //! Returns the divisor of \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this is a line.
+ */
+ Coefficient& divisor();
+
+ //! Sets the Linear_Row kind to <CODE>LINE_OR_EQUALITY</CODE>.
+ void set_is_line();
+
+ //! Sets the Linear_Row kind to <CODE>RAY_OR_POINT_OR_INEQUALITY</CODE>.
+ void set_is_parameter_or_point();
+
+ /*! \brief
+ Strong normalization: ensures that different Grid_Generator
+ objects represent different hyperplanes or hyperspaces.
+
+ Applies both Linear_Row::normalize() and Linear_Row::sign_normalize().
+
+ This is simply a wrapper around the Generator::strong_normalize,
+ which means applying it to a parameter may change the parameter.
+ */
+ void strong_normalize();
+
+ //! 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;
+
+ /*! \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);
+ // FIXME: The following friend declaration is for operator[] and
+ // divisor() access in Grid::conversion and Grid::simplify.
+ friend class Grid;
+
+ friend class Grid_Generator_System;
+ friend class Grid_Generator_System::const_iterator;
+ friend class Congruence_System;
+ friend class Scalar_Products;
+ friend class Topology_Adjusted_Scalar_Product_Sign;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Shorthand for Grid_Generator
+ Grid_Generator::line(const Linear_Expression& e).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator grid_line(const Linear_Expression& e);
+
+/*! \brief
+ Shorthand for Grid_Generator
+ Grid_Generator::parameter(const Linear_Expression& e,
+ Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+parameter(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+/*! \brief
+ Shorthand for Grid_Generator
+ Grid_Generator::point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d).
+*/
+/*! \relates Grid_Generator */
+Grid_Generator
+grid_point(const Linear_Expression& e = Linear_Expression::zero(),
+ Coefficient_traits::const_reference d = Coefficient_one());
+
+//! 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.defs.hh line 492
+
+// Automatically generated from PPL source file ../src/Grid_Generator.inlines.hh line 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Grid_Generator::Grid_Generator(Generator g)
+ : Generator(Generator::point()) {
+ Generator::swap(g);
+}
+
+inline dimension_type
+Grid_Generator::space_dimension() const {
+ return Generator::space_dimension() - 1;
+}
+
+inline Grid_Generator::Type
+Grid_Generator::type() const {
+ switch (Generator::type()) {
+ case Generator::POINT:
+ return POINT;
+ case Generator::RAY:
+ return PARAMETER;
+ case Generator::LINE:
+ return LINE;
+ case Generator::CLOSURE_POINT:
+ default:
+ assert(false);
+ return POINT;
+ }
+}
+
+inline bool
+Grid_Generator::is_line() const {
+ return Generator::is_line();
+}
+
+inline bool
+Grid_Generator::is_parameter() const {
+ return is_ray();
+}
+
+inline bool
+Grid_Generator::is_line_or_parameter() const {
+ return is_line_or_ray();
+}
+
+inline bool
+Grid_Generator::is_point() const {
+ return Generator::is_point();
+}
+
+inline bool
+Grid_Generator::is_parameter_or_point() const {
+ return is_ray_or_point_or_inequality();
+}
+
+inline void
+Grid_Generator::set_is_line() {
+ Generator::set_is_line();
+}
+
+inline void
+Grid_Generator::set_is_parameter_or_point() {
+ Generator::set_is_ray_or_point();
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Grid_Generator& g) {
+ Generator::operator=(g);
+ return *this;
+}
+
+inline Grid_Generator&
+Grid_Generator::operator=(const Generator& g) {
+ Generator::operator=(g);
+ return *this;
+}
+
+inline void
+Grid_Generator::negate(dimension_type start, dimension_type end) {
+ while (start <= end)
+ neg_assign(operator[](start++));
+}
+
+inline Coefficient&
+Grid_Generator::divisor() {
+ if (is_line())
+ throw_invalid_argument("divisor()", "*this is a line");
+ if (is_line_or_parameter())
+ return Generator::operator[](size() - 1);
+ return Generator::operator[](0);
+}
+
+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 Generator::operator[](size() - 1);
+ return Generator::operator[](0);
+}
+
+inline memory_size_type
+Grid_Generator::total_memory_in_bytes() const {
+ return Generator::total_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator::external_memory_in_bytes() const {
+ return Generator::external_memory_in_bytes();
+}
+
+inline void
+Grid_Generator::strong_normalize() {
+ Generator::strong_normalize();
+}
+
+inline dimension_type
+Grid_Generator::size() const {
+ return Generator::size();
+}
+
+inline void
+Grid_Generator::swap(Grid_Generator& y) {
+ Generator::swap(y);
+}
+
+inline void
+Grid_Generator::ascii_dump(std::ostream& s) const {
+ Generator::ascii_dump(s);
+}
+
+inline bool
+Grid_Generator::ascii_load(std::istream& s) {
+ return Generator::ascii_load(s);
+}
+
+inline Coefficient&
+Grid_Generator::operator[](dimension_type k) {
+ return Generator::operator[](k);
+}
+
+inline Coefficient_traits::const_reference
+Grid_Generator::operator[](dimension_type k) const {
+ return Generator::operator[](k);
+}
+
+/*! \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) {
+ return Grid_Generator::line(e);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+parameter(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ return Grid_Generator::parameter(e, d);
+}
+
+/*! \relates Grid_Generator */
+inline Grid_Generator
+grid_point(const Linear_Expression& e,
+ Coefficient_traits::const_reference d) {
+ return Grid_Generator::point(e, d);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Grid_Generator */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator& x,
+ Parma_Polyhedra_Library::Grid_Generator& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// 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 36
+#include <iosfwd>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace Parma_Polyhedra_Library {
+
+namespace IO_Operators {
+
+//! Output operators.
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+std::ostream&
+operator<<(std::ostream& s, const Congruence& c);
+
+// Put this in the namespace here to declare it a friend later.
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+std::ostream&
+operator<<(std::ostream& s, const Congruence_System& cgs);
+
+
+} // namespace IO_Operators
+
+// Put these in the namespace here to declare them friend later.
+
+//! 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);
+
+//! 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,
+ const 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,
+ const Coefficient_traits::const_reference k);
+
+//! Creates a congruence from \p c, with \p m as the modulus.
+/*! \relates Congruence */
+Congruence
+operator/(const Constraint& c,
+ const Coefficient_traits::const_reference m);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Congruence */
+void
+swap(Parma_Polyhedra_Library::Congruence& x,
+ Parma_Polyhedra_Library::Congruence& y);
+
+} // namespace std
+
+//! 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;
+ Coefficient m = cg1.modulus();
+ if (m == 0)
+ cout << "Congruence cg1 is an equality." << endl;
+ else {
+ Linear_Expression e;
+ for (int i = cg1.space_dimension() - 1; i >= 0; --i)
+ 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 : private Row {
+public:
+ //! Ordinary copy-constructor.
+ Congruence(const Congruence& cg);
+
+ //! Copy-constructs (modulo 0) from equality constraint \p c.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p c is a relation.
+ */
+ explicit Congruence(const Constraint& c);
+
+ //! Destructor.
+ ~Congruence();
+
+ //! Assignment operator.
+ Congruence& operator=(const Congruence& cg);
+
+ //! 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;
+
+ //! 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;
+
+ //! 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/=(const Coefficient_traits::const_reference k);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a trivially
+ true congruence.
+
+ Trivially true congruences are of 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 n is the space dimension and m is the modulus.
+ */
+ bool is_trivial_true() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is a trivially
+ false congruence.
+
+ Trivially false congruences have 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 congruence: \f$\sum_{i=0}^{n-1} 0 x_i + b \%= 0 / m\f$,
+ where \f$b \neq 0 \pmod{m}\f$.
+ */
+ bool is_trivial_false() 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;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if \p *this is equal to \p cg in
+ dimension \p dim.
+ */
+ bool is_equal_at_dimension(dimension_type dim,
+ const Congruence& cg) const;
+
+ /*! \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();
+
+ /*! \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;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation of the internal
+ representation of \p *this.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+protected:
+
+ //! 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 their syntaxes (as output by operator<<) are equal.
+ */
+ void strong_normalize();
+
+private:
+
+ //! Returns a reference to the modulus of \p *this.
+ Coefficient& modulus();
+
+ //! Marks this congruence as a linear equality.
+ void set_is_equality();
+
+ //! Negates the elements from index \p start to index \p end.
+ void negate(dimension_type start, dimension_type end);
+
+ //! Default constructor: private and not implemented.
+ Congruence();
+
+ //! Copy-constructs with specified size and capacity.
+ Congruence(const Congruence& cg,
+ dimension_type sz,
+ dimension_type capacity);
+
+ //! Constructs from a constraint, with specified size and capacity.
+ Congruence(const Constraint& c,
+ dimension_type sz,
+ dimension_type capacity);
+
+ //! Copy-constructs from \p cg, multiplying \p k into the 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$.
+ */
+ Congruence(const Congruence& cg, Coefficient_traits::const_reference k);
+
+ //! Constructs from Linear_Expression \p le, using modulus \p m.
+ /*!
+ Builds a congruence with modulus \p m, stealing the coefficients
+ from \p le.
+
+ \param le
+ The Linear_Expression holding the coefficients.
+
+ \param m
+ The modulus for the congruence.
+
+ \param capacity
+ If <CODE>true</CODE> then the size of the \p le row is expanded
+ and the modulus is stored in the extra space. In this case it is
+ assumed that \p le has spare capacity of at least one element.
+ If <CODE>false</CODE> then the modulus is stored in the last
+ element of the \p le row.
+ */
+ Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m,
+ bool capacity = true);
+
+ //! Swaps \p *this with \p y.
+ void swap(Congruence& y);
+
+ /*! \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 Congruence
+ PPL::operator%=(const Linear_Expression& e1, const Linear_Expression& e2);
+
+ friend Congruence
+ PPL::operator%=(const Linear_Expression& e,
+ const Coefficient_traits::const_reference n);
+
+ friend Congruence
+ PPL::operator/(const Congruence& cg,
+ const Coefficient_traits::const_reference k);
+
+ friend Congruence
+ PPL::operator/(const Constraint& c,
+ const Coefficient_traits::const_reference m);
+
+ friend bool
+ PPL::operator==(const Congruence& x, const Congruence& y);
+
+ friend bool
+ PPL::operator!=(const Congruence& x, const Congruence& y);
+
+ friend std::ostream&
+ PPL::IO_Operators::operator<<(std::ostream& s,
+ const Congruence_System& cgs);
+
+ friend class PPL::Scalar_Products;
+ friend class PPL::Congruence_System;
+ friend class PPL::Congruence_System::const_iterator;
+ // FIXME: The following friend declaration is at least for
+ // operator[] access in Grid::conversion.
+ friend class PPL::Grid;
+ friend class PPL::Linear_Expression;
+
+ friend void
+ std::swap(PPL::Congruence& x, PPL::Congruence& y);
+};
+
+// Automatically generated from PPL source file ../src/Congruence.inlines.hh line 1
+/* Congruence class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Congruence.inlines.hh line 28
+
+#include <sstream>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence::Congruence(const Congruence& cg)
+ : Row(cg) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ dimension_type sz, dimension_type capacity)
+ : Row(cg, sz, capacity) {
+}
+
+inline
+Congruence::Congruence(const Congruence& cg,
+ Coefficient_traits::const_reference k)
+ : Row(cg) {
+ if (k >= 0)
+ (*this)[size()-1] *= k;
+ else
+ (*this)[size()-1] *= -k;
+}
+
+inline
+Congruence::~Congruence() {
+}
+
+inline const Congruence&
+Congruence::zero_dim_integrality() {
+ static const Congruence zdi(Linear_Expression::zero() %= Coefficient(-1));
+ return zdi;
+}
+
+inline const Congruence&
+Congruence::zero_dim_false() {
+ static const Congruence
+ zdf((Linear_Expression::zero() %= Coefficient_one()) / 0);
+ return zdf;
+}
+
+inline Congruence&
+Congruence::operator=(const Congruence& c) {
+ Row::operator=(c);
+ return *this;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator%=(const Linear_Expression& e,
+ const Coefficient_traits::const_reference n) {
+ // Ensure that diff has capacity for the modulus.
+ Linear_Expression diff(e, e.space_dimension() + 2);
+ diff -= n;
+ Congruence cg(diff, 1, false);
+ return cg;
+}
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline Congruence
+operator/(const Congruence& cg,
+ const Coefficient_traits::const_reference k) {
+ Congruence ret (cg, k);
+ return ret;
+}
+
+/*! \relates Congruence */
+inline Congruence
+operator/(const Constraint& c,
+ const Coefficient_traits::const_reference m) {
+ Congruence ret (c);
+ return ret / m;
+}
+
+inline Congruence&
+Congruence::operator/=(const Coefficient_traits::const_reference k) {
+ if (k >= 0)
+ (*this)[size()-1] *= k;
+ else
+ (*this)[size()-1] *= -k;
+ return *this;
+}
+
+/*! \relates Congruence */
+inline bool
+operator==(const Congruence& x, const Congruence& y) {
+ Congruence x_temp(x);
+ Congruence y_temp(y);
+ x_temp.strong_normalize();
+ y_temp.strong_normalize();
+ return static_cast<const Row&>(x_temp) == static_cast<const Row&>(y_temp);
+}
+
+/*! \relates Congruence */
+inline bool
+operator!=(const Congruence& x, const Congruence& y) {
+ return !(x == y);
+}
+
+inline dimension_type
+Congruence::max_space_dimension() {
+ // The first coefficient holds the inhomogeneous term, while
+ // the last coefficient is for the modulus.
+ return max_size() - 2;
+}
+
+inline dimension_type
+Congruence::space_dimension() const {
+ return size() - 2;
+}
+
+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 (*this)[v.id()+1];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::inhomogeneous_term() const {
+ return (*this)[0];
+}
+
+inline Coefficient_traits::const_reference
+Congruence::modulus() const {
+ assert(size() > 0);
+ return (*this)[size()-1];
+}
+
+inline Coefficient&
+Congruence::modulus() {
+ assert(size() > 0);
+ return (*this)[size()-1];
+}
+
+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(dimension_type dim,
+ const Congruence& cg) const {
+ return operator[](dim) * cg.modulus() == cg[dim] * modulus();
+}
+
+inline void
+Congruence::set_is_equality() {
+ modulus() = 0;
+}
+
+inline void
+Congruence::negate(dimension_type start, dimension_type end) {
+ while (start <= end)
+ neg_assign(operator[](start++));
+}
+
+inline memory_size_type
+Congruence::external_memory_in_bytes() const {
+ return Row::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence::total_memory_in_bytes() const {
+ return Row::total_memory_in_bytes();
+}
+
+inline
+Congruence::Congruence(Linear_Expression& le,
+ Coefficient_traits::const_reference m,
+ bool capacity) {
+ Row::swap(static_cast<Row&>(le));
+ if (capacity)
+ Row::expand_within_capacity(size()+1);
+ if (m >= 0)
+ (*this)[size()-1] = m;
+ else
+ (*this)[size()-1] = -m;
+}
+
+inline void
+Congruence::swap(Congruence& y) {
+ Row::swap(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence */
+inline void
+swap(Parma_Polyhedra_Library::Congruence& x,
+ Parma_Polyhedra_Library::Congruence& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Congruence.defs.hh line 473
+
+// 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 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Generator_System::Generator_System()
+ : Linear_System(NECESSARILY_CLOSED) {
+}
+
+inline
+Generator_System::Generator_System(const Generator& g)
+ : Linear_System(g.topology()) {
+ Linear_System::insert(g);
+}
+
+inline
+Generator_System::Generator_System(const Generator_System& gs)
+ : Linear_System(gs) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol)
+ : Linear_System(topol) {
+}
+
+inline
+Generator_System::Generator_System(const Topology topol,
+ const dimension_type n_rows,
+ const dimension_type n_columns)
+ : Linear_System(topol, n_rows, n_columns) {
+}
+
+inline
+Generator_System::~Generator_System() {
+}
+
+inline Generator_System&
+Generator_System::operator=(const Generator_System& y) {
+ Linear_System::operator=(y);
+ return *this;
+}
+
+inline dimension_type
+Generator_System::max_space_dimension() {
+ return Linear_System::max_space_dimension();
+}
+
+inline dimension_type
+Generator_System::space_dimension() const {
+ return Linear_System::space_dimension();
+}
+
+inline void
+Generator_System::clear() {
+ Linear_System::clear();
+}
+
+inline Generator&
+Generator_System::operator[](const dimension_type k) {
+ return static_cast<Generator&>(Linear_System::operator[](k));
+}
+
+inline const Generator&
+Generator_System::operator[](const dimension_type k) const {
+ return static_cast<const Generator&>(Linear_System::operator[](k));
+}
+
+inline
+Generator_System::const_iterator::const_iterator()
+ : i(), gsp(0) {
+}
+
+inline
+Generator_System::const_iterator::const_iterator(const const_iterator& y)
+ : i(y.i), gsp(y.gsp) {
+}
+
+inline
+Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Generator_System::const_iterator&
+Generator_System::const_iterator::operator=(const const_iterator& y) {
+ i = y.i;
+ gsp = y.gsp;
+ return *this;
+}
+
+inline const Generator&
+Generator_System::const_iterator::operator*() const {
+ return static_cast<const Generator&>(*i);
+}
+
+inline const Generator*
+Generator_System::const_iterator::operator->() const {
+ return static_cast<const Generator*>(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 const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+inline bool
+Generator_System::const_iterator::operator==(const const_iterator& y) const {
+ return i == y.i;
+}
+
+inline bool
+Generator_System::const_iterator::operator!=(const const_iterator& y) const {
+ return i != y.i;
+}
+
+inline
+Generator_System::const_iterator::
+const_iterator(const Linear_System::const_iterator& iter,
+ const Generator_System& gsys)
+ : i(iter), gsp(&gsys) {
+}
+
+inline Generator_System::const_iterator
+Generator_System::begin() const {
+ const_iterator i(Linear_System::begin(), *this);
+ if (!is_necessarily_closed())
+ i.skip_forward();
+ return i;
+}
+
+inline Generator_System::const_iterator
+Generator_System::end() const {
+ const const_iterator i(Linear_System::end(), *this);
+ return i;
+}
+
+inline const Generator_System&
+Generator_System::zero_dim_univ() {
+ static const Generator_System zdu(Generator::zero_dim_point());
+ return zdu;
+}
+
+inline void
+Generator_System::swap(Generator_System& y) {
+ Linear_System::swap(y);
+}
+
+inline memory_size_type
+Generator_System::external_memory_in_bytes() const {
+ return Linear_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Generator_System::total_memory_in_bytes() const {
+ return Linear_System::total_memory_in_bytes();
+}
+
+inline void
+Generator_System::simplify() {
+ Linear_System::simplify();
+ remove_invalid_lines_and_rays();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Generator_System& x,
+ Parma_Polyhedra_Library::Generator_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// 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
+Grid_Generator_System::Grid_Generator_System()
+ : Generator_System(NECESSARILY_CLOSED) {
+ adjust_topology_and_space_dimension(NECESSARILY_CLOSED, 1);
+ set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator_System& gs)
+ : Generator_System(gs) {
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(dimension_type dim)
+ : Generator_System(NECESSARILY_CLOSED) {
+ adjust_topology_and_space_dimension(NECESSARILY_CLOSED, dim + 1);
+ set_sorted(false);
+}
+
+inline
+Grid_Generator_System::Grid_Generator_System(const Grid_Generator& g)
+ : Generator_System(g) {
+ set_sorted(false);
+}
+
+inline dimension_type
+Grid_Generator_System::max_space_dimension() {
+ // Grid generators use an extra column for the parameter divisor.
+ return Generator_System::max_space_dimension() - 1;
+}
+
+inline dimension_type
+Grid_Generator_System::space_dimension() const {
+ assert(Generator_System::space_dimension() > 0);
+ // Grid generators use an extra column for the parameter divisor.
+ return Generator_System::space_dimension() - 1;
+}
+
+inline void
+Grid_Generator_System::clear() {
+ Generator_System::clear();
+ // For grid generators, two extra columns are needed.
+ add_zero_columns(2);
+ set_sorted(false);
+ unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::swap(Grid_Generator_System& y) {
+ Generator_System::swap(y);
+}
+
+inline memory_size_type
+Grid_Generator_System::external_memory_in_bytes() const {
+ return Generator_System::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Grid_Generator_System::total_memory_in_bytes() const {
+ return Generator_System::total_memory_in_bytes();
+}
+
+inline dimension_type
+Grid_Generator_System::num_generators() const {
+ return Generator_System::num_rows();
+}
+
+inline dimension_type
+Grid_Generator_System::num_parameters() const {
+ return Generator_System::num_rays();
+}
+
+inline dimension_type
+Grid_Generator_System::num_lines() const {
+ return Generator_System::num_lines();
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator()
+ : Generator_System::const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator::const_iterator(const const_iterator& y)
+ : Generator_System::const_iterator(y) {
+}
+
+inline
+Grid_Generator_System::const_iterator::~const_iterator() {
+}
+
+inline
+Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator=(const const_iterator& y) {
+ return static_cast<Grid_Generator_System::const_iterator&>
+ (Generator_System::const_iterator::operator=(y));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::const_iterator::operator*() const {
+ return static_cast<const Grid_Generator&>
+ (Generator_System::const_iterator::operator*());
+}
+
+inline const Grid_Generator*
+Grid_Generator_System::const_iterator::operator->() const {
+ return static_cast<const Grid_Generator*>
+ (Generator_System::const_iterator::operator->());
+}
+
+inline Grid_Generator_System::const_iterator&
+Grid_Generator_System::const_iterator::operator++() {
+ return static_cast<Grid_Generator_System::const_iterator&>
+ (Generator_System::const_iterator::operator++());
+}
+
+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 Generator_System::const_iterator::operator==(y);
+}
+
+inline bool
+Grid_Generator_System
+::const_iterator::operator!=(const const_iterator& y) const {
+ return Generator_System::const_iterator::operator!=(y);
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::begin() const {
+ return static_cast<Grid_Generator_System::const_iterator>
+ (Generator_System::begin());
+}
+
+inline Grid_Generator_System::const_iterator
+Grid_Generator_System::end() const {
+ return static_cast<Grid_Generator_System::const_iterator>
+ (Generator_System::end());
+}
+
+inline
+Grid_Generator_System
+::const_iterator::const_iterator(const Generator_System::const_iterator& y)
+ : Generator_System::const_iterator::const_iterator(y) {
+}
+
+inline bool
+Grid_Generator_System::has_points() const {
+ return Generator_System::has_points();
+}
+
+inline Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) {
+ return static_cast<Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline const Grid_Generator&
+Grid_Generator_System::operator[](const dimension_type k) const {
+ return static_cast<const Grid_Generator&>(Generator_System::operator[](k));
+}
+
+inline void
+Grid_Generator_System::ascii_dump(std::ostream& s) const {
+ return Generator_System::ascii_dump(s);
+}
+
+inline void
+Grid_Generator_System::set_sorted(bool b) {
+ Generator_System::set_sorted(b);
+}
+
+inline void
+Grid_Generator_System::unset_pending_rows() {
+ Generator_System::unset_pending_rows();
+}
+
+inline void
+Grid_Generator_System::set_index_first_pending_row(const dimension_type i) {
+ Generator_System::set_index_first_pending_row(i);
+}
+
+inline void
+Grid_Generator_System::resize_no_copy(const dimension_type new_n_rows,
+ const dimension_type new_n_columns) {
+ Generator_System::resize_no_copy(new_n_rows, new_n_columns);
+}
+
+inline dimension_type
+Grid_Generator_System::num_columns() const {
+ return Generator_System::num_columns();
+}
+
+inline void
+Grid_Generator_System::erase_to_end(dimension_type first_to_erase) {
+ return Generator_System::erase_to_end(first_to_erase);
+}
+
+inline void
+Grid_Generator_System
+::permute_columns(const std::vector<dimension_type>& cycles) {
+ return Generator_System::permute_columns(cycles);
+}
+
+inline bool
+Grid_Generator_System::is_equal_to(const Grid_Generator_System y) const {
+ return operator==(static_cast<const Generator_System&>(*this),
+ static_cast<const Generator_System&>(y));
+}
+
+/*! \relates Grid_Generator_System */
+inline bool
+operator==(const Grid_Generator_System& x,
+ const Grid_Generator_System& y) {
+ return x.is_equal_to(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Constraint_System */
+inline void
+swap(Parma_Polyhedra_Library::Grid_Generator_System& x,
+ Parma_Polyhedra_Library::Grid_Generator_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// 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 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Congruence_System::Congruence_System()
+ : Matrix(0, 2) {
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence& cg)
+ : Matrix(0, 2) {
+ insert(cg);
+}
+
+inline
+Congruence_System::Congruence_System(const Constraint& c)
+ : Matrix(0, 2) {
+ insert(c);
+}
+
+inline
+Congruence_System::Congruence_System(const Congruence_System& cs)
+ : Matrix(cs) {
+}
+
+inline
+Congruence_System::~Congruence_System() {
+}
+
+inline Congruence_System&
+Congruence_System::operator=(const Congruence_System& y) {
+ Matrix::operator=(y);
+ return *this;
+}
+
+inline Congruence&
+Congruence_System::operator[](const dimension_type k) {
+ return static_cast<Congruence&>(Matrix::operator[](k));
+}
+
+inline const Congruence&
+Congruence_System::operator[](const dimension_type k) const {
+ return static_cast<const Congruence&>(Matrix::operator[](k));
+}
+
+inline dimension_type
+Congruence_System::max_space_dimension() {
+ return Matrix::max_num_columns() - 2;
+}
+
+inline dimension_type
+Congruence_System::space_dimension() const {
+ return Matrix::num_columns() - 2;
+}
+
+inline void
+Congruence_System::clear() {
+ Matrix::clear();
+ add_zero_columns(2); // Modulus and constant term.
+}
+
+inline void
+Congruence_System::insert(const Congruence& cg) {
+ insert_verbatim(cg);
+ static_cast<Congruence&>(operator[](rows.size()-1)).strong_normalize();
+ assert(OK());
+}
+
+inline void
+Congruence_System::resize_no_copy(const dimension_type new_n_rows,
+ const dimension_type new_n_columns) {
+ Matrix::resize_no_copy(new_n_rows, new_n_columns, Row::Flags());
+}
+
+inline const Congruence_System&
+Congruence_System::zero_dim_empty() {
+ static const Congruence_System zdf(Congruence::zero_dim_false());
+ return zdf;
+}
+
+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 static_cast<const Congruence&>(*i);
+}
+
+inline const Congruence*
+Congruence_System::const_iterator::operator->() const {
+ return static_cast<const Congruence*>(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 Matrix::const_iterator& iter,
+ const Congruence_System& csys)
+ : i(iter), csp(&csys) {
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::begin() const {
+ const_iterator i(Matrix::begin(), *this);
+ i.skip_forward();
+ return i;
+}
+
+inline Congruence_System::const_iterator
+Congruence_System::end() const {
+ const const_iterator i(Matrix::end(), *this);
+ return i;
+}
+
+inline void
+Congruence_System::swap(Congruence_System& y) {
+ Matrix::swap(y);
+}
+
+inline memory_size_type
+Congruence_System::external_memory_in_bytes() const {
+ return Matrix::external_memory_in_bytes();
+}
+
+inline memory_size_type
+Congruence_System::total_memory_in_bytes() const {
+ return Matrix::total_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Congruence_System */
+inline void
+swap(Parma_Polyhedra_Library::Congruence_System& x,
+ Parma_Polyhedra_Library::Congruence_System& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// 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_Row 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 // 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_Row& x, const Linear_Row& 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 g and \p cg and assigns it to \p z.
+ static void assign(Coefficient& z,
+ const Grid_Generator& g, 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& g);
+
+ //! Returns the sign of the scalar product between \p x and \p y.
+ static int sign(const Linear_Row& x, const Linear_Row& 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);
+
+ /*! \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_Row& x, const Linear_Row& 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& g, 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_Row& x, const Linear_Row& 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_Row& x, const Linear_Row& 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 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& g, 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_Row& x, const Linear_Row& 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);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Scalar product sign function object depending on topology.
+/*! \ingroup PPL_CXX_interface */
+#endif // 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 (*SPS_type)(const Linear_Row&, const Linear_Row&);
+
+ //! The scalar product sign function pointer.
+ SPS_type sps_fp;
+};
+
+// 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_Row& x, const Linear_Row& y) {
+ TEMP_INTEGER(z);
+ assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::reduced_sign(const Linear_Row& x, const Linear_Row& y) {
+ TEMP_INTEGER(z);
+ reduced_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Row& x, const Linear_Row& y) {
+ TEMP_INTEGER(z);
+ homogeneous_assign(z, x, y);
+ return sgn(z);
+}
+
+inline int
+Scalar_Products::sign(const Constraint& c, const Generator& g) {
+ return sign(static_cast<const Linear_Row&>(c),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::sign(const Generator& g, const Constraint& c) {
+ return sign(static_cast<const Linear_Row&>(g),
+ static_cast<const Linear_Row&>(c));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Constraint& c, const Generator& g) {
+ return reduced_sign(static_cast<const Linear_Row&>(c),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::reduced_sign(const Generator& g, const Constraint& c) {
+ return reduced_sign(static_cast<const Linear_Row&>(g),
+ static_cast<const Linear_Row&>(c));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Generator& g) {
+ homogeneous_assign(z,
+ static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline void
+Scalar_Products::homogeneous_assign(Coefficient& z,
+ const Linear_Expression& e,
+ const Grid_Generator& g) {
+ homogeneous_assign(z,
+ static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Generator& g) {
+ return homogeneous_sign(static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Scalar_Products::homogeneous_sign(const Linear_Expression& e,
+ const Grid_Generator& g) {
+ return homogeneous_sign(static_cast<const Linear_Row&>(e),
+ static_cast<const Linear_Row&>(g));
+}
+
+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 {
+ assert(c.space_dimension() <= g.space_dimension());
+ 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(static_cast<const Linear_Row&>(c),
+ static_cast<const Linear_Row&>(g));
+}
+
+inline int
+Topology_Adjusted_Scalar_Product_Sign::operator()(const Generator& g,
+ const Constraint& c) const {
+ assert(g.space_dimension() <= c.space_dimension());
+ 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(static_cast<const Linear_Row&>(g),
+ static_cast<const Linear_Row&>(c));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Scalar_Products.defs.hh line 181
+
+// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 1
+/* LP_Problem class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 34
+#include <vector>
+#include <map>
+#include <iosfwd>
+
+//! A Linear Programming problem.
+/*! \ingroup PPL_CXX_interface */
+class Parma_Polyhedra_Library::LP_Problem {
+public:
+ //! Default constructor: builds a trivial LP problem.
+ /*!
+ The trivial LP problem requires to maximize the objective function
+ \f$0\f$ on the zero-dimensional vector space under no constraints
+ at all: the origin of the vector space is the optimal solution.
+ */
+ LP_Problem();
+
+ /*! \brief
+ Builds an LP problem from the constraint system \p cs, the objective
+ function \p obj and optimization mode \p mode.
+
+ \param cs
+ The constraint system defining the feasible region for the LP problem.
+
+ \param obj
+ The objective function for the LP problem (optional argument with
+ default value \f$0\f$).
+
+ \param mode
+ The optimization mode (optional argument with default value
+ <CODE>MAXIMIZATION</CODE>).
+
+ \exception std::invalid_argument
+ Thrown if the constraint system contains any strict inequality
+ or if the space dimension of the objective function is strictly
+ greater than the space dimension of the constraint system.
+ */
+ explicit LP_Problem(const Constraint_System& cs,
+ const Linear_Expression& obj = Linear_Expression::zero(),
+ Optimization_Mode mode = MAXIMIZATION);
+
+ //! Ordinary copy-constructor.
+ LP_Problem(const LP_Problem& y);
+
+ //! Destructor.
+ ~LP_Problem();
+
+ //! Assignment operator.
+ LP_Problem& operator=(const LP_Problem& y);
+
+ //! Returns the maximum space dimension a LP_Problem can handle.
+ static dimension_type max_space_dimension();
+
+ //! Returns the space dimension of the current LP problem.
+ dimension_type space_dimension() const;
+
+ //! Returns the constraints defining the current feasible region.
+ const Constraint_System& constraints() const;
+
+ //! Returns the current objective function.
+ const Linear_Expression& objective_function() const;
+
+ //! Returns the current optimization mode.
+ Optimization_Mode optimization_mode() const;
+
+ //! Resets \p *this to be equal to the trivial LP problem.
+ void clear();
+
+ /*! \brief
+ Adds a copy of constraint \p c to the current LP problem,
+ increasing the number of space dimensions if needed.
+
+ \exception std::invalid_argument
+ Thrown if the constraint \p c is a strict inequality.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of the constraints in \p cs to the current LP problem,
+ increasing the number of space dimensions if needed.
+
+ \exception std::invalid_argument
+ Thrown if the constraint system \p cs contains any strict inequality.
+ */
+ 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 LP problem is satisfiable.
+ */
+ bool is_satisfiable() const;
+
+ //! Optimizes the current LP problem using the primal simplex algorithm.
+ /*!
+ \return
+ An LP_Problem_Status flag indicating the outcome of the optimization
+ attempt (unfeasible, unbounded or optimized problem).
+ */
+ LP_Problem_Status solve() const;
+
+ /*! \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 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& num,
+ Coefficient& den) const;
+
+ //! Returns a feasible point for \p *this, if it exists.
+ /*!
+ \exception std::domain_error
+ Thrown if the LP 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 doesn't not have an optimizing point, i.e.,
+ if the LP problem is unbounded or not satisfiable.
+ */
+ const Generator& optimizing_point() const;
+
+ /*! \brief
+ Sets \p num and \p den so that \f$\frac{num}{den}\f$ is
+ the solution of the optimization problem.
+
+ \exception std::domain_error
+ Thrown if \p *this doesn't not have an optimizing point, i.e.,
+ if the LP problem is unbounded or not satisfiable.
+ */
+ void optimal_value(Coefficient& num, Coefficient& den) const;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 swap(LP_Problem& y);
+
+private:
+ //! The matrix encoding the current feasible region in tableau form.
+ Matrix tableau;
+ //! The working cost function.
+ Row working_cost;
+ //! The current basic solution.
+ std::vector<dimension_type> base;
+ //! A mapping between original variables and split ones.
+ /*!
+ Contains all the pairs (i, j) such that Variable(i) (that was not found
+ to be constrained in sign) has been split into two nonnegative variables.
+ The "positive" one is represented again by Variable(i), and
+ the "negative" one is represented by Variable(j).
+ */
+ std::map<dimension_type, dimension_type> dim_map;
+
+ //! An enumerated type describing the internal status of the LP problem.
+ enum Status {
+ //! The LP problem has not been solved yet.
+ UNSOLVED,
+ //! The LP problem is unsatisfiable.
+ UNSATISFIABLE,
+ //! The LP problem is satisfiable; a feasible solution has been computed.
+ SATISFIABLE,
+ //! The LP problem is unbounded; a feasible solution has been computed.
+ UNBOUNDED,
+ //! The LP problem is optimized; an optimal solution has been computed.
+ OPTIMIZED,
+ /*! \brief
+ The feasible region of the LP problem has been changed by adding
+ new constraints; a feasible solution for the old constraints has
+ been computed.
+ */
+ PARTIALLY_SATISFIABLE
+ };
+
+ //! The internal state of the LP problem.
+ Status status;
+
+ //! The constraint system describing the feasible region.
+ Constraint_System input_cs;
+
+ //! 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
+ Optimizes the current LP problem using the second phase of the
+ primal simplex algorithm.
+ */
+ void second_phase();
+
+ /*! \brief
+ Assigns to \p this->tableau a simplex tableau representing the
+ current LP problem, inserting into \p this->dim_map the information
+ that is required to recover the original LP problem.
+
+ \return
+ <CODE>UNFEASIBLE_LP_PROBLEM</CODE> if the constraint system contains
+ any trivially unfeasible constraint (tableau was not computed);
+ <CODE>UNBOUNDED_LP_PROBLEM</CODE> if the problem is trivially unbounded
+ (the computed tableau contains no constraints);
+ <CODE>OPTIMIZED_LP_PROBLEM></CODE> if the problem is neither trivially
+ unfeasible nor trivially unbounded (the tableau was computed successfully).
+ */
+ LP_Problem_Status compute_tableau();
+
+ /*! \brief
+ Checks for optimality and, if it does not hold, computes the column
+ index of the variable entering the base of the LP problem.
+ Implemented 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 retuned.
+ */
+ dimension_type get_entering_var_index() const;
+
+ /*! \brief
+ Computes the row index of the variable exiting the base
+ of the LP problem. Implemented with anti-cycling rules.
+
+ \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 Linear_Row to \p x and normalizes it.
+ */
+ static void linear_combine(Row& x, const Row& y, const dimension_type k);
+
+ /*! \brief
+ Swaps two variables in base during the simplex algorithm,
+ performing the needed linear combinations.
+
+ \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 swap_base(const dimension_type entering_var_index,
+ const dimension_type exiting_base_index);
+
+ /*! \brief
+ Checks for optimality and, if it does not hold, computes the column
+ index of the variable entering the base of the LP problem.
+
+ \return
+ The column index of the variable that enters the base. If no such
+ variable exists, optimality was achieved and <CODE>0</CODE> is retuned.
+
+ 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 Integer implementation of the algorithm, our
+ tableau doesn't contain the ``real'' \f$\alpha\f$ values, but these
+ can be computed dividing the value of the cofficient by the value of
+ the variable in base. Obviously the result may not be an Integer, so
+ we will proceed in another way: the following code will compute the
+ lcm of all the variables in base to get the good ``weight'' of each
+ Coefficient of the tableau.
+ */
+ dimension_type steepest_edge() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and if only the algorithm successfully
+ computed a feasible solution.
+ */
+ bool compute_simplex();
+
+ /*! \brief
+ Adds the slack variables to satisfy the standard form of a LP problem,
+ inserts the "sign" to the cost functions, and makes the
+ necessary swaps to express the problem with the 1st phase base.
+ */
+ void prepare_first_phase();
+
+ /*! \brief
+ Drop unnecessary slack variables from the tableau and get ready
+ for the second phase of the simplex algorithm.
+ */
+ void erase_slacks();
+
+ bool is_in_base(const dimension_type var_index,
+ dimension_type& row_index) const;
+
+ Generator compute_generator() const;
+};
+
+// Automatically generated from PPL source file ../src/LP_Problem.inlines.hh line 1
+/* LP_Problem class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/LP_Problem.inlines.hh line 28
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+inline
+LP_Problem::LP_Problem()
+ : tableau(), working_cost(0, Row::Flags()),
+ base(), dim_map(), status(OPTIMIZED),
+ input_cs(), input_obj_function(), opt_mode(MAXIMIZATION),
+ last_generator(point()) {
+ assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const Constraint_System& cs,
+ const Linear_Expression& obj,
+ const Optimization_Mode mode)
+ : tableau(), working_cost(0, Row::Flags()),
+ base(), dim_map(), status(UNSOLVED),
+ input_cs(!cs.has_strict_inequalities()
+ ? cs
+ : (throw std::invalid_argument("PPL::LP_Problem::"
+ "LP_Problem(cs, obj, m):\n"
+ "cs contains strict inequalities."),
+ cs)),
+ input_obj_function(obj.space_dimension() <= cs.space_dimension()
+ ? obj
+ : (throw std::invalid_argument("PPL::LP_Problem::"
+ "LP_Problem(cs, obj, m):\n"
+ "cs and obj have "
+ "incompatible space dimensions."),
+ obj)),
+ opt_mode(mode),
+ last_generator(point()) {
+ assert(OK());
+}
+
+inline
+LP_Problem::LP_Problem(const LP_Problem& y)
+ : tableau(y.tableau), working_cost(y.working_cost),
+ base(y.base), dim_map(y.dim_map), status(y.status),
+ input_cs(y.input_cs), input_obj_function(y.input_obj_function),
+ opt_mode(y.opt_mode), last_generator(y.last_generator) {
+ assert(OK());
+}
+
+inline
+LP_Problem::~LP_Problem() {
+}
+
+inline void
+LP_Problem::swap(LP_Problem& y) {
+ std::swap(tableau, y.tableau);
+ std::swap(working_cost, y.working_cost);
+ std::swap(base, y.base);
+ std::swap(dim_map, y.dim_map);
+ std::swap(status, y.status);
+ std::swap(input_cs, y.input_cs);
+ std::swap(input_obj_function, y.input_obj_function);
+ std::swap(opt_mode, y.opt_mode);
+ std::swap(last_generator, y.last_generator);
+}
+
+inline LP_Problem&
+LP_Problem::operator=(const LP_Problem& y) {
+ LP_Problem tmp(y);
+ swap(tmp);
+ return *this;
+}
+
+inline dimension_type
+LP_Problem::max_space_dimension() {
+ return Constraint_System::max_space_dimension();
+}
+
+inline dimension_type
+LP_Problem::space_dimension() const {
+ return input_cs.space_dimension();
+}
+
+inline const Constraint_System&
+LP_Problem::constraints() const {
+ return input_cs;
+}
+
+inline const Linear_Expression&
+LP_Problem::objective_function() const {
+ return input_obj_function;
+}
+
+inline Optimization_Mode
+LP_Problem::optimization_mode() const {
+ return opt_mode;
+}
+
+inline void
+LP_Problem::clear() {
+ LP_Problem tmp;
+ swap(tmp);
+}
+
+inline void
+LP_Problem::add_constraint(const Constraint& c) {
+ if (c.is_strict_inequality())
+ throw std::invalid_argument("PPL::LP_Problem::add_constraint(c):\n"
+ "c is a strict inequality.");
+ input_cs.insert(c);
+ if (status != UNSATISFIABLE)
+ // TODO: apply an incremental version of the simplex algorithm,
+ // setting `status' to PARTIALLY_SATISFIABLE;
+ status = UNSOLVED;
+}
+
+inline void
+LP_Problem::add_constraints(const Constraint_System& cs) {
+ if (cs.has_strict_inequalities())
+ throw std::invalid_argument("PPL::LP_Problem::add_constraints(cs):\n"
+ "cs contains strict inequalities.");
+ const dimension_type cs_num_rows = cs.num_rows();
+ for (dimension_type i = cs_num_rows; i-- > 0; )
+ input_cs.insert(cs[i]);
+ if (status != UNSATISFIABLE)
+ // TODO: apply an incremental version of the simplex algorithm,
+ // setting `status' to PARTIALLY_SATISFIABLE;
+ status = UNSOLVED;
+ assert(OK());
+}
+
+inline void
+LP_Problem::set_objective_function(const Linear_Expression& obj) {
+ if (space_dimension() < obj.space_dimension())
+ throw std::invalid_argument("PPL::LP_Problem::"
+ "set_objective_function(obj):\n"
+ "*this and obj are dimension incompatible.");
+ switch (status) {
+ case UNBOUNDED:
+ status = SATISFIABLE;
+ break;
+ case OPTIMIZED:
+ status = SATISFIABLE;
+ break;
+ default:
+ break;
+ }
+ input_obj_function = obj;
+ assert(OK());
+}
+
+inline void
+LP_Problem::set_optimization_mode(Optimization_Mode mode) {
+ if (opt_mode == mode)
+ return;
+ switch (status) {
+ case UNBOUNDED:
+ status = SATISFIABLE;
+ break;
+ case OPTIMIZED:
+ status = SATISFIABLE;
+ break;
+ default:
+ break;
+ }
+ opt_mode = mode;
+ assert(OK());
+}
+
+inline LP_Problem_Status
+LP_Problem::solve() const {
+ if (is_satisfiable()) {
+ LP_Problem& x = const_cast<LP_Problem&>(*this);
+ x.second_phase();
+ if (x.status == UNBOUNDED)
+ return UNBOUNDED_LP_PROBLEM;
+ if (x.status == OPTIMIZED)
+ return OPTIMIZED_LP_PROBLEM;
+ }
+ return UNFEASIBLE_LP_PROBLEM;
+}
+
+inline const Generator&
+LP_Problem::feasible_point() const {
+ if (is_satisfiable()) {
+ assert(OK());
+ return last_generator;
+ }
+ throw std::domain_error("PPL::LP_Problem::feasible_point():\n"
+ "*this is not satisfiable.");
+}
+
+inline const Generator&
+LP_Problem::optimizing_point() const {
+ if (solve() == OPTIMIZED_LP_PROBLEM)
+ return last_generator;
+ throw std::domain_error("PPL::LP_Problem::optimizing_point():\n"
+ "*this doesn't have an optimizing point.");
+}
+
+inline void
+LP_Problem::optimal_value(Coefficient& num, Coefficient& den) const {
+ const Generator& g_ref = optimizing_point();
+ evaluate_objective_function(g_ref, num, den);
+ assert(OK());
+}
+
+inline memory_size_type
+LP_Problem::external_memory_in_bytes() const {
+ memory_size_type n
+ = tableau.external_memory_in_bytes()
+ + working_cost.external_memory_in_bytes()
+ + input_cs.external_memory_in_bytes()
+ + input_obj_function.external_memory_in_bytes()
+ + last_generator.external_memory_in_bytes();
+ // Adding the external memory for `base'.
+ n += base.capacity() * sizeof(dimension_type);
+ // Adding the external memory for `dim_map'.
+ // CHECK ME: just a lower approximation?
+ n += dim_map.size()
+ * sizeof(std::map<dimension_type, dimension_type>::value_type);
+ return n;
+}
+
+inline memory_size_type
+LP_Problem::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::LP_Problem */
+inline void
+swap(Parma_Polyhedra_Library::LP_Problem& x,
+ Parma_Polyhedra_Library::LP_Problem& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/LP_Problem.defs.hh line 393
+
+// 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 28
+#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
+ Parma_Polyhedra_Library::operator==(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+ friend bool
+ Parma_Polyhedra_Library::operator!=(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ Parma_Polyhedra_Library::operator&&(const Poly_Gen_Relation& x,
+ const Poly_Gen_Relation& y);
+
+ friend Poly_Gen_Relation
+ Parma_Polyhedra_Library::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 foreign
+ 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 142
+
+// 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 29
+#include <cassert>
+#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 // 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 // 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.
+ 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 116
+
+// 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 29
+#include <cassert>
+#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/Polyhedron.defs.hh line 1
+/* Polyhedron class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 44
+#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
+
+/*! \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 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.
+ Most operators on polyhedra are provided with two implementations:
+ one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+ also enforces the minimization of the representations,
+ and returns the Boolean value <CODE>false</CODE> whenever
+ the resulting polyhedron turns out to be empty.
+
+ 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 to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ ph.remove_space_dimensions(to_be_removed);
+ \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> to_be_removed1;
+ to_be_removed1.insert(y);
+ ph.remove_space_dimensions(to_be_removed1);
+ set<Variable> to_be_removed2;
+ to_be_removed2.insert(z);
+ ph.remove_space_dimensions(to_be_removed2);
+ \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 to_be_removed2
+ 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:
+ //! Returns the maximum space dimension all kinds of Polyhedron can handle.
+ static dimension_type max_space_dimension();
+
+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.
+ Polyhedron(const Polyhedron& y);
+
+ //! 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 will be
+ recycled to build the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the topology of \p cs is incompatible with \p topol.
+ */
+ Polyhedron(Topology topol, Constraint_System& cs);
+
+ //! 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 will be
+ recycled to build 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, Generator_System& gs);
+
+ //! Builds a polyhedron out of a generic, interval-based bounding box.
+ /*!
+ \param topol
+ The topology of the polyhedron;
+
+ \param box
+ The bounding box representing the polyhedron to be built.
+
+ \exception std::invalid_argument
+ Thrown if \p box has intervals that are incompatible with \p topol.
+
+ The template class Box must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the polyhedron
+ represented by the bounding box.
+ \code
+ bool is_empty() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the bounding box
+ describes the empty set.
+ The <CODE>is_empty()</CODE> method will always be called before the
+ methods below. However, if <CODE>is_empty()</CODE> returns
+ <CODE>true</CODE>, none of the functions below will be called.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ */
+ template <typename Box>
+ Polyhedron(Topology topol, const Box& box);
+
+ /*! \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;
+
+ /*! \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 <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;
+
+ /*! \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 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 point
+ 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 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 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 point
+ 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 point are left untouched.
+ */
+ bool minimize(const Linear_Expression& expr,
+ Coefficient& inf_n, Coefficient& inf_d, bool& minimum,
+ Generator& point) 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;
+
+ /*! \brief
+ Uses \p *this to shrink a generic, interval-based bounding box.
+ Assigns to \p box the intersection of \p box with the smallest
+ bounding box containing \p *this.
+
+ \param box
+ The bounding box to be shrunk;
+
+ \param complexity
+ The complexity class of the algorithm to be used.
+
+ If the polyhedron \p *this or \p box is empty, then the empty box
+ is returned.
+
+ If \p *this and \p box are non-empty, then, for
+ each space dimension \f$k\f$ with variable \f$\mathrm{var}\f$, let
+ \f$u\f$ be the upper and \f$l\f$ the lower bound of the smallest
+ interval containing \p *this.
+
+ If \f$l\f$ is infinite, then \p box is unaltered; if \f$l\f$ is
+ finite, then the \p box interval for space dimension \f$k\f$ is
+ (destructively) intersected with \f$[l, +\mathrm{infty})\f$ if a
+ point of \p *this satisfies \f$\mathrm{var} == l\f$ and with
+ \f$(l, +\mathrm{infty})\f$ otherwise.
+
+ Similarly, if \f$u\f$ is infinite, then \p box is unaltered; if
+ \f$u\f$ is finite, then the \p box interval for space dimension
+ \f$k\f$ is (destructively) intersected with \f$(-\mathrm{infty},
+ u]\f$ if a point of \p *this satisfies \f$\mathrm{var} == u\f$ and
+ with \f$(-\mathrm{infty}, u)\f$ otherwise.
+
+ The template class Box must provide the following methods, whose
+ return values, if any, are simply ignored.
+ \code
+ set_empty()
+ \endcode
+ causes the box to become empty, i.e., to represent the empty set.
+ \code
+ raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$[n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(n/d, +\infty)\f$ if <CODE>closed</CODE> is <CODE>false</CODE>.
+ \code
+ lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension
+ with \f$(-\infty, n/d]\f$ if <CODE>closed</CODE> is <CODE>true</CODE>,
+ with \f$(-\infty, n/d)\f$ if <CODE>closed</CODE>
+ is <CODE>false</CODE>.
+
+ The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+ will be called at most once for each possible value for <CODE>k</CODE>
+ and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+ that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+ is positive, \f$0/1\f$ being the unique representation for zero.
+ The same guarantee is offered for the function
+ <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+ */
+ template <typename Box>
+ void shrink_bounding_box(Box& box,
+ Complexity_Class complexity = ANY_COMPLEXITY) 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).
+
+ \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 constraint \p c to the system of constraints
+ of \p *this, minimizing the result
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are topology-incompatible
+ or dimension-incompatible.
+ */
+ bool add_constraint_and_minimize(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 generator \p g to the system of generators
+ of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_generator_and_minimize(const Generator& g);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to the system of congruences of \p
+ *this (without minimizing the result).
+
+ \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
+ 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 that will be recycled, adding its
+ constraints 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.
+
+ \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 constraints in \p cs to the system
+ of constraints of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of constraints
+ of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraint system that will be recycled, adding its
+ constraints 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.
+
+ \warning
+ The only assumption that can be made on \p cs upon successful or
+ exceptional return is that it can be safely destroyed.
+ */
+ bool add_recycled_constraints_and_minimize(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 that will be recycled, adding its generators
+ 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.
+
+ \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 generators in \p gs to the system
+ of generators of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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 the system
+ of generators \p gs is not empty, but has no points.
+ */
+ bool add_generators_and_minimize(const Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators
+ of \p *this, minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param gs
+ The generator system that will be recycled, adding its generators
+ 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 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.
+ */
+ bool add_recycled_generators_and_minimize(Generator_System& gs);
+
+ /*! \brief
+ Adds to \p *this constraints equivalent to the congruences in \p
+ cgs (without minimizing the result).
+
+ \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 topology-incompatible or
+ dimension-incompatible.
+ */
+ void add_congruences(const 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 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 intersection of \p *this and \p y,
+ minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool intersection_assign_and_minimize(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the poly-hull of \p *this and \p y.
+ The result is not guaranteed to be minimized.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ void poly_hull_assign(const Polyhedron& y);
+
+ /*! \brief
+ Assigns to \p *this the poly-hull of \p *this and \p y,
+ minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool poly_hull_assign_and_minimize(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. The result is not guaranteed to be minimized.
+
+ \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 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());
+
+ /*! \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,
+ const 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,
+ const 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,
+ const 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,
+ const 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);
+
+ //! 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
+ Improves the result of the \ref 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
+ 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
+ Improves the result of the \ref 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
+ 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);
+
+ /*! \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 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
+ 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, 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
+ 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 to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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 class 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 to_be_folded into \p var.
+ /*!
+ \param to_be_folded
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param var
+ 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 var or with
+ one of the Variable objects contained in \p to_be_folded.
+ Also thrown if \p var is contained in \p to_be_folded.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ \p to_be_folded is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p var is not a member
+ of \p to_be_folded, then the space dimensions corresponding to
+ variables in \p to_be_folded are \ref fold_space_dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool Parma_Polyhedra_Library::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 swap(Polyhedron& y);
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+ Returns <CODE>true</CODE> if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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;
+
+ //@} // Miscellaneous Member Functions
+
+private:
+ //! The system of constraints.
+ Constraint_System con_sys;
+
+ //! The system of generators.
+ Generator_System gen_sys;
+
+ //! The saturation matrix having constraints on its columns.
+ Saturation_Matrix sat_c;
+
+ //! The saturation matrix having generators on its columns.
+ Saturation_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 \ref ascii_dump)
+ 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 1856
+#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;
+
+ //! \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;
+
+ //@} // 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 point
+ 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 point are left untouched.
+ */
+ bool max_min(const Linear_Expression& expr,
+ const bool maximize,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Generator& point) 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_selected) 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_con_sys);
+
+ 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);
+
+ //@} // Widening- and Extrapolation-Related Functions
+
+ //! Adds new space dimensions to the given matrices.
+ /*!
+ \param mat1
+ The matrix to which columns are added;
+
+ \param mat2
+ The matrix to which rows and columns are added;
+
+ \param sat1
+ The saturation matrix whose columns are indexed by the rows of
+ matrix \p mat1. On entry it is up-to-date;
+
+ \param sat2
+ The saturation matrix whose columns are indexed by the rows of \p
+ mat2;
+
+ \param add_dim
+ The number of space dimensions to add.
+
+ Adds new space dimensions to the vector space modifying the matrices.
+ This function is invoked only by
+ <CODE>add_space_dimensions_and_embed()</CODE> and
+ <CODE>add_space_dimensions_and_project()</CODE>, passing the matrix of
+ constraints and that of generators (and the corresponding saturation
+ matrices) in different order (see those methods for details).
+ */
+ static void add_space_dimensions(Linear_System& mat1,
+ Linear_System& mat2,
+ Saturation_Matrix& sat1,
+ Saturation_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.
+ static bool minimize(bool con_to_gen,
+ Linear_System& source,
+ Linear_System& dest,
+ Saturation_Matrix& sat);
+
+ /*! \brief
+ Adds given constraints and builds minimized corresponding generators
+ or vice versa.
+ */
+ // Detailed Doxygen comment to be found in file minimize.cc.
+ static bool add_and_minimize(bool con_to_gen,
+ Linear_System& source1,
+ Linear_System& dest,
+ Saturation_Matrix& sat,
+ const Linear_System& 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.
+ static bool add_and_minimize(bool con_to_gen,
+ Linear_System& source,
+ Linear_System& dest,
+ Saturation_Matrix& sat);
+
+ //! Performs the conversion from constraints to generators and vice versa.
+ // Detailed Doxygen comment to be found in file conversion.cc.
+ static dimension_type conversion(Linear_System& source,
+ dimension_type start,
+ Linear_System& dest,
+ Saturation_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.
+ static int simplify(Linear_System& mat, Saturation_Matrix& sat);
+
+ //@} // Minimization-Related Static Member Functions
+
+ template <typename T> friend class Parma_Polyhedra_Library::BD_Shape;
+ friend class Parma_Polyhedra_Library::BHRZ03_Certificate;
+ friend class Parma_Polyhedra_Library::H79_Certificate;
+
+
+ //! \name Exception Throwers
+ //@{
+protected:
+ void throw_runtime_error(const char* method) const;
+ 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* e_name,
+ const Linear_Expression& e) 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;
+ void throw_dimension_incompatible(const char* method,
+ const char* var_name,
+ const Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ // Note: it has to be a static method, because it can be called inside
+ // constructors (before actually constructing the polyhedron object).
+ static void throw_space_dimension_overflow(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;
+ //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+void swap(Parma_Polyhedra_Library::Polyhedron& x,
+ Parma_Polyhedra_Library::Polyhedron& y);
+
+} // namespace std
+
+// 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;
+}
+
+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::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_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 dimension_type
+Polyhedron::space_dimension() const {
+ return space_dim;
+}
+
+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
+Polyhedron::~Polyhedron() {
+}
+
+inline void
+Polyhedron::swap(Polyhedron& y) {
+ if (topology() != y.topology())
+ throw_topology_incompatible("swap(y)", "y", y);
+ std::swap(con_sys, y.con_sys);
+ std::swap(gen_sys, y.gen_sys);
+ std::swap(sat_c, y.sat_c);
+ std::swap(sat_g, y.sat_g);
+ std::swap(status, y.status);
+ std::swap(space_dim, y.space_dim);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Polyhedron */
+inline void
+std::swap(Parma_Polyhedra_Library::Polyhedron& x,
+ Parma_Polyhedra_Library::Polyhedron& y) {
+ x.swap(y);
+}
+
+namespace Parma_Polyhedra_Library {
+
+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 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 {
+ assert(space_dim > 0 && !marked_empty());
+ assert(has_something_pending());
+
+ Polyhedron& x = const_cast<Polyhedron&>(*this);
+
+ if (x.has_pending_constraints())
+ return x.process_pending_constraints();
+
+ assert(x.has_pending_generators());
+ x.process_pending_generators();
+ return true;
+}
+
+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 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);
+}
+
+/*! \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);
+}
+
+} // 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/Polyhedron.templates.hh line 29
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Polyhedron::Polyhedron(Topology topol, const Box& box)
+ : con_sys(topol),
+ gen_sys(topol),
+ 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;
+ }
+
+ // Insert a dummy constraint of the highest dimension to avoid the
+ // need of resizing the matrix of constraints later;
+ // this constraint will be removed at the end.
+ con_sys.insert(Variable(space_dim - 1) >= 0);
+
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ // See if we have a valid lower bound.
+ bool l_closed = false;
+ Coefficient l_n, l_d;
+ bool l_bounded = box.get_lower_bound(k, l_closed, l_n, l_d);
+ if (l_bounded && topol == NECESSARILY_CLOSED && !l_closed)
+ throw_invalid_argument("C_Polyhedron(const Box& box):",
+ " box has an open lower bound");
+ // See if we have a valid upper bound.
+ bool u_closed = false;
+ Coefficient u_n, u_d;
+ bool u_bounded = box.get_upper_bound(k, u_closed, u_n, u_d);
+ if (u_bounded && topol == NECESSARILY_CLOSED && !u_closed)
+ throw_invalid_argument("C_Polyhedron(const Box& box):",
+ " box has an open upper bound");
+
+ // 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 * Variable(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 * Variable(k) >= l_n);
+ else
+ // Add the constraint `l_d*v_k > l_n'.
+ con_sys.insert(l_d * Variable(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 * Variable(k) <= u_n);
+ else
+ // Add the constraint `u_d*v_k < u_n'.
+ con_sys.insert(u_d * Variable(k) < u_n);
+ }
+ }
+ }
+
+ // Adding the low-level constraints.
+ con_sys.add_low_level_constraints();
+ // Now removing the dummy constraint inserted before.
+ dimension_type n_rows = con_sys.num_rows() - 1;
+ con_sys[0].swap(con_sys[n_rows]);
+ con_sys.set_sorted(false);
+ // NOTE: here there are no pending constraints.
+ con_sys.set_index_first_pending_row(n_rows);
+ con_sys.erase_to_end(n_rows);
+
+ // Constraints are up-to-date.
+ set_constraints_up_to_date();
+ assert(OK());
+}
+
+template <typename Box>
+void
+Polyhedron::shrink_bounding_box(Box& box, Complexity_Class complexity) const {
+ bool reduce_complexity = (complexity != ANY_COMPLEXITY);
+ if (!reduce_complexity
+ || (!has_something_pending() && constraints_are_minimized())) {
+ // If the constraint system is minimized, the test `is_universe()'
+ // is not exponential.
+ if (is_universe())
+ return;
+ }
+ if (reduce_complexity) {
+ if (marked_empty()
+ || (generators_are_up_to_date() && gen_sys.num_rows() == 0)) {
+ box.set_empty();
+ return;
+ }
+ else if (constraints_are_up_to_date()) {
+ // See if there is at least one inconsistent constraint in `con_sys'.
+ for (Constraint_System::const_iterator i = con_sys.begin(),
+ cs_end = con_sys.end(); i != cs_end; ++i)
+ if (i->is_inconsistent()) {
+ box.set_empty();
+ return;
+ }
+ // If `complexity' allows it, use the LP_Problem solver to determine
+ // whether or not the polyhedron is empty.
+ if (complexity == SIMPLEX_COMPLEXITY
+ // TODO: find a workaround for NNC polyhedra.
+ && is_necessarily_closed()) {
+ LP_Problem lp(con_sys);
+ if (!lp.is_satisfiable()) {
+ box.set_empty();
+ return;
+ }
+ }
+ }
+ }
+ else
+ // The flag `reduce_complexity' is `false'.
+ // Note that the test `is_empty()' is exponential in the worst case.
+ if (is_empty()) {
+ box.set_empty();
+ return;
+ }
+
+ if (space_dim == 0)
+ return;
+
+ // The following vectors will store the lower and upper bound
+ // for each dimension.
+ // Lower bounds are initialized to open plus infinity.
+ std::vector<LBoundary>
+ lower_bound(space_dim,
+ LBoundary(ERational(PLUS_INFINITY), LBoundary::OPEN));
+ // Upper bounds are initialized to open minus infinity.
+ std::vector<UBoundary>
+ upper_bound(space_dim,
+ UBoundary(ERational(MINUS_INFINITY), UBoundary::OPEN));
+
+ if (!reduce_complexity && has_something_pending())
+ process_pending();
+
+ // TODO: use simplex to derive variable bounds, if the complexity
+ // is SIMPLEX_COMPLEXITY.
+
+ if (reduce_complexity &&
+ (!generators_are_up_to_date() || has_pending_constraints())) {
+ // Extract easy-to-find bounds from constraints.
+ assert(constraints_are_up_to_date());
+
+ // We must copy `con_sys' to a temporary matrix,
+ // as we need to simplify all of the matrix
+ // (not just the non-pending part of it).
+ Constraint_System cs(con_sys);
+ if (cs.num_pending_rows() > 0)
+ cs.unset_pending_rows();
+ if (has_pending_constraints() || !constraints_are_minimized())
+ cs.simplify();
+
+ const Constraint_System::const_iterator cs_begin = cs.begin();
+ const Constraint_System::const_iterator cs_end = cs.end();
+
+ for (Constraint_System::const_iterator i = cs_begin; i != cs_end; ++i) {
+ dimension_type varid = space_dim;
+ const Constraint& c = *i;
+ // After `simplify()' some constraints may have become inconsistent.
+ if (c.is_inconsistent()) {
+ box.set_empty();
+ return;
+ }
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ // We look for constraints of the form `Variable(j) == k',
+ // `Variable(j) >= k', and `Variable(j) > k'.
+ if (c.coefficient(Variable(j)) != 0)
+ if (varid != space_dim) {
+ varid = space_dim;
+ break;
+ }
+ else
+ varid = j;
+ }
+ if (varid != space_dim) {
+ Coefficient_traits::const_reference d = c.coefficient(Variable(varid));
+ Coefficient_traits::const_reference n = c.inhomogeneous_term();
+ // The constraint `c' is of the form
+ // `Variable(varid) + n / d rel 0', where
+ // `rel' is either the relation `==', `>=', or `>'.
+ // For the purpose of shrinking intervals, this is
+ // (morally) turned into `Variable(varid) rel -n/d'.
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ // Turn `n/d' into `-n/d'.
+ q = -q;
+ const ERational r(q, ROUND_NOT_NEEDED);
+ const Constraint::Type c_type = c.type();
+ switch (c_type) {
+ case Constraint::EQUALITY:
+ lower_bound[varid] = LBoundary(r, LBoundary::CLOSED);
+ upper_bound[varid] = UBoundary(r, UBoundary::CLOSED);
+ break;
+ case Constraint::NONSTRICT_INEQUALITY:
+ case Constraint::STRICT_INEQUALITY:
+ if (d > 0)
+ // If `d' is strictly positive, we have a constraint of the
+ // form `Variable(varid) >= k' or `Variable(varid) > k'.
+ lower_bound[varid]
+ = LBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+ ? LBoundary::CLOSED
+ : LBoundary::OPEN));
+ else {
+ // Otherwise, we are sure that `d' is strictly negative
+ // and, in this case, we have a constraint of the form
+ // `Variable(varid) <= k' or `Variable(varid) < k'.
+ assert(d < 0);
+ upper_bound[varid]
+ = UBoundary(r, (c_type == Constraint::NONSTRICT_INEQUALITY
+ ? UBoundary::CLOSED
+ : UBoundary::OPEN));
+ }
+ break;
+ }
+ }
+ }
+ }
+ else {
+ // We are in the case where either the generators are up-to-date
+ // or reduced complexity is not required.
+ // Get the generators for *this.
+
+ // We have not to copy `gen_sys', because in this case
+ // we only read the generators.
+ const Generator_System& gs = gen_sys;
+
+ // We first need to identify those axes that are unbounded below
+ // and/or above.
+ for (Generator_System::const_iterator i = gs.begin(),
+ gs_end = gs.end(); i != gs_end; ++i) {
+ // Note: using an iterator, we read also the pending part of the matrix.
+ const Generator& g = *i;
+ Generator::Type g_type = g.type();
+ switch (g_type) {
+ case Generator::LINE:
+ // Any axes `j' in which the coefficient is non-zero is unbounded
+ // both below and above.
+ for (dimension_type j = space_dim; j-- > 0; )
+ if (g.coefficient(Variable(j)) != 0) {
+ lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+ LBoundary::OPEN);
+ upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+ UBoundary::OPEN);
+ }
+ break;
+ case Generator::RAY:
+ // Axes in which the coefficient is negative are unbounded below.
+ // Axes in which the coefficient is positive are unbounded above.
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ int sign = sgn(g.coefficient(Variable(j)));
+ if (sign < 0)
+ lower_bound[j] = LBoundary(ERational(MINUS_INFINITY),
+ LBoundary::OPEN);
+ else if (sign > 0)
+ upper_bound[j] = UBoundary(ERational(PLUS_INFINITY),
+ UBoundary::OPEN);
+ }
+ break;
+ case Generator::POINT:
+ case Generator::CLOSURE_POINT:
+ {
+ Coefficient_traits::const_reference d = g.divisor();
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ Coefficient_traits::const_reference n = g.coefficient(Variable(j));
+ mpq_class q;
+ assign_r(q.get_num(), n, ROUND_NOT_NEEDED);
+ assign_r(q.get_den(), d, ROUND_NOT_NEEDED);
+ q.canonicalize();
+ const ERational r(q, ROUND_NOT_NEEDED);
+ LBoundary lb(r,(g_type == Generator::CLOSURE_POINT
+ ? LBoundary::OPEN
+ : LBoundary::CLOSED));
+ if (lb < lower_bound[j])
+ lower_bound[j] = lb;
+ UBoundary ub(r, (g_type == Generator::CLOSURE_POINT
+ ? UBoundary::OPEN
+ : UBoundary::CLOSED));
+ if (ub > upper_bound[j])
+ upper_bound[j] = ub;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ TEMP_INTEGER(n);
+ TEMP_INTEGER(d);
+
+ // Now shrink the bounded axes.
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ // Lower bound.
+ const LBoundary& lb = lower_bound[j];
+ const ERational& lr = lb.bound();
+ if (!is_plus_infinity(lr) && !is_minus_infinity(lr)) {
+ n = raw_value(lr).get_num();
+ d = raw_value(lr).get_den();
+ box.raise_lower_bound(j, lb.is_closed(), n, d);
+ }
+
+ // Upper bound.
+ const UBoundary& ub = upper_bound[j];
+ const ERational& ur = ub.bound();
+ if (!is_plus_infinity(ur) && !is_minus_infinity(ur)) {
+ n = raw_value(ur).get_num();
+ d = raw_value(ur).get_den();
+ box.lower_upper_bound(j, ub.is_closed(), n, d);
+ }
+ }
+}
+
+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();
+
+ assert(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.
+
+ // We first compute suitable permutation cycles for the columns of
+ // the `con_sys' and `gen_sys' matrices. We will represent them
+ // with a linear array, using 0 as a terminator for each cycle
+ // (notice that the columns with index 0 of `con_sys' and
+ // `gen_sys' represent the inhomogeneous terms, and thus are
+ // unaffected by the permutation of dimensions).
+ // Cycles of length 1 will be omitted so that, in the worst case,
+ // we will have `space_dim' elements organized in `space_dim/2'
+ // cycles, which means we will have at most `space_dim/2'
+ // terminators.
+ std::vector<dimension_type> cycles;
+ cycles.reserve(space_dim + space_dim/2);
+
+ // 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)
+ // Cycle of length 1: skip it.
+ goto skip;
+
+ cycles.push_back(j+1);
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+ // End of cycle: mark it.
+ cycles.push_back(0);
+ skip:
+ ;
+ }
+ }
+
+ // If `cycles' is empty then `pfunc' is the identity.
+ if (cycles.empty())
+ return;
+
+ // 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_columns(cycles);
+
+ if (generators_are_up_to_date())
+ gen_sys.permute_columns(cycles);
+
+ assert(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.num_rows() == 0) {
+ // The polyhedron is empty.
+ Polyhedron new_polyhedron(topology(), new_space_dimension, EMPTY);
+ std::swap(*this, new_polyhedron);
+ 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;
+ }
+
+ 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;
+ Linear_Expression e(0 * Variable(new_space_dimension-1));
+ bool all_zeroes = true;
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ if (old_g.coefficient(Variable(j)) != 0
+ && pfunc_maps[j] != not_a_dimension()) {
+ e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(line(e));
+ break;
+ case Generator::RAY:
+ if (!all_zeroes)
+ new_gensys.insert(ray(e));
+ break;
+ case Generator::POINT:
+ // A point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(point(e, old_g.divisor()));
+ break;
+ case Generator::CLOSURE_POINT:
+ // A closure point in the origin has all zero homogeneous coefficients.
+ new_gensys.insert(closure_point(e, old_g.divisor()));
+ break;
+ }
+ }
+ Polyhedron new_polyhedron(topology(), new_gensys);
+ std::swap(*this, new_polyhedron);
+ assert(OK(true));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedron.defs.hh line 2474
+
+// Automatically generated from PPL source file ../src/H79_Certificate.inlines.hh line 27
+
+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 96
+
+// 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 27
+
+// Automatically generated from PPL source file ../src/Grid_Certificate.defs.hh line 30
+#include <cassert>
+#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 // 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 // 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.
+ 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 102
+
+// Automatically generated from PPL source file ../src/Grid.defs.hh line 1
+/* Grid class declaration.
+*/
+
+
+#define STRONG_REDUCTION
+
+// Automatically generated from PPL source file ../src/Grid.defs.hh line 43
+#include <vector>
+#include <iosfwd>
+
+// Dimension kind vector tracing
+#define print_dim_kinds(msg, dim_kinds) \
+ std::cout << msg << "dim_kinds:"; \
+ for (Dimension_Kinds::iterator i = dim_kinds.begin(); i != dim_kinds.end(); ++i) \
+ std::cout << " " << *i; \
+ std::cout << std::endl;
+#if 0
+#define trace_dim_kinds(msg, dim_kinds) print_dim_kinds(msg, dim_kinds)
+#else
+#define trace_dim_kinds(msg, dim_kinds)
+#endif
+
+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
+
+/*! \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.
+
+ 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 the 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.
+ Most operators on grids are provided with two implementations:
+ one of these, denoted <CODE>\<operator-name\>_and_minimize</CODE>,
+ also enforces the minimization of the representations,
+ and returns the boolean value <CODE>false</CODE> whenever
+ the resulting grid turns out to be empty.
+
+ A key attributes 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_generator(grid_point(0*x + 0*y));
+ gr.add_generator(grid_line(x));
+ gr.add_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_generator(grid_point(0*x + 0*y));
+ gr.add_generator(grid_point(4*x + 0*y));
+ gr.add_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_generator(grid_point(0*x + 0*y));
+ gr.add_generator(grid_point(4*x + 0*y));
+ gr.add_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 to_be_removed;
+ to_be_removed.insert(y);
+ to_be_removed.insert(z);
+ gr.remove_space_dimensions(to_be_removed);
+ \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> to_be_removed1;
+ to_be_removed1.insert(y);
+ gr.remove_space_dimensions(to_be_removed1);
+ set<Variable> to_be_removed2;
+ to_be_removed2.insert(z);
+ gr.remove_space_dimensions(to_be_removed2);
+ \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 to_be_removed2
+ 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:
+ //! Returns the maximum space dimension all kinds of Grid can handle.
+ static dimension_type max_space_dimension();
+
+ //! 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,
+ const 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
+ will be recycled to build the grid.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(Congruence_System& cgs);
+
+ //! 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::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.
+
+ \exception std::length_error
+ Thrown if \p num_dimensions exceeds the maximum allowed space
+ dimension.
+ */
+ explicit Grid(Constraint_System& cs);
+
+ //! Builds a grid, copying a system of generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param const_gs
+ 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& const_gs);
+
+ //! Builds a grid, recycling a system of generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the grid. Its data-structures
+ will be recycled to build 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(Grid_Generator_System& gs);
+
+ //! Builds a grid out of a generic, interval-based bounding box.
+ /*!
+ \param box
+ The bounding box representing the grid to be built. The box can
+ contain only point and universe intervals;
+
+ \param dummy
+ A dummy tag to make this constructor syntactically unique.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p box contains at least one interval with: a
+ topologically open bound, a single bound, or two bounds which have
+ space between them.
+
+ The template class Box must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the bounding box.
+ \code
+ bool is_empty() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the bounding box
+ describes the empty set.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ */
+ template <typename Box>
+ Grid(const Box& box, From_Bounding_Box dummy);
+
+ //! Builds a grid out of a generic, interval-based covering box.
+ /*!
+ The covering box is a set of upper and lower values for each
+ dimension. When a covering box is tiled onto empty space the
+ corners of the tiles form a rectilinear grid.
+
+ A box interval with only one bound fixes the values of all grid
+ points in the dimension associated with the box to the value of
+ the bound. A box interval which has upper and lower bounds of
+ equal value allows all grid points with any value in the dimension
+ associated with the interval. The presence of a universe interval
+ results in the empty grid. The empty box produces the empty grid
+ of the same dimension as the box.
+
+ \param box
+ The covering box representing the grid to be built;
+
+ \param dummy
+ A dummy tag to make this constructor syntactically unique.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum
+ allowed space dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p box contains any topologically open bounds.
+
+ The template class Box must provide the following methods.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the covering box.
+ \code
+ bool is_empty() const
+ \endcode
+ returns <CODE>true</CODE> if and only if the covering box
+ describes the empty set.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ */
+ template <typename Box>
+ Grid(const Box& box, From_Covering_Box dummy);
+
+ //! Ordinary copy-constructor.
+ Grid(const Grid& y);
+
+ /*! \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;
+
+ //! Returns the system of congruences.
+ const Congruence_System& congruences() const;
+
+ //! Returns the system of congruences in reduced form.
+ const Congruence_System& minimized_congruences() const;
+
+ //! Returns the system of generators.
+ const Grid_Generator_System& generators() const;
+
+ //! Returns the minimized system of generators.
+ const Grid_Generator_System& minimized_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;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is an empty
+ grid.
+ */
+ bool is_empty() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> 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.
+ */
+ 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;
+
+ //! 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,
+ Grid_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,
+ Grid_Generator& point) 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;
+
+ //! Uses \p *this to shrink a generic, interval-based bounding box.
+ /*!
+ \param box
+ The bounding box to be shrunk.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p box are dimension-incompatible, or if \p
+ box contains any topologically open bounds.
+
+ The template class Box must provide the following methods
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the bounding box.
+ \code
+ bool get_lower_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from below, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the lower boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical 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 if and only if \f$n\f$ and \f$d\f$
+ have no common factors and \f$d\f$ is positive, \f$0/1\f$ being
+ the unique representation for zero.
+ \code
+ bool get_upper_bound(dimension_type k, bool closed,
+ Coefficient& n, Coefficient& d) const
+ \endcode
+ Let \f$I\f$ be the interval corresponding to the <CODE>k</CODE>-th
+ space dimension. If \f$I\f$ is not bounded from above, simply return
+ <CODE>false</CODE>. Otherwise, set <CODE>closed</CODE>,
+ <CODE>n</CODE> and <CODE>d</CODE> as follows: <CODE>closed</CODE>
+ is set to <CODE>true</CODE> if the upper boundary of \f$I\f$
+ is closed and is set to <CODE>false</CODE> otherwise;
+ <CODE>n</CODE> and <CODE>d</CODE> are assigned the integers
+ \f$n\f$ and \f$d\f$ such that the canonical fraction \f$n/d\f$
+ corresponds to the least upper bound of \f$I\f$.
+ \code
+ set_empty()
+ \endcode
+ Causes the box to become empty, i.e., to represent the empty set.
+ \code
+ raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$[n/d, +\infty)\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+ \code
+ lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$(-\infty, n/d]\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+
+ The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+ will be called at most once for each possible value for <CODE>k</CODE>
+ and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+ that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+ is positive, \f$0/1\f$ being the unique representation for zero.
+ The same guarantee is offered for the function
+ <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+ */
+ template <typename Box>
+ void shrink_bounding_box(Box& box) const;
+
+ //! Writes the covering box for \p *this into \p box.
+ /*!
+ The covering box is a set of upper and lower values for each
+ dimension. When the covering box written into \p box is tiled
+ onto empty space the corners of the tiles form the sparsest
+ rectilinear grid that includes \p *this.
+
+ The value of the lower bound of each interval of the resulting \p
+ box are as close as possible to the origin, with positive values
+ taking preference when the lowest positive value equals the lowest
+ negative value.
+
+ If all the points have a single value in a particular dimension of
+ the grid then there is only a lower bound on the interval produced
+ in \p box, and the lower bound denotes the single value for the
+ dimension. If the coordinates of the points in a particular
+ dimension include every value then the upper and lower bounds of
+ the associated interval in \p box are set equal. The empty grid
+ produces the empty \p box. The zero dimension universe grid
+ produces the zero dimension universe box.
+
+ \param box
+ The Box into which the covering box is written.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p box are dimension-incompatible.
+
+ The template class Box must provide the following methods
+ \code
+ Box(dimension_type space_dimension)
+ \endcode
+ Creates a universe box of space_dimension dimensions.
+ \code
+ dimension_type space_dimension() const
+ \endcode
+ returns the dimension of the vector space enclosing the grid
+ represented by the covering box.
+ \code
+ set_empty()
+ \endcode
+ Causes the box to become empty, i.e., to represent the empty set.
+ \code
+ raise_lower_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$[n/d, +\infty)\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+ \code
+ lower_upper_bound(dimension_type k, bool closed,
+ Coefficient_traits::const_reference n,
+ Coefficient_traits::const_reference d)
+ \endcode
+ intersects the interval corresponding to the <CODE>k</CODE>-th
+ space dimension with \f$(-\infty, n/d]\f$. <CODE>closed</CODE> is
+ always passed as <CODE>true</CODE>.
+
+ The function <CODE>raise_lower_bound(k, closed, n, d)</CODE>
+ will be called at most once for each possible value for <CODE>k</CODE>
+ and for all such calls the fraction \f$n/d\f$ will be in canonical form,
+ that is, \f$n\f$ and \f$d\f$ have no common factors and \f$d\f$
+ is positive, \f$0/1\f$ being the unique representation for zero.
+ The same guarantee is offered for the function
+ <CODE>lower_upper_bound(k, closed, n, d)</CODE>.
+ */
+ template <typename Box>
+ void get_covering_box(Box& box) 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);
+
+ //! Adds constraint \p c to \p *this.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ void add_congruence(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of congruence \p cg to the system of congruences of \p
+ *this, reducing the result
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and congruence \p cg are dimension-incompatible.
+ */
+ bool add_congruence_and_minimize(const Congruence& c);
+
+ //! Adds a copy of constraint \p c to \p *this, reducing the result.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible.
+ */
+ bool add_congruence_and_minimize(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of 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_generator(const Grid_Generator& g);
+
+ /*! \brief
+ Adds a copy of generator \p g to the system of generators of \p
+ *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_generator_and_minimize(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 a copy of each equality constraint in \p cs to \p *this.
+ /*!
+ \param cs
+ The congruences that will be considered for addition 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 Constraint_System& cs);
+
+ //! Adds the congruences in \p cgs to *this.
+ /*!
+ \param cgs
+ The congruence system that will be recycled, adding its
+ congruences to the system of congruences of \p *this.
+
+ \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 the equality constraints in \p cs to \p *this.
+ /*!
+ \param cs
+ The constraint system from which constraints will be considered
+ for addition to the system of congruences of \p *this.
+
+ \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_congruences(Constraint_System& cs);
+
+ /*! \brief
+ Adds a copy of the congruences in \p cgs to the system of
+ congruences of \p *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_congruences_and_minimize(const Congruence_System& cgs);
+
+ /*! \brief
+ Adds a copy of each equality constraint in \p cs to \p *this,
+ reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ Contains the constraints that will be added to the system of
+ congruences of \p *this.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ bool add_congruences_and_minimize(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the congruences in \p cgs to the system of congruences of \p
+ *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cgs
+ The congruence system that will be recycled, adding its
+ congruences to the system of congruences of \p *this.
+
+ \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.
+ */
+ bool add_recycled_congruences_and_minimize(Congruence_System& cgs);
+
+ //! Adds the equalities in \p cs to \p *this, reducing the result.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraint system that will be recycled, adding its
+ equalities to the system of congruences of \p *this.
+
+ \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.
+ */
+ bool add_recycled_congruences_and_minimize(Constraint_System& cs);
+
+ //! Adds constraint \p c to \p *this.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ void add_constraint(const Constraint& c);
+
+ //! Adds constraint \p c to \p *this, reducing the result.
+ /*!
+ The addition can only affect \p *this if \p c is an equality.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are dimension-incompatible.
+ */
+ bool add_constraint_and_minimize(const Constraint& c);
+
+ //! Adds copies of the equality constraints in \p cs to \p *this.
+ /*!
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds copies of the equality constraints in \p cs to \p *this,
+ reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ //! Adds the equality constraints in \p cs to \p *this.
+ /*!
+ \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
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_recycled_constraints_and_minimize(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_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 that will be recycled, adding its generators
+ 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.
+
+ \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_generators(Grid_Generator_System& gs);
+
+ /*! \brief
+ Adds a copy of the generators in \p gs to the system of generators
+ of \p *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \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.
+ */
+ bool add_generators_and_minimize(const Grid_Generator_System& gs);
+
+ /*! \brief
+ Adds the generators in \p gs to the system of generators of \p
+ *this, reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param gs
+ The generator system that will be recycled, adding its generators
+ 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.
+
+ \warning
+ The only assumption that can be made about \p gs upon successful
+ or exceptional return is that it can be safely destroyed.
+ */
+ bool add_recycled_generators_and_minimize(Grid_Generator_System& gs);
+
+ /*! \brief
+ Assigns to \p *this the intersection of \p *this and \p y. The
+ result is not guaranteed to be reduced.
+
+ \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 intersection of \p *this and \p y,
+ reducing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool intersection_assign_and_minimize(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the join of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void join_assign(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the join of \p *this and \p y, reducing the
+ result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool join_assign_and_minimize(const Grid& y);
+
+ //! Same as join_assign(y).
+ void upper_bound_assign(const Grid& y);
+
+ /*! \brief
+ If the join 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 join_assign_if_exact(const Grid& y);
+
+ //! Same as join_assign_if_exact(y).
+ bool upper_bound_assign_if_exact(const Grid& y);
+
+ /*! \brief
+ Assigns to \p *this the \ref Grid_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 grid_difference_assign(const Grid& y);
+
+ //! Same as grid_difference_assign(y).
+ void difference_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 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 one.
+
+ \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,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = Coefficient_one());
+
+ /*! \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 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 one.
+
+ \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,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator
+ = Coefficient_one(),
+ Coefficient_traits::const_reference modulus
+ = 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{lhs}' = \mathrm{rhs} \pmod{\mathrm{modulus}}\f$.
+
+ \param lhs
+ The left hand side affine expression.
+
+ \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 one.
+
+ \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,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = Coefficient_one());
+
+ /*! \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 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 one.
+
+ \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,
+ const Linear_Expression& rhs,
+ Coefficient_traits::const_reference modulus
+ = 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);
+
+ //! 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.
+
+ \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 \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 cs 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
+ 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
+ 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 Grid_Concatenate "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 to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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 Grid_Map_Space_Dimensions "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 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 Grid_Map_Space_Dimensions "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 Grid_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 to_be_folded into \p var.
+ /*!
+ \param to_be_folded
+ The set of Variable objects corresponding to the space dimensions
+ to be folded;
+
+ \param var
+ 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 var or with
+ one of the Variable objects contained in \p to_be_folded. Also
+ thrown if \p var is contained in \p to_be_folded.
+
+ If \p *this has space dimension \f$n\f$, with \f$n > 0\f$,
+ <CODE>var</CODE> has space dimension \f$k \leq n\f$,
+ \p to_be_folded is a set of variables whose maximum space dimension
+ is also less than or equal to \f$n\f$, and \p var is not a member
+ of \p to_be_folded, then the space dimensions corresponding to
+ variables in \p to_be_folded are \ref Grid_Fold_Space_Dimensions "folded"
+ into the \f$k\f$-th space dimension.
+ */
+ void fold_space_dimensions(const Variables_Set& to_be_folded, Variable var);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ friend bool Parma_Polyhedra_Library::operator==(const Grid& x,
+ const Grid& y);
+
+ friend class Parma_Polyhedra_Library::Grid_Certificate;
+
+ //! \name Miscellaneous Member Functions
+ //@{
+
+ //! Destructor.
+ ~Grid();
+
+ /*! \brief
+ Swaps \p *this with grid \p y. (\p *this and \p y can be
+ dimension-incompatible.)
+ */
+ void swap(Grid& y);
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by
+ \ref ascii_dump) and sets \p *this accordingly.
+
+ \return
+ <CODE>true</CODE> if successful, else <CODE>false</CODE>.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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;
+
+ //@} // 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 \ref
+ ascii_dump) 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 1959
+#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,
+ LINE,
+ GEN_VIRTUAL,
+ 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 from a system of congruences.
+ /*!
+ The grid inherits the space dimension of the congruence system.
+
+ \param cgs
+ The system of congruences defining the grid.
+ */
+ void construct(const Congruence_System& cgs);
+
+ //! Builds a grid from a system of generators.
+ /*!
+ The grid inherits the space dimension of the generator system.
+
+ \param gs
+ The system of generators defining the grid;
+ */
+ void construct(const Grid_Generator_System& gs);
+
+ //! \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 parameters 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.
+ /*!
+ \return
+ Always <CODE>true</CODE>.
+ */
+ bool 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,
+ char* method_call,
+ Coefficient& ext_n, Coefficient& ext_d, bool& included,
+ Grid_Generator* point = NULL) const;
+
+ //! \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;
+
+ //@} // 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,
+ const 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,
+ const 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.
+
+ \return
+ The new system divisor, or zero if \p divisor was zero.
+
+ \param sys
+ The generator system to be normalized.
+
+ \param divisor
+ An extra divisor to include in the calculation of the common
+ divisor of \p sys.
+
+ \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 Coefficient
+ normalize_divisors(Grid_Generator_System& sys,
+ Coefficient_traits::const_reference divisor
+ = Coefficient_one(),
+ Grid_Generator* first_point = NULL);
+
+ //! 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.
+ */
+ 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& gs,
+ 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 col of \p row is zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_line_with_line(Grid_Generator& row,
+ Grid_Generator& pivot,
+ dimension_type col);
+
+ //! 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 col of \p row is
+ zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_equality_with_equality(Congruence& row,
+ Congruence& pivot,
+ dimension_type col);
+
+ //! 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 col 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).
+ */
+ // Part of Grid for access to Matrix::rows.
+ template <typename R>
+ static void reduce_pc_with_pc(R& row,
+ R& pivot,
+ dimension_type col,
+ 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 col of \p row
+ is zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_parameter_with_line(Grid_Generator& row,
+ Grid_Generator& pivot,
+ dimension_type col,
+ Grid_Generator_System& sys);
+
+ //! 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 col of \p row is
+ zero.
+ */
+ // A member of Grid for access to Matrix::rows.
+ static void reduce_congruence_with_equality(Congruence& row,
+ Congruence& pivot,
+ dimension_type col,
+ Congruence_System& sys);
+
+ //! Reduce column \p dim in rows preceding \p pivot_index in \p sys.
+ /*!
+ Only consider from index \p start to index \p end of the row at \p
+ pivot_index. Flag \p generators indicates whether \p sys is a
+ congruence or generator system.
+ */
+ template <typename M, typename R>
+ static void reduce_reduced(M& sys, dimension_type dim,
+ dimension_type pivot_index,
+ dimension_type start, dimension_type end,
+ Dimension_Kinds& dim_kinds,
+ bool generators = true);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Matrix::rows and cgs::operator[].
+ static void multiply_grid(const Coefficient& multiplier,
+ Congruence& cg, Congruence_System& dest,
+ const dimension_type num_rows,
+ const dimension_type num_dims);
+
+ //! Multiply the elements of \p dest by \p multiplier.
+ // A member of Grid for access to Grid_Generator::operator[].
+ static void multiply_grid(const Coefficient& multiplier, Grid_Generator& gen,
+ Grid_Generator_System& dest, const dimension_type num_rows,
+ const dimension_type num_dims);
+
+ /*! \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
+
+ //! \name Exception Throwers
+ //@{
+protected:
+ void throw_runtime_error(const char* method) const;
+ void throw_invalid_argument(const char* method, const char* reason) 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* gr_name,
+ const Grid& gr) const;
+ void throw_dimension_incompatible(const char* method,
+ const char* e_name,
+ const Linear_Expression& e) 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* 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,
+ const Variable var) const;
+ void throw_dimension_incompatible(const char* method,
+ dimension_type required_space_dim) const;
+
+ // Note: it has to be a static method, because it can be called inside
+ // constructors (before actually constructing the grid object).
+ static void throw_space_dimension_overflow(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;
+ //@} // Exception Throwers
+
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Grid */
+void swap(Parma_Polyhedra_Library::Grid& x,
+ Parma_Polyhedra_Library::Grid& y);
+
+} // namespace std
+
+// 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;
+}
+
+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 28
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+inline dimension_type
+Grid::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(Congruence_System::max_space_dimension(),
+ Grid_Generator_System::max_space_dimension()
+ )
+ );
+}
+
+inline void
+Grid::set_congruences_up_to_date() {
+ status.set_c_up_to_date();
+}
+
+inline
+Grid::Grid(const Congruence_System& ccgs) {
+ if (ccgs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(ccgs)",
+ "the space dimension of ccgs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(ccgs);
+}
+
+inline
+Grid::Grid(Congruence_System& cgs) {
+ if (cgs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(cgs)",
+ "the space dimension of cgs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(cgs);
+}
+
+inline
+Grid::Grid(const Grid_Generator_System& gs) {
+ if (gs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(gs);
+}
+
+inline
+Grid::Grid(Grid_Generator_System& gs) {
+ if (gs.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension");
+ construct(gs);
+}
+
+inline
+Grid::~Grid() {
+}
+
+inline memory_size_type
+Grid::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+inline dimension_type
+Grid::space_dimension() const {
+ return space_dim;
+}
+
+inline void
+Grid::upper_bound_assign(const Grid& y) {
+ join_assign(y);
+}
+
+inline bool
+Grid::upper_bound_assign_if_exact(const Grid& y) {
+ return join_assign_if_exact(y);
+}
+
+inline void
+Grid::difference_assign(const Grid& y) {
+ grid_difference_assign(y);
+}
+
+inline void
+Grid::swap(Grid& y) {
+ std::swap(con_sys, y.con_sys);
+ std::swap(gen_sys, y.gen_sys);
+ std::swap(status, y.status);
+ std::swap(space_dim, y.space_dim);
+ std::swap(dim_kinds, y.dim_kinds);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+/*! \relates Parma_Polyhedra_Library::Grid */
+inline void
+std::swap(Parma_Polyhedra_Library::Grid& x,
+ Parma_Polyhedra_Library::Grid& y) {
+ x.swap(y);
+}
+
+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_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 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,
+ Grid_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,
+ Grid_Generator& point) const {
+ return max_min(expr, "minimize(e, ...)", inf_n, inf_d, minimum, &point);
+}
+
+/*! \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() {
+ return;
+}
+
+} // 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 29
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Bounding_Box dummy)
+ : con_sys(),
+ gen_sys(NECESSARILY_CLOSED) {
+ used(dummy);
+
+ if (box.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(box, from_bounding_box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension");
+
+ space_dim = box.space_dimension();
+
+ TEMP_INTEGER(l_n);
+ TEMP_INTEGER(l_d);
+
+ // Check that all bounds are closed. This must be done before the
+ // empty check below, in case an open bound makes the grid empty.
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // FIXME: Perhaps introduce box::is_bounded_and_closed.
+ if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+ if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+ }
+
+ if (box.is_empty()) {
+ // Empty grid.
+ set_empty();
+ assert(OK());
+ return;
+ }
+
+ if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ // Initialize the space dimension as indicated by the box.
+ con_sys.increase_space_dimension(space_dim);
+ // Add congruences according to `box'.
+ TEMP_INTEGER(u_n);
+ TEMP_INTEGER(u_d);
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // TODO: Consider producing the system(s) in minimized form.
+ // FIXME: Also create the generator system.
+ if (box.get_lower_bound(k, closed, l_n, l_d)) {
+ if (box.get_upper_bound(k, closed, u_n, u_d))
+ 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 * Variable(k) == l_n);
+ continue;
+ }
+ // The only valid bounded interval is a point interval.
+ throw_invalid_argument("Grid(box, from_bounding_box)", "box");
+ }
+ else if (box.get_upper_bound(k, closed, u_n, u_d))
+ // An interval can only be a point or the universe.
+ throw_invalid_argument("Grid(box, from_covering_box)",
+ "box");
+ // A universe interval allows any value in dimension k.
+ }
+ set_congruences_up_to_date();
+ gen_sys.unset_pending_rows();
+ gen_sys.set_sorted(false);
+ }
+
+ assert(OK());
+}
+
+template <typename Box>
+Grid::Grid(const Box& box, From_Covering_Box dummy)
+ : con_sys(),
+ gen_sys(NECESSARILY_CLOSED) {
+ used(dummy);
+
+ if (box.space_dimension() > max_space_dimension())
+ throw_space_dimension_overflow("Grid(box, from_covering_box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension");
+
+ space_dim = box.space_dimension();
+
+ TEMP_INTEGER(l_n);
+ TEMP_INTEGER(l_d);
+
+ // Check that all bounds are closed. This must be done before the
+ // empty check below, in case an open bound makes the grid empty.
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // FIXME: Perhaps introduce box::is_bounded_and_closed.
+ if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_covering_box)", "box");
+ if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("Grid(box, from_covering_box)", "box");
+ }
+
+ if (box.is_empty()) {
+ // Empty grid.
+ set_empty();
+ assert(OK());
+ return;
+ }
+
+ if (space_dim == 0)
+ set_zero_dim_univ();
+ else {
+ // Initialize the space dimension as indicated by the box.
+ con_sys.increase_space_dimension(space_dim);
+ // Add congruences according to `box'.
+ TEMP_INTEGER(u_n);
+ TEMP_INTEGER(u_d);
+ TEMP_INTEGER(d);
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // TODO: Consider producing the system(s) in minimized form.
+ // FIXME: Also create the generator system.
+ if (box.get_lower_bound(k, closed, l_n, l_d)) {
+ if (box.get_upper_bound(k, closed, u_n, u_d)) {
+ if (l_n * u_d == u_n * l_d)
+ // A point interval allows any point along the dimension
+ // k axis.
+ continue;
+ gcd_assign(d, l_d, u_d);
+ // `d' is the gcd of the divisors.
+ l_n *= (u_d / d);
+ d = l_d / d;
+ // `d' is now the smallest integer expression of the size
+ // of l_d relative to u_d. `d * u_d' is the lcm of the
+ // divisors.
+ con_sys.insert((d * u_d * Variable(k) %= l_n) / ((u_n * d) - l_n));
+ }
+ else
+ // An interval bounded only from below produces an
+ // equality.
+ con_sys.insert(l_d * Variable(k) == l_n);
+ }
+ else
+ if (box.get_upper_bound(k, closed, u_n, u_d))
+ // An interval bounded only from above produces an equality.
+ con_sys.insert(u_d * Variable(k) == u_n);
+ else {
+ // Any universe interval produces an empty grid.
+ set_empty();
+ assert(OK());
+ return;
+ }
+ }
+ set_congruences_up_to_date();
+ gen_sys.set_sorted(false);
+ gen_sys.unset_pending_rows();
+ }
+
+ assert(OK());
+}
+
+template <typename Box>
+void
+Grid::shrink_bounding_box(Box& box) const {
+ // Dimension-compatibility check.
+ if (space_dim > box.space_dimension())
+ throw_dimension_incompatible("shrink_bounding_box(box)", "box",
+ box.space_dimension());
+
+ TEMP_INTEGER(l_n);
+ TEMP_INTEGER(l_d);
+
+ // Check that all bounds are closed.
+ for (dimension_type k = space_dim; k-- > 0; ) {
+ bool closed;
+ // FIXME: Perhaps introduce box::is_bounded_and_closed.
+ if (box.get_lower_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("shrink_bounding_box(box)", "box");
+ if (box.get_upper_bound(k, closed, l_n, l_d) && !closed)
+ throw_invalid_argument("shrink_bounding_box(box)", "box");
+ }
+
+ if (marked_empty()) {
+ box.set_empty();
+ return;
+ }
+ if (space_dim == 0)
+ return;
+ if (!generators_are_up_to_date() && !update_generators()) {
+ // Updating found the grid empty.
+ box.set_empty();
+ return;
+ }
+
+ assert(gen_sys.num_generators() > 0);
+
+ dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+ dimension_type num_rows = gen_sys.num_generators();
+
+ // Create a vector to record which dimensions are bounded.
+ std::vector<bool> bounded_interval(num_dims, true);
+
+ const Grid_Generator *first_point = NULL;
+ // Clear the bound flag in `bounded_interval' for all dimensions in
+ // which a line or sequence of points extends away from a single
+ // value in the dimension.
+ for (dimension_type row = 0; row < num_rows; ++row) {
+ Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+ if (gen.is_point()) {
+ if (first_point == NULL) {
+ first_point = &gen_sys[row];
+ continue;
+ }
+ const Grid_Generator& point = *first_point;
+ // Convert the point `gen' to a parameter.
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ gen[dim] -= point[dim];
+ gen.divisor() = point.divisor();
+ }
+ for (dimension_type col = num_dims; col > 0; )
+ if (gen[col--] != 0)
+ bounded_interval[col] = false;
+ }
+
+ // Attempt to set both bounds of each boundable interval to the
+ // value of the associated coefficient in the point.
+ const Grid_Generator& point = *first_point;
+ TEMP_INTEGER(divisor);
+ TEMP_INTEGER(gcd);
+ TEMP_INTEGER(bound);
+ TEMP_INTEGER(reduced_divisor);
+ divisor = point.divisor();
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ if (bounded_interval[dim]) {
+ // Reduce the bound fraction first.
+ gcd_assign(gcd, point[dim+1], divisor);
+ exact_div_assign(bound, point[dim+1], gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ box.raise_lower_bound(dim, true, bound, reduced_divisor);
+ box.lower_upper_bound(dim, true, bound, reduced_divisor);
+ }
+}
+
+template <typename Box>
+void
+Grid::get_covering_box(Box& box) const {
+ // Dimension-compatibility check.
+ if (space_dim > box.space_dimension())
+ throw_dimension_incompatible("get_covering_box(box)", "box",
+ box.space_dimension());
+
+ Box new_box(box.space_dimension());
+
+ if (marked_empty()) {
+ box = new_box;
+ box.set_empty();
+ return;
+ }
+ if (space_dim == 0) {
+ return;
+ }
+ if (!generators_are_up_to_date() && !update_generators()) {
+ // Updating found the grid empty.
+ box = new_box;
+ box.set_empty();
+ return;
+ }
+
+ assert(gen_sys.num_generators() > 0);
+
+ dimension_type num_dims = gen_sys.num_columns() - 2 /* parameter divisor */;
+ dimension_type num_rows = gen_sys.num_generators();
+
+ TEMP_INTEGER(divisor);
+ TEMP_INTEGER(gcd);
+ TEMP_INTEGER(bound);
+ TEMP_INTEGER(reduced_divisor);
+
+ if (num_rows > 1) {
+ Row interval_sizes(num_dims, Row::Flags());
+ std::vector<bool> interval_emptiness(num_dims, false);
+
+ // Store in `interval_sizes', for each column (that is, for each
+ // dimension), the GCD of all the values in that column where the
+ // row is of type parameter.
+
+ for (dimension_type dim = num_dims; dim-- > 0; )
+ interval_sizes[dim] = 0;
+ const Grid_Generator *first_point = NULL;
+ for (dimension_type row = 0; row < num_rows; ++row) {
+ Grid_Generator& gen = const_cast<Grid_Generator&>(gen_sys[row]);
+ if (gen.is_line()) {
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ if (!interval_emptiness[dim] && gen[dim+1] != 0) {
+ // Empty interval, set both bounds for associated
+ // dimension to zero.
+ new_box.lower_upper_bound(dim, true, 0, 1);
+ new_box.raise_lower_bound(dim, true, 0, 1);
+ interval_emptiness[dim] = true;
+ }
+ continue;
+ }
+ if (gen.is_point()) {
+ if (first_point == NULL) {
+ first_point = &gen_sys[row];
+ continue;
+ }
+ const Grid_Generator& point = *first_point;
+ // Convert the point `gen' to a parameter.
+ for (dimension_type dim = 0; dim <= num_dims; ++dim)
+ gen[dim] -= point[dim];
+ gen.divisor() = point.divisor();
+ }
+ for (dimension_type dim = 0; dim < num_dims; ++dim)
+ if (!interval_emptiness[dim])
+ gcd_assign(interval_sizes[dim], interval_sizes[dim], gen[dim+1]);
+ }
+
+ // For each dimension set the lower bound of the interval to the
+ // grid value closest to the origin, and the upper bound to the
+ // addition of the lower bound and the shortest distance in the
+ // given dimension between any two grid points.
+ const Grid_Generator& point = *first_point;
+ divisor = point.divisor();
+ TEMP_INTEGER(lower_bound);
+ for (dimension_type dim = 0; dim < num_dims; ++dim) {
+ if (interval_emptiness[dim])
+ continue;
+
+ lower_bound = point[dim+1];
+
+ // If the interval size is zero then all points have the same
+ // value in this dimension, so set only the lower bound.
+ if (interval_sizes[dim] != 0) {
+ // Make the lower bound as close as possible to the origin,
+ // leaving the sign the same.
+ lower_bound %= interval_sizes[dim];
+ // Check if the lowest value the other side of the origin is
+ // closer to the origin, prefering the lowest positive if they
+ // are equal.
+ if (lower_bound > 0) {
+ if (interval_sizes[dim] - lower_bound < lower_bound)
+ lower_bound -= interval_sizes[dim];
+ }
+ else if (lower_bound < 0
+ && interval_sizes[dim] + lower_bound < - lower_bound)
+ lower_bound += interval_sizes[dim];
+
+ // Reduce the bound fraction first.
+ bound = interval_sizes[dim] + lower_bound;
+ gcd_assign(gcd, bound, divisor);
+ exact_div_assign(bound, bound, gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ new_box.lower_upper_bound(dim, true, bound, reduced_divisor);
+ }
+
+ // Reduce the bound fraction first.
+ gcd_assign(gcd, lower_bound, divisor);
+ exact_div_assign(lower_bound, lower_bound, gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ new_box.raise_lower_bound(dim, true, lower_bound, reduced_divisor);
+ }
+ }
+ else {
+ const Grid_Generator& point = gen_sys[0];
+ divisor = point.divisor();
+ // The covering box of a single point has only lower bounds.
+ for (dimension_type dim = 0; dim < num_dims; ++dim) {
+ // Reduce the bound fraction first.
+ gcd_assign(gcd, point[dim+1], divisor);
+ exact_div_assign(bound, point[dim+1], gcd);
+ exact_div_assign(reduced_divisor, divisor, gcd);
+ new_box.raise_lower_bound(dim, true, bound, reduced_divisor);
+ }
+ }
+
+ box = new_box;
+}
+
+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();
+
+ 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.
+
+ // We first compute suitable permutation cycles for the columns of
+ // the `con_sys' and `gen_sys' matrices. We will represent them
+ // with a linear array, using 0 as a terminator for each cycle
+ // (notice that the columns with index 0 of `con_sys' and
+ // `gen_sys' represent the inhomogeneous terms, and thus are
+ // unaffected by the permutation of dimensions).
+ // Cycles of length 1 will be omitted so that, in the worst case,
+ // we will have `space_dim' elements organized in `space_dim/2'
+ // cycles, which means we will have at most `space_dim/2'
+ // terminators.
+ std::vector<dimension_type> cycles;
+ cycles.reserve(space_dim + space_dim/2);
+
+ // 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;
+ dimension_type k;
+ (void) pfunc.maps(j, k);
+ if (k == j)
+ // Cycle of length 1: skip it.
+ goto skip;
+
+ cycles.push_back(j+1);
+ // Go along the cycle.
+ j = k;
+ } while (!visited[j]);
+ // End of cycle: mark it.
+ cycles.push_back(0);
+ skip:
+ ;
+ }
+ }
+
+ // If `cycles' is empty then `pfunc' is the identity.
+ if (cycles.empty())
+ return;
+
+ // Permute all that is up-to-date.
+ if (congruences_are_up_to_date()) {
+ con_sys.permute_columns(cycles);
+ clear_congruences_minimized();
+ }
+
+ if (generators_are_up_to_date()) {
+ gen_sys.permute_columns(cycles);
+ clear_generators_minimized();
+ }
+
+ 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 = generators();
+
+ if (old_gensys.num_generators() == 0) {
+ // The grid is empty.
+ Grid new_grid(new_space_dimension, EMPTY);
+ std::swap(*this, new_grid);
+ 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;
+ assert(i != old_gensys_end);
+ Coefficient_traits::const_reference system_divisor = i->divisor();
+ for (Grid_Generator_System::const_iterator i = old_gensys.begin();
+ i != old_gensys_end;
+ ++i) {
+ const Grid_Generator& old_g = *i;
+ Linear_Expression e(0 * Variable(new_space_dimension-1));
+ bool all_zeroes = true;
+ for (dimension_type j = space_dim; j-- > 0; ) {
+ if (old_g.coefficient(Variable(j)) != 0
+ && pfunc_maps[j] != not_a_dimension()) {
+ e += Variable(pfunc_maps[j]) * old_g.coefficient(Variable(j));
+ all_zeroes = false;
+ }
+ }
+ switch (old_g.type()) {
+ case Grid_Generator::LINE:
+ if (!all_zeroes)
+ new_gensys.insert(grid_line(e));
+ break;
+ case Grid_Generator::PARAMETER:
+ if (!all_zeroes)
+ new_gensys.insert(parameter(e, system_divisor));
+ break;
+ case Grid_Generator::POINT:
+ new_gensys.insert(grid_point(e, old_g.divisor()));
+ break;
+ case Grid_Generator::CLOSURE_POINT:
+ default:
+ assert(0);
+ }
+ }
+
+ Grid new_grid(new_gensys);
+ std::swap(*this, new_grid);
+
+ assert(OK(true));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Grid.defs.hh line 2484
+
+// 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.defs.hh line 29
+
+//! 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 will be
+ recycled to build the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints contains strict inequalities.
+ */
+ explicit C_Polyhedron(Constraint_System& cs);
+
+ //! 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 will be
+ recycled to build 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(Generator_System& gs);
+
+ //! 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. It is not
+ declared <CODE>const</CODE> because its data-structures will be
+ recycled to build the polyhedron.
+ */
+ explicit C_Polyhedron(const Congruence_System& cgs);
+
+ //! Builds an 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 will be
+ recycled to build the polyhedron.
+ */
+ explicit C_Polyhedron(Congruence_System& cgs);
+
+ /*! \brief
+ Builds a C polyhedron representing the topological closure
+ of the NNC polyhedron \p y.
+ */
+ explicit C_Polyhedron(const NNC_Polyhedron& y);
+
+ //! Builds a C polyhedron out of a generic, interval-based bounding box.
+ /*!
+ For a description of the methods that should be provided by
+ the template class Box, see the documentation of the protected method:
+ template \<typename Box\>
+ Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+ \param box
+ The bounding box representing the polyhedron to be built;
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one from the other
+ constructors.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+
+ \exception std::invalid_argument
+ Thrown if \p box has intervals that are not topologically closed
+ (i.e., having some finite but open bounds).
+ */
+ template <typename Box>
+ C_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+ //! Ordinary copy-constructor.
+ C_Polyhedron(const C_Polyhedron& y);
+
+ /*! \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);
+};
+
+// 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(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NECESSARILY_CLOSED,
+ num_dimensions <= max_space_dimension()
+ ? num_dimensions
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ num_dimensions),
+ kind) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Constraint_System& cs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)){
+}
+
+inline
+C_Polyhedron::C_Polyhedron(Generator_System& gs)
+ : Polyhedron(NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(cs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)){
+}
+
+template <typename Box>
+inline
+C_Polyhedron::C_Polyhedron(const Box& box, From_Bounding_Box)
+ : Polyhedron(NECESSARILY_CLOSED,
+ box.space_dimension() <= max_space_dimension()
+ ? box
+ : (throw_space_dimension_overflow(NECESSARILY_CLOSED,
+ "C_Polyhedron(box): ",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension"), box)) {
+}
+
+inline
+C_Polyhedron::C_Polyhedron(const C_Polyhedron& y)
+ : 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);
+ swap(c_y);
+ return *this;
+}
+
+inline
+C_Polyhedron::~C_Polyhedron() {
+}
+
+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 212
+
+// 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 29
+
+//! 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 will be
+ recycled to build the polyhedron.
+ */
+ explicit NNC_Polyhedron(Constraint_System& cs);
+
+ //! 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 will be
+ recycled to build the polyhedron.
+
+ \exception std::invalid_argument
+ Thrown if the system of generators is not empty but has no points.
+ */
+ explicit NNC_Polyhedron(Generator_System& gs);
+
+ //! 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 will 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 will be
+ recycled to build the polyhedron.
+ */
+ explicit NNC_Polyhedron(Congruence_System& cgs);
+
+ //! Builds an NNC polyhedron from the C polyhedron \p y.
+ explicit NNC_Polyhedron(const C_Polyhedron& y);
+
+ //! Builds an NNC polyhedron out of a generic, interval-based bounding box.
+ /*!
+ For a description of the methods that should be provided by
+ the template class Box, see the documentation of the protected method:
+ template \<typename Box\>
+ Polyhedron::Polyhedron(Topology topol, const Box& box);
+
+ \param box
+ The bounding box representing the polyhedron to be built;
+
+ \param dummy
+ A dummy tag to syntactically differentiate this one from the other
+ constructors.
+
+ \exception std::length_error
+ Thrown if the space dimension of \p box exceeds the maximum allowed
+ space dimension.
+ */
+ template <typename Box>
+ NNC_Polyhedron(const Box& box, From_Bounding_Box dummy);
+
+ //! Ordinary copy-constructor.
+ NNC_Polyhedron(const NNC_Polyhedron& y);
+
+ /*! \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);
+};
+
+// 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 27
+
+namespace Parma_Polyhedra_Library {
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ num_dimensions <= max_space_dimension()
+ ? num_dimensions
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(n, k)",
+ "n exceeds the maximum "
+ "allowed space dimension"),
+ num_dimensions),
+ kind) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Constraint_System& cs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Constraint_System& cs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ cs.space_dimension() <= max_space_dimension()
+ ? cs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(cs)",
+ "the space dimension of cs "
+ "exceeds the maximum allowed "
+ "space dimension"), cs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Generator_System& gs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(Generator_System& gs)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ gs.space_dimension() <= max_space_dimension()
+ ? gs
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(gs)",
+ "the space dimension of gs "
+ "exceeds the maximum allowed "
+ "space dimension"), gs)) {
+}
+
+template <typename Box>
+inline
+NNC_Polyhedron::NNC_Polyhedron(const Box& box, From_Bounding_Box)
+ : Polyhedron(NOT_NECESSARILY_CLOSED,
+ box.space_dimension() <= max_space_dimension()
+ ? box
+ : (throw_space_dimension_overflow(NOT_NECESSARILY_CLOSED,
+ "NNC_Polyhedron(box)",
+ "the space dimension of box "
+ "exceeds the maximum allowed "
+ "space dimension"), box)) {
+}
+
+inline
+NNC_Polyhedron::NNC_Polyhedron(const NNC_Polyhedron& y)
+ : 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);
+ swap(nnc_y);
+ return *this;
+}
+
+inline
+NNC_Polyhedron::~NNC_Polyhedron() {
+}
+
+inline bool
+NNC_Polyhedron::upper_bound_assign_if_exact(const NNC_Polyhedron& y) {
+ return poly_hull_assign_if_exact(y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/NNC_Polyhedron.defs.hh line 186
+
+// Automatically generated from PPL source file ../src/Widening_Function.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Widening_Function;
+
+template <typename PH, typename CS>
+class Limited_Widening_Function;
+
+} // namespace Parma_Polyhedra_Library
+
+// 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.defs.hh line 28
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Wraps a widening method into a function object.
+/*! \ingroup PPL_CXX_interface */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+class Parma_Polyhedra_Library::Widening_Function {
+public:
+ //! The (parametric) type of a widening method.
+ typedef void (PH::* Widening_Method)(const PH&, 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()(PH& x, const PH& 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH, typename CS>
+class Parma_Polyhedra_Library::Limited_Widening_Function {
+public:
+ //! The (parametric) type of a limited widening method.
+ typedef void (PH::* Limited_Widening_Method)(const PH&,
+ const CS&,
+ unsigned*);
+
+ //! Constructor.
+ /*!
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+ */
+ Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CS& 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()(PH& x, const PH& 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 CS& limiting_cs;
+};
+
+namespace Parma_Polyhedra_Library {
+
+//! Wraps a widening method into a function object.
+/*!
+ \relates Polyhedra_Powerset
+
+ \param wm
+ The widening method.
+*/
+template <typename PH>
+Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*));
+
+//! Wraps a limited widening method into a function object.
+/*!
+ \relates Polyhedra_Powerset
+
+ \param lwm
+ The limited widening method.
+
+ \param cs
+ The constraint system limiting the widening.
+*/
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+ const CS& cs);
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Widening_Function.inlines.hh line 1
+/* Widening_Function class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+Widening_Function<PH>::Widening_Function(Widening_Method wm)
+ : w_method(wm) {
+}
+
+template <typename PH>
+inline void
+Widening_Function<PH>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+ (x.*w_method)(y, tp);
+}
+
+template <typename PH, typename CS>
+Limited_Widening_Function<PH, CS>::
+Limited_Widening_Function(Limited_Widening_Method lwm,
+ const CS& cs)
+ : lw_method(lwm), limiting_cs(cs) {
+}
+
+template <typename PH, typename CS>
+inline void
+Limited_Widening_Function<PH, CS>::
+operator()(PH& x, const PH& y, unsigned* tp) const {
+ (x.*lw_method)(y, limiting_cs, tp);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline Widening_Function<PH>
+widen_fun_ref(void (PH::* wm)(const PH&, unsigned*)) {
+ return Widening_Function<PH>(wm);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH, typename CS>
+inline Limited_Widening_Function<PH, CS>
+widen_fun_ref(void (PH::* lwm)(const PH&, const CS&, unsigned*),
+ const CS& cs) {
+ return Limited_Widening_Function<PH, CS>(lwm, cs);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+// Automatically generated from PPL source file ../src/Widening_Function.defs.hh line 125
+
+// 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.defs.hh line 27
+#include <iterator>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+
+template<typename Q, typename R>
+bool operator==(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator!=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator<=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+bool operator>=(const Ptr_Iterator<Q>& x, const Ptr_Iterator<R>& y);
+
+template<typename Q, typename R>
+typename Ptr_Iterator<Q>::difference_type operator-(const Ptr_Iterator<Q>& x,
+ const Ptr_Iterator<R>& 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 // 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>
+#include <cassert>
+
+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>& y)
+ : p(y.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 170
+
+// 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.defs.hh line 29
+#include <cstddef>
+#include <vector>
+
+#ifndef EXTRA_ROW_DEBUG
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \brief
+ When EXTRA_ROW_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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+#define EXTRA_ROW_DEBUG 0
+#endif
+
+
+#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 // 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 EXTRA_ROW_DEBUG
+ //! The capacity of \p impl (only available during debugging).
+ dimension_type capacity_;
+#endif // EXTRA_ROW_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 // 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 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;
+
+ //! 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 EXTRA_ROW_DEBUG
+ //! Returns the capacity of the row (only available during debugging).
+ dimension_type capacity() const;
+#endif // defined(EXTRA_ROW_DEBUG)
+};
+
+namespace Parma_Polyhedra_Library {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! \name Classical comparison operators.
+//@{
+#endif // 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 // 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 // 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;
+ //@}
+
+private:
+ //! The number of coefficients in the row.
+ dimension_type size_;
+
+ //! The vector of coefficients.
+ T vec_[
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ 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);
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+ Parma_Polyhedra_Library::DB_Row<T>& y);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::iter_swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator x,
+ typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/DB_Row.inlines.hh line 1
+/* DB_Row class implementation: inline functions.
+*/
+
+
+#include <cassert>
+#include <algorithm>
+#include <iostream>
+// Automatically generated from PPL source file ../src/DB_Row.inlines.hh line 30
+
+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 CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ return ::operator new(fixed_size + capacity*sizeof(T));
+#else
+ 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 dimension_type
+DB_Row_Impl_Handler<T>::Impl::max_size() {
+ return size_t(-1)/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 EXTRA_ROW_DEBUG
+ capacity_ = 0;
+#endif
+}
+
+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 CXX_SUPPORTS_FLEXIBLE_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
+ assert(y_size > 0);
+ if (y_size > 0) {
+ vec_[0] = y[0];
+ 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
+}
+
+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) {
+ assert(k < size());
+ return vec_[k];
+}
+
+template <typename T>
+inline const T&
+DB_Row_Impl_Handler<T>::Impl::operator[](const dimension_type k) const {
+ 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 EXTRA_ROW_DEBUG
+template <typename T>
+inline dimension_type
+DB_Row<T>::capacity() const {
+ return this->capacity_;
+}
+#endif // EXTRA_ROW_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 CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ const
+#endif
+ dimension_type capacity) {
+ DB_Row<T>& x = *this;
+ assert(capacity <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ if (capacity == 0)
+ ++capacity;
+#endif
+ assert(x.impl == 0);
+ x.impl = new (capacity) typename DB_Row_Impl_Handler<T>::Impl();
+#if EXTRA_ROW_DEBUG
+ 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;
+ assert(x.impl);
+#if EXTRA_ROW_DEBUG
+ 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;
+ assert(x.impl && y.impl);
+#if EXTRA_ROW_DEBUG
+ 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;
+ assert(y.size() <= capacity && capacity <= max_size());
+ allocate(capacity);
+ 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) {
+ 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) {
+ 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>() {
+ assert(y.impl);
+ 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>() {
+ assert(y.impl);
+ 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;
+ assert(x.impl);
+ x.impl->shrink(new_size);
+}
+
+template <typename T>
+inline void
+DB_Row<T>::swap(DB_Row& y) {
+ DB_Row<T>& x = *this;
+ std::swap(x.impl, y.impl);
+#if EXTRA_ROW_DEBUG
+ std::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 EXTRA_ROW_DEBUG
+ x.capacity_ = y.capacity_;
+#endif
+}
+
+template <typename T>
+inline DB_Row<T>&
+DB_Row<T>::operator=(const DB_Row& y) {
+ // Copy-construct `tmp' from `y'.
+ DB_Row tmp(y);
+ // Swap the implementation of `*this' with the one of `tmp'.
+ swap(tmp);
+ // Now `tmp' goes out of scope, so the old `*this' will be destroyed.
+ 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 void
+DB_Row_Impl_Handler<T>::
+Impl::expand_within_capacity(const dimension_type new_size) {
+ assert(size() <= new_size && new_size <= max_size());
+#if !CXX_SUPPORTS_FLEXIBLE_ARRAYS
+ // vec_[0] is already constructed.
+ if (size() == 0 && new_size > 0)
+ 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);
+ bump_size();
+ }
+}
+
+template <typename T>
+void
+DB_Row_Impl_Handler<T>::Impl::shrink(dimension_type new_size) {
+ const dimension_type old_size = size();
+ assert(new_size <= old_size);
+ // Since ~T() does not throw exceptions, nothing here does.
+ set_size(new_size);
+#if !CXX_SUPPORTS_FLEXIBLE_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 CXX_SUPPORTS_FLEXIBLE_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
+ assert(y_size > 0);
+ 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
+}
+
+template <typename T>
+typename DB_Row<T>::iterator
+DB_Row<T>::begin() {
+ DB_Row<T>& x = *this;
+ return iterator(x.impl->vec_);
+}
+
+template <typename T>
+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>
+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>
+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 bool
+DB_Row<T>::OK(const dimension_type row_size,
+ const dimension_type
+#if EXTRA_ROW_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 EXTRA_ROW_DEBUG
+# if !CXX_SUPPORTS_FLEXIBLE_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
+ if (x.capacity_ != row_capacity) {
+ cerr << "DB_Row capacity mismatch: is " << x.capacity_
+ << ", should be " << row_capacity << "."
+ << endl;
+ is_broken = true;
+ }
+#endif
+ 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 EXTRA_ROW_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
+
+ 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>
+inline 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;
+}
+
+/*! \relates DB_Row */
+template <typename T>
+inline bool
+operator!=(const DB_Row<T>& x, const DB_Row<T>& y) {
+ return !(x == y);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Row<T>& x,
+ Parma_Polyhedra_Library::DB_Row<T>& y) {
+ x.swap(y);
+}
+
+/*! \relates Parma_Polyhedra_Library::DB_Row */
+template <typename T>
+inline void
+iter_swap(typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator x,
+ typename std::vector<Parma_Polyhedra_Library::DB_Row<T> >
+ ::iterator y) {
+ swap(*x, *y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/DB_Row.defs.hh line 430
+
+// 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.defs.hh line 31
+#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 // 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 templatic 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 // 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 // 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 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 \ref ascii_dump)
+ 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;
+};
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+void swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+ Parma_Polyhedra_Library::DB_Matrix<T>& 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 DB_Matrix */
+#endif // 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 // 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 // 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,
+ const 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 // 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,
+ const 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 // 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,
+ const 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 28
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename T>
+inline void
+DB_Matrix<T>::swap(DB_Matrix& y) {
+ std::swap(rows, y.rows);
+ std::swap(row_size, y.row_size);
+ std::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
+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) {
+ assert(k < rows.size());
+ return rows[k];
+}
+
+template <typename T>
+inline const DB_Row<T>&
+DB_Matrix<T>::operator[](const dimension_type k) const {
+ 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 // 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 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);
+ assert(OK());
+}
+
+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>
+template <typename U>
+inline
+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);
+ assert(OK());
+}
+
+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;
+}
+
+template <typename T>
+void
+DB_Matrix<T>::grow(const dimension_type new_n_rows) {
+ const dimension_type old_n_rows = rows.size();
+ 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)
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::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) {
+ DB_Row<T> new_row(rows[i],
+ new_matrix.row_size,
+ new_matrix.row_capacity);
+ std::swap(new_matrix.rows[i], new_row);
+ }
+ // Put the new vector into place.
+ 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; ) {
+ DB_Row<T> new_row(rows[i], new_n_rows, new_row_capacity);
+ std::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)
+ new_rows[i].swap(rows[i]);
+ // Put the new vector into place.
+ std::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);
+ swap(new_matrix);
+ return;
+ }
+ }
+ else if (new_n_rows < old_n_rows) {
+ // Drop some rows.
+ rows.erase(rows.begin() + new_n_rows, rows.end());
+ // 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);
+ std::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_UP);
+ // FIXME: V_CVT_STR_UNK is probably not the only possible error.
+ if (!s || r == V_CVT_STR_UNK)
+ return false;
+ }
+ // Check for well-formedness.
+ assert(OK());
+ return true;
+}
+
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline 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 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 // 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);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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:
+ r = PLUS_INFINITY;
+ 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);
+ assert(tmp1 >= 0);
+ Specialization::combine(tmp0, tmp1, dir);
+ }
+ }
+ Specialization::finalize(tmp0, dir);
+ assign_r(r, tmp0, dir);
+ return true;
+}
+
+template <typename Temp>
+struct Rectilinear_Distance_Specialization {
+ static inline void
+ combine(Temp& running, const Temp& current, Rounding_Dir dir) {
+ add_assign_r(running, running, current, dir);
+ }
+
+ static inline void
+ finalize(Temp&, Rounding_Dir) {
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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);
+}
+
+
+template <typename Temp>
+struct Euclidean_Distance_Specialization {
+ static inline void
+ combine(Temp& running, Temp& current, Rounding_Dir dir) {
+ mul_assign_r(current, current, current, dir);
+ add_assign_r(running, running, current, dir);
+ }
+
+ static inline void
+ finalize(Temp& running, Rounding_Dir dir) {
+ sqrt_assign_r(running, running, dir);
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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);
+}
+
+
+template <typename Temp>
+struct L_Infinity_Distance_Specialization {
+ static inline void
+ combine(Temp& running, const Temp& current, Rounding_Dir) {
+ if (current > running)
+ running = current;
+ }
+
+ static inline void
+ finalize(Temp&, Rounding_Dir) {
+ }
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates DB_Matrix */
+#endif // 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);
+}
+
+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 */ //FIXME!!
+#endif // 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
+
+namespace std {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+/*! \relates Parma_Polyhedra_Library::DB_Matrix */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::DB_Matrix<T>& x,
+ Parma_Polyhedra_Library::DB_Matrix<T>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/DB_Matrix.defs.hh line 323
+
+// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 1
+/* BD_Shape class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/BD_Shape.defs.hh line 40
+#include <cstddef>
+#include <iosfwd>
+#include <vector>
+#include <deque>
+
+
+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
+
+//! 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 aren't 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
+ Checked_Number<To, Extended_Number_Policy>.
+*/
+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,
+ const 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
+ Checked_Number<Temp, Extended_Number_Policy>.
+*/
+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);
+
+//! 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,
+ const 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
+ Checked_Number<To, Extended_Number_Policy>.
+*/
+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,
+ const 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
+ Checked_Number<Temp, Extended_Number_Policy>.
+*/
+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,
+ const 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,
+ const 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
+ Checked_Number<To, Extended_Number_Policy>.
+*/
+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,
+ const 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
+ Checked_Number<Temp, Extended_Number_Policy>.
+*/
+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,
+ const 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,
+ const Rounding_Dir dir,
+ Temp& tmp0,
+ Temp& tmp1,
+ Temp& tmp2);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Decodes the constraint \p c as a bounded difference.
+/*!
+ \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_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.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+bool extract_bounded_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);
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extracts leader indices from the predecessor relation.
+#endif // 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. At the
+ interface level, bounded differences are specified using objects of
+ type Constraint: such a constraint is a bounded difference if it is
+ of 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 Constraint object will be mapped
+ into a <EM>correct</EM> approximation that, depending on the expressive
+ power of the chosen template argument \p T, may loose some precision.
+ In particular, constraint objects that do not encode a bounded difference
+ will be simply (and safely) ignored.
+
+ 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, a Constraint object encoding \f$3x - y \leq 1\f$
+ will be safely ignored in all of the above cases.
+
+ 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 considered, the following code
+ will build the same BDS as above (i.e., the constraints 7, 8, and 9
+ are ignored):
+ \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.
+ */
+ typedef Checked_Number<T, Extended_Number_Policy> N;
+
+public:
+ //! The numeric base type upon which bounded differences are built.
+ typedef T base_type;
+
+ /*! \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();
+
+ //! \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.
+ BD_Shape(const BD_Shape& y);
+
+ //! Builds a conservative, upward approximation of \p y.
+ template <typename U>
+ explicit BD_Shape(const BD_Shape<U>& y);
+
+ //! Builds a BDS from the system of constraints \p cs.
+ /*!
+ The BDS inherits the space dimension of \p cs.
+
+ \param cs
+ A system of constraints: constraints that are not
+ \ref Bounded_Difference_Shapes "bounded differences"
+ are ignored (even though they may have contributed
+ to the space dimension).
+
+ \exception std::invalid_argument
+ Thrown if the system of constraints \p cs contains strict inequalities.
+ */
+ BD_Shape(const Constraint_System& cs);
+
+ //! 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.
+ */
+ 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.
+ */
+ BD_Shape(const Polyhedron& ph, 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 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 <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 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
+ or if \p c is a strict inequality or if \p c is not a bounded
+ difference constraint.
+ */
+ Poly_Con_Relation relation_with(const Constraint& c) 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;
+
+ /*! \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. If it is not a bounded difference, it
+ will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or if \p c is a strict inequality.
+ */
+ void add_constraint(const Constraint& c);
+
+ /*! \brief
+ Adds a copy of constraint \p c to the system of bounded differences
+ defining \p *this.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param c
+ The constraint to be added. If it is not a bounded difference, it
+ will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and constraint \p c are dimension-incompatible,
+ or if \p c is a strict inequality.
+ */
+ bool add_constraint_and_minimize(const Constraint& c);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of bounded differences
+ defining \p *this.
+
+ \param cs
+ The constraints that will be added. Constraints that are not bounded
+ differences will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or if \p cs contains a strict inequality.
+ */
+ void add_constraints(const Constraint_System& cs);
+
+ /*! \brief
+ Adds the constraints in \p cs to the system of bounded differences
+ defining \p *this.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraints that will be added. Constraints that are not bounded
+ differences will be simply ignored.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are dimension-incompatible,
+ or if \p cs contains a strict inequality.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ //! 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);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool intersection_assign_and_minimize(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BDS containing the convex union
+ of \p *this and \p y.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ void bds_hull_assign(const BD_Shape& y);
+
+ /*! \brief
+ Assigns to \p *this the smallest BDS containing the convex union
+ of \p *this and \p y.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p y are dimension-incompatible.
+ */
+ bool bds_hull_assign_and_minimize(const BD_Shape& y);
+
+ //! Same as bds_hull_assign.
+ void upper_bound_assign(const BD_Shape& y);
+
+ /*! \brief
+ If the bds-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 bds_hull_assign_if_exact(const BD_Shape& y);
+
+ //! Same as bds_hull_assign_if_exact.
+ bool upper_bound_assign_if_exact(const BD_Shape& 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 dimension-incompatible.
+ */
+ void bds_difference_assign(const BD_Shape& y);
+
+ //! Same as bds_difference_assign.
+ void difference_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());
+
+ /*! \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 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
+ 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>descreasing</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);
+
+ /*! \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
+ Seeing a BDS 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 BDSs
+ corresponding, on entry, to \p *this and \p y, respectively.
+ Upon successful completion, \p *this will represent the BDS
+ \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 BD_Shape& y);
+
+ //! Removes all the specified dimensions.
+ /*!
+ \param to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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 class PartialFunction 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 PartialFunction>
+ void map_space_dimensions(const PartialFunction& pfunc);
+
+ //@} // Member Functions that May Modify the Dimension of the Vector Space
+
+ PPL_OUTPUT_DECLARATIONS;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref ascii_dump)
+ and sets \p *this accordingly. Returns <CODE>true</CODE> if successful,
+ <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ bool ascii_load(std::istream& s);
+
+ friend bool Parma_Polyhedra_Library::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;
+
+ //! 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-dimension
+ 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 \ref ascii_dump)
+ 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 1158
+#undef PPL_IN_BD_Shape_CLASS
+
+ //! The status flags to keep track of the internal state.
+ Status status;
+
+ //! A matrix of Booleans indicating which constraints are redundant.
+ std::vector<std::deque<bool> > redundancy_dbm;
+
+ //! 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();
+
+ //! 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;
+
+ //! Adds the constraint <CODE>dbm[i][j] \<= k</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j, N k);
+ //! Adds the constraint <CODE>dbm[i][j] \<= num/den</CODE>.
+ void add_dbm_constraint(dimension_type i, dimension_type j,
+ Coefficient_traits::const_reference num,
+ Coefficient_traits::const_reference den);
+
+ //! 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 pos_sum 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_den</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_den,
+ const N& pos_sum);
+
+ //! 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 neg_sum 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_den</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_den,
+ const N& neg_sum);
+
+ /*! \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;
+
+#if !defined(__GNUC__) || __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 3)
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<<>(std::ostream& s,
+ const BD_Shape<T>& c);
+#else
+ // This is too lax than wanted.
+ template <typename U>
+ friend std::ostream&
+ Parma_Polyhedra_Library::IO_Operators::operator<<(std::ostream& s,
+ const BD_Shape<U>& c);
+#endif
+
+ //! \name Exception Throwers
+ //@{
+ void throw_dimension_incompatible(const char* method,
+ const BD_Shape& x) 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 Generator& g) const;
+
+ void throw_dimension_incompatible(const char* method,
+ const char* name_row,
+ const Linear_Expression& y) const;
+
+ static void throw_constraint_incompatible(const char* method);
+
+ static void throw_expression_too_complex(const char* method,
+ const Linear_Expression& e);
+
+ static void throw_generic(const char* method, const char* reason);
+ //@} // Exception Throwers
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+void swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+ Parma_Polyhedra_Library::BD_Shape<T>& y);
+
+} // namespace std
+
+// 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;
+}
+
+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() {
+ 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 sep = ' ';
+
+/*! \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 << sep
+ << (test_empty() ? yes : no) << empty << sep
+ << sep
+ << (test_shortest_path_closed() ? yes : no) << sp_closed << sep
+ << (test_shortest_path_reduced() ? yes : no) << sp_reduced << sep;
+}
+
+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;
+ 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 for well-formedness.
+ 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/BD_Shape.inlines.hh line 29
+#include <cassert>
+#include <vector>
+#include <iostream>
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+namespace Implementation {
+namespace BD_Shapes {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Extract the numerator and denominator components of \p from.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+numer_denom(const Checked_Number<T, Policy>& from,
+ Coefficient& num, Coefficient& den) {
+ assert(!is_not_a_number(from)
+ && !is_minus_infinity(from)
+ && !is_plus_infinity(from));
+ mpq_class q;
+ assign_r(q, from, ROUND_NOT_NEEDED);
+ num = q.get_num();
+ den = q.get_den();
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Divides \p x by \p y into \p to, rounding the result towards plus infinity.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename T, typename Policy>
+inline void
+div_round_up(Checked_Number<T, Policy>& to,
+ Coefficient_traits::const_reference x,
+ Coefficient_traits::const_reference y) {
+ mpq_class qx;
+ mpq_class qy;
+ // Note: this code assumes that a Coefficient is always convertible
+ // to an mpq_class without loss of precision.
+ assign_r(qx, x, ROUND_NOT_NEEDED);
+ assign_r(qy, y, ROUND_NOT_NEEDED);
+ div_assign_r(qx, qx, qy, ROUND_NOT_NEEDED);
+ assign_r(to, qx, ROUND_UP);
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the minimum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+min_assign(N& x, const N& y) {
+ if (x > y)
+ x = y;
+}
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Assigns to \p x the maximum between \p x and \p y.
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename N>
+inline void
+max_assign(N& x, const N& y) {
+ if (x < y)
+ x = y;
+}
+
+} // namespace BD_Shapes
+} // namespace Implementation
+
+
+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_empty() const {
+ return status.test_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_empty() {
+ status.set_empty();
+ assert(OK());
+ assert(marked_empty());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::set_zero_dim_univ() {
+ status.set_zero_dim_univ();
+}
+
+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
+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.
+ status.set_shortest_path_closed();
+ }
+ assert(OK());
+}
+
+template <typename T>
+inline
+BD_Shape<T>::BD_Shape(const BD_Shape& y)
+ : 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)
+ : dbm(y.dbm), status(), redundancy_dbm() {
+ // TODO: handle flags properly, possibly taking special cases into account.
+ if (y.marked_empty())
+ set_empty();
+ else if (y.status.test_zero_dim_univ())
+ set_zero_dim_univ();
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraint_and_minimize(const Constraint& c) {
+ add_constraint(c);
+ shortest_path_closure_assign();
+ return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_constraints(const Constraint_System& cs) {
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i)
+ add_constraint(*i);
+ assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::add_constraints_and_minimize(const Constraint_System& cs) {
+ add_constraints(cs);
+ shortest_path_closure_assign();
+ return !marked_empty();
+}
+
+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.
+ status.set_shortest_path_closed();
+ add_constraints(cs);
+ assert(OK());
+}
+
+template <typename T>
+inline dimension_type
+BD_Shape<T>::affine_dimension() const {
+ const dimension_type space_dim = space_dimension();
+
+ // 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>
+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>::swap(BD_Shape& y) {
+ std::swap(dbm, y.dbm);
+ std::swap(status, y.status);
+ std::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
+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;
+}
+
+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
+ r = PLUS_INFINITY;
+ 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
+ r = PLUS_INFINITY;
+ 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) {
+ static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+ static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+ static Checked_Number<Temp, Extended_Number_Policy> 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
+ r = PLUS_INFINITY;
+ 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
+ r = PLUS_INFINITY;
+ 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) {
+ static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+ static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+ static Checked_Number<Temp, Extended_Number_Policy> 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
+ r = PLUS_INFINITY;
+ 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
+ r = PLUS_INFINITY;
+ 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) {
+ static Checked_Number<Temp, Extended_Number_Policy> tmp0;
+ static Checked_Number<Temp, Extended_Number_Policy> tmp1;
+ static Checked_Number<Temp, Extended_Number_Policy> 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,
+ N k) {
+ // Private method: the caller has to ensure the following.
+ 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())
+ status.reset_shortest_path_closed();
+ }
+ assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::add_dbm_constraint(const dimension_type i,
+ const dimension_type j,
+ Coefficient_traits::const_reference num,
+ Coefficient_traits::const_reference den) {
+ // Private method: the caller has to ensure the following.
+ assert(i <= space_dimension() && j <= space_dimension() && i != j);
+ assert(den != 0);
+ N k;
+ Implementation::BD_Shapes::div_round_up(k, num, den);
+ add_dbm_constraint(i, j, k);
+}
+
+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>::bds_hull_assign_and_minimize(const BD_Shape& y) {
+ bds_hull_assign(y);
+ assert(marked_empty()
+ || space_dimension() == 0 || marked_shortest_path_closed());
+ return !marked_empty();
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::upper_bound_assign(const BD_Shape& y) {
+ bds_hull_assign(y);
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::bds_hull_assign_if_exact(const BD_Shape&) {
+ // TODO: this must be properly implemented.
+ return false;
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::upper_bound_assign_if_exact(const BD_Shape& y) {
+ return bds_hull_assign_if_exact(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::difference_assign(const BD_Shape& y) {
+ bds_difference_assign(y);
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::remove_higher_space_dimensions(const dimension_type new_dim) {
+ // Dimension-compatibility check: the variable having
+ // maximum index is the one occurring last in the set.
+ if (new_dim > space_dimension())
+ throw_dimension_incompatible("remove_higher_space_dimensions(nd)",
+ new_dim);
+
+ // 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_dim == space_dimension()) {
+ assert(OK());
+ return;
+ }
+
+ // Shortest-path closure is necessary as in remove_space_dimensions().
+ shortest_path_closure_assign();
+ dbm.resize_no_copy(new_dim + 1);
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether or not reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+
+ // If we removed _all_ dimensions from a non-empty BDS,
+ // the zero-dim universe BDS has been obtained.
+ if (new_dim == 0 && !marked_empty())
+ set_zero_dim_univ();
+ assert(OK());
+}
+
+template <typename T>
+inline bool
+BD_Shape<T>::intersection_assign_and_minimize(const BD_Shape& y) {
+ intersection_assign(y);
+ shortest_path_closure_assign();
+ return !marked_empty();
+}
+
+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) {
+ // See the documentation for polyhedra.
+ C_Polyhedron px(constraints());
+ C_Polyhedron py(y.constraints());
+ px.H79_widening_assign(py, tp);
+ BD_Shape x(px);
+ swap(x);
+ assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::limited_H79_extrapolation_assign(const BD_Shape& y,
+ const Constraint_System& cs,
+ unsigned* tp) {
+ // See the documentation for polyhedra.
+ C_Polyhedron px(constraints());
+ C_Polyhedron py(y.constraints());
+ px.limited_H79_extrapolation_assign(py, cs, tp);
+ BD_Shape x(px);
+ swap(x);
+ assert(OK());
+}
+
+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);
+ // See the documentation for polyhedra.
+ C_Polyhedron px(constraints());
+ C_Polyhedron py(y.constraints());
+ px.time_elapse_assign(py);
+ BD_Shape x(px);
+ swap(x);
+ assert(OK());
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_all_dbm_constraints(const dimension_type v) {
+ assert(0 < v && v <= dbm.num_rows());
+ DB_Row<N>& dbm_v = dbm[v];
+ for (dimension_type i = dbm.num_rows(); i-- > 0; ) {
+ dbm_v[i] = PLUS_INFINITY;
+ dbm[i][v] = PLUS_INFINITY;
+ }
+}
+
+template <typename T>
+inline void
+BD_Shape<T>::forget_binary_dbm_constraints(const dimension_type v) {
+ 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) {
+ dbm_v[i] = PLUS_INFINITY;
+ dbm[i][v] = PLUS_INFINITY;
+ }
+}
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+inline void
+swap(Parma_Polyhedra_Library::BD_Shape<T>& x,
+ Parma_Polyhedra_Library::BD_Shape<T>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// 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 29
+#include <cassert>
+#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 Generator_System& gs)
+ : dbm(gs.space_dimension() + 1), status(), redundancy_dbm() {
+ using Implementation::BD_Shapes::max_assign;
+ using Implementation::BD_Shapes::div_round_up;
+
+ 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();
+ assert(OK());
+ return;
+ }
+
+ const dimension_type space_dim = space_dimension();
+ DB_Row<N>& dbm_0 = dbm[0];
+ N tmp;
+
+ bool dbm_initialized = false;
+ bool point_seen = false;
+ // Going through all the points and closure points.
+ for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+ const Generator& g = *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();
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(Variable(i-1));
+ DB_Row<N>& dbm_i = dbm[i];
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (i != j)
+ div_round_up(dbm_i[j], g.coefficient(Variable(j-1)) - g_i, d);
+ div_round_up(dbm_i[0], -g_i, d);
+ }
+ for (dimension_type j = space_dim; j > 0; --j)
+ div_round_up(dbm_0[j], g.coefficient(Variable(j-1)), 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();
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(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) {
+ div_round_up(tmp, g.coefficient(Variable(j-1)) - 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) {
+ div_round_up(tmp, g.coefficient(Variable(j-1)), 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 std::invalid_argument("PPL::BD_Shape<T>::BD_Shape(gs):\n"
+ "the non-empty generator system gs "
+ "contains no points.");
+
+ // Going through all the lines and rays.
+ for (Generator_System::const_iterator i = gs_begin; i != gs_end; ++i) {
+ const Generator& g = *i;
+ switch (g.type()) {
+ case Generator::LINE:
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(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.coefficient(Variable(j-1)))
+ dbm_i[j] = PLUS_INFINITY;
+ if (g_i != 0)
+ dbm_i[0] = PLUS_INFINITY;
+ }
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g.coefficient(Variable(j-1)) != 0)
+ dbm_0[j] = PLUS_INFINITY;
+ break;
+ case Generator::RAY:
+ for (dimension_type i = space_dim; i > 0; --i) {
+ const Coefficient& g_i = g.coefficient(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.coefficient(Variable(j-1)))
+ dbm_i[j] = PLUS_INFINITY;
+ if (g_i < 0)
+ dbm_i[0] = PLUS_INFINITY;
+ }
+ for (dimension_type j = space_dim; j > 0; --j)
+ if (g.coefficient(Variable(j-1)) > 0)
+ dbm_0[j] = PLUS_INFINITY;
+ break;
+ default:
+ // Points and closure points already dealt with.
+ break;
+ }
+ }
+ status.set_shortest_path_closed();
+ assert(OK());
+}
+
+template <typename T>
+BD_Shape<T>::BD_Shape(const Polyhedron& ph, const Complexity_Class complexity)
+ : dbm(), status(), redundancy_dbm() {
+ using Implementation::BD_Shapes::div_round_up;
+ const dimension_type num_dimensions = ph.space_dimension();
+
+ if (ph.marked_empty()) {
+ *this = BD_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ if (num_dimensions == 0) {
+ *this = BD_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 = BD_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.
+ 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(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(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) {
+ LP_Problem lp;
+ 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(),
+ iend = ph_cs.end(); i != iend; ++i) {
+ const Constraint& c = *i;
+ lp.add_constraint(c.is_equality()
+ ? (Linear_Expression(c) == 0)
+ : (Linear_Expression(c) >= 0));
+ }
+
+ // Check for unsatisfiability.
+ if (!lp.is_satisfiable()) {
+ *this = BD_Shape(num_dimensions, EMPTY);
+ return;
+ }
+
+ // Get all the upper bounds.
+ LP_Problem_Status lp_status;
+ Generator g(point());
+ TEMP_INTEGER(num);
+ TEMP_INTEGER(den);
+ 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);
+ lp_status = lp.solve();
+ if (lp_status == UNBOUNDED_LP_PROBLEM)
+ dbm[0][i] = PLUS_INFINITY;
+ else {
+ assert(lp_status == OPTIMIZED_LP_PROBLEM);
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, num, den);
+ div_round_up(dbm[0][i], num, den);
+ }
+ // 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);
+ lp_status = lp.solve();
+ if (lp_status == UNBOUNDED_LP_PROBLEM)
+ dbm[j][i] = PLUS_INFINITY;
+ else {
+ assert(lp_status == OPTIMIZED_LP_PROBLEM);
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, num, den);
+ div_round_up(dbm[j][i], num, den);
+ }
+ }
+ // Evaluate optimal upper bound for `-x <= ub'.
+ lp.set_objective_function(-x);
+ lp_status = lp.solve();
+ if (lp_status == UNBOUNDED_LP_PROBLEM)
+ dbm[i][0] = PLUS_INFINITY;
+ else {
+ assert(lp_status == OPTIMIZED_LP_PROBLEM);
+ g = lp.optimizing_point();
+ lp.evaluate_objective_function(g, num, den);
+ div_round_up(dbm[i][0], num, den);
+ }
+ }
+ status.set_shortest_path_closed();
+ return;
+ }
+
+ // Extract easy-to-find bounds from constraints.
+ *this = BD_Shape(ph.con_sys);
+}
+
+template <typename T>
+void
+BD_Shape<T>::add_constraint(const Constraint& c) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ 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);
+ // Strict inequalities are not allowed.
+ if (c.is_strict_inequality())
+ throw_constraint_incompatible("add_constraint(c)");
+
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ TEMP_INTEGER(coeff);
+ // Constraints that are not bounded differences are ignored.
+ if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+ return;
+
+ if (num_vars == 0) {
+ // Dealing with a trivial constraint.
+ if (c.inhomogeneous_term() < 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.
+ N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+ if (coeff < 0)
+ coeff = -coeff;
+
+ bool changed = false;
+ // Compute the bound for `x', rounding towards plus infinity.
+ N d;
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ if (x > d) {
+ x = d;
+ changed = true;
+ }
+
+ if (c.is_equality()) {
+ // Also compute the bound for `y', rounding towards plus infinity.
+ div_round_up(d, -c.inhomogeneous_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 system of bounded differences.
+ if (changed && marked_shortest_path_closed())
+ status.reset_shortest_path_closed();
+ 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 system of bounded differences,
+ // let `*this' become empty.
+ if (y_space_dim == 0 && y.marked_empty()) {
+ set_empty();
+ assert(OK());
+ 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);
+ 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())
+ status.reset_shortest_path_closed();
+ 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);
+
+ // The zero-dimensional universe shape contains any other
+ // dimension-compatible shape.
+ // The zero-dimensional empty shape only contains another
+ // zero-dimensional empty shape.
+ if (x_space_dim == 0) {
+ if (!marked_empty())
+ return true;
+ else
+ return y.marked_empty();
+ }
+
+ /*
+ The `y' system of bounded differences need be closed.
+ In fact if, for example, in `*this' we have the constraints:
+
+ x1 - x2 <= 1;
+ x1 <= 3;
+ x2 <= 2;
+
+ in `y' the constraints are:
+
+ x1 - x2 <= 0;
+ x2 <= 1;
+
+ without closure it returns "false", instead if we close `y' we have
+ the implicit constraint
+
+ x1 <= 1;
+
+ and so we obtain the right result "true".
+ */
+ y.shortest_path_closure_assign();
+
+ // An empty shape is contained in any other dimension-compatible shapes.
+ if (y.marked_empty())
+ return true;
+
+ // `*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_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 system of bounded differences 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>
+void
+BD_Shape<T>
+::compute_predecessors(std::vector<dimension_type>& predecessor) const {
+ assert(!marked_empty() && marked_shortest_path_closed());
+ 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 pred_size = dbm.num_rows();
+ // Initially, each variable is leader of its own zero-equivalence class.
+ predecessor.reserve(pred_size);
+ for (dimension_type i = 0; i < pred_size; ++i)
+ predecessor.push_back(i);
+ // Now compute actual predecessors.
+ for (dimension_type i = pred_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]) {
+ N negated_dbm_ji;
+ if (neg_assign_r(negated_dbm_ji, dbm[j][i], ROUND_NOT_NEEDED) == V_EQ
+ && negated_dbm_ji == 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 {
+ assert(!marked_empty() && marked_shortest_path_closed());
+ assert(leaders.size() == 0);
+ // Compute predecessor information.
+ compute_predecessors(leaders);
+ // Flatten the predecessor chains so as to obtain leaders.
+ assert(leaders[0] == 0);
+ for (dimension_type i = 1, iend = leaders.size(); i != iend; ++i) {
+ const dimension_type l_i = leaders[i];
+ assert(l_i <= i);
+ if (l_i != i) {
+ const dimension_type ll_i = leaders[l_i];
+ assert(ll_i == leaders[ll_i]);
+ leaders[i] = ll_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;
+
+ // 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;
+ const dimension_type x_space_dim = x_copy.space_dimension();
+ x_copy.shortest_path_closure_assign();
+ // If we just discovered emptyness, 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(x_space_dim + 1);
+
+ // We store the leader.
+ for (dimension_type i = x_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 < x_space_dim; ++i) {
+ const DB_Row<N>& xdbm_i = x_copy.dbm[i];
+ for (dimension_type j = i + 1; j <= x_space_dim; ++j) {
+ N negated_xdbm_ji;
+ if (neg_assign_r(negated_xdbm_ji, x_copy.dbm[j][i],
+ ROUND_NOT_NEEDED) == V_EQ
+ && negated_xdbm_ji == xdbm_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 systems of bounded differences, 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.
+ N c;
+ for (dimension_type k = 0; k <= x_space_dim; ++k)
+ if (leader[k] == k) {
+ const DB_Row<N>& x_k = x_copy.dbm[k];
+ for (dimension_type i = 0; i <= x_space_dim; ++i)
+ if (leader[i] == i) {
+ const DB_Row<N>& x_i = x_copy.dbm[i];
+ const std::deque<bool>& redundancy_i = redundancy_dbm[i];
+ const N& x_i_k = x_i[k];
+ for (dimension_type j = 0; j <= x_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(x_space_dim + 1);
+ for (dimension_type i = x_space_dim + 1; i-- > 0; )
+ var_conn[i] = x_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 no-leader with only another zero-equivalent one.
+ for (dimension_type i = 0; i <= x_space_dim; ++i) {
+ // It count with how many variables the selected variable is
+ // connected.
+ dimension_type t = 0;
+ dimension_type ld_i = leader[i];
+ // Case a: leader.
+ if (ld_i == i) {
+ for (dimension_type j = 0; j <= x_space_dim; ++j) {
+ dimension_type ld_j = leader[j];
+ // Only the connectedness with equivalent variables
+ // is considered.
+ if (j != ld_j)
+ if (!redundancy_dbm[i][j]) {
+ if (t == 1)
+ // Two no-leaders couldn't connected with the same leader.
+ return false;
+ else
+ if (ld_j != i)
+ // The variables isn't in the same equivalence class.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ }
+ }
+ // Case b: no-leader.
+ else {
+ for (dimension_type j = 0; j <= x_space_dim; ++j) {
+ if (!redundancy_dbm[i][j]) {
+ dimension_type ld_j = leader[j];
+ if (ld_i != ld_j)
+ // The variables isn't in the same equivalence class.
+ return false;
+ else {
+ if (t == 1)
+ // Two variables couldn't connected with the same leader.
+ return false;
+ else {
+ ++t;
+ var_conn[i] = j;
+ }
+ }
+ // A no-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(x_space_dim + 1);
+ for (dimension_type i = x_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 <= x_space_dim; ++i) {
+ bool jc_i = just_checked[i];
+ // We do not re-check the already considered single cycles.
+ if (!jc_i) {
+ dimension_type v_con = var_conn[i];
+ // We consider only the equivalence classes with
+ // 2 or plus variables.
+ if (v_con != x_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>
+Poly_Con_Relation
+BD_Shape<T>::relation_with(const Constraint& c) const {
+ using Implementation::BD_Shapes::div_round_up;
+
+ 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;
+ TEMP_INTEGER(coeff);
+ // Constraints that are not bounded differences are not compatible.
+ if (!extract_bounded_difference(c, c_space_dim, num_vars, i, j, coeff))
+ throw_constraint_incompatible("relation_with(c)");
+
+ 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:
+ 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 N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+ if (coeff < 0)
+ coeff = -coeff;
+ N d;
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ N d1;
+ div_round_up(d1, -c.inhomogeneous_term(), coeff);
+
+ switch (c.type()) {
+ case Constraint::EQUALITY:
+ if (d == x && d1 == y)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else if (d < y && d1 > x)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case Constraint::NONSTRICT_INEQUALITY:
+ if (d >= x && d1 >= y)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_included();
+ else if (d >= x)
+ return Poly_Con_Relation::is_included();
+ else if (d < x && d1 > y)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ case Constraint::STRICT_INEQUALITY:
+ if (d >= x && d1 >= y)
+ return Poly_Con_Relation::saturates()
+ && Poly_Con_Relation::is_disjoint();
+ else if (d > x)
+ return Poly_Con_Relation::is_included();
+ else if (d <= x && d1 >= y)
+ return Poly_Con_Relation::is_disjoint();
+ else
+ return Poly_Con_Relation::strictly_intersects();
+ }
+ // Quiet a compiler warning: this program point is unreachable.
+ throw std::runtime_error("PPL internal error");
+}
+
+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);
+
+ // The empty bdiff cannot subsume a generator.
+ if (marked_empty())
+ return Poly_Gen_Relation::nothing();
+
+ // A universe BD shape 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();
+
+ // The relation between the bdiff and the given generator is obtained
+ // checking if the generator satisfies all the constraints in the bdiff.
+ // 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 bdiff.
+
+ // We find in `*this' all the constraints.
+ for (dimension_type i = 0; i <= space_dim; ++i) {
+ for (dimension_type j = i + 1; j <= space_dim; ++j) {
+ const Variable x(j - 1);
+ const bool x_dimension_incompatible = x.space_dimension() > g_space_dim;
+ const N& dbm_ij = dbm[i][j];
+ const N& dbm_ji = dbm[j][i];
+ N negated_dbm_ji;
+ const bool is_equality
+ = neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+ && negated_dbm_ji == dbm_ij;
+ const bool dbm_ij_is_infinity = is_plus_infinity(dbm_ij);
+ const bool dbm_ji_is_infinity = is_plus_infinity(dbm_ji);
+ if (i != 0) {
+ const Variable y(i - 1);
+ const bool y_dimension_incompatible
+ = y.space_dimension() > g_space_dim;
+ const bool is_trivial_zero
+ = (x_dimension_incompatible && g.coefficient(y) == 0)
+ || (y_dimension_incompatible && g.coefficient(x) == 0)
+ || (x_dimension_incompatible && y_dimension_incompatible);
+ if (is_equality) {
+ // We have one equality constraint.
+ // The constraint has form ax - ay = b.
+ // The scalar product has the form
+ // 'a * y_i - a * x_j'
+ // where y_i = g.coefficient(y) and x_j = g.coefficient(x).
+ // It is not zero when both the coefficients of the
+ // variables x and y are not zero or when these coefficients
+ if (!is_trivial_zero && g.coefficient(x) != g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // We have the binary inequality constraints.
+ if (!dbm_ij_is_infinity) {
+ // The constraint has form ax - ay <= b.
+ // The scalar product has the form
+ // 'a * y_i - a * x_j'
+ if (is_line
+ && !is_trivial_zero
+ && g.coefficient(x) != g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ else
+ if (g.coefficient(y) < g.coefficient(x))
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (!dbm_ji_is_infinity) {
+ // The constraint has form ay - ax <= b.
+ // The scalar product has the form
+ // 'a * x_j - a* y_i'.
+ if (is_line
+ && !is_trivial_zero
+ && g.coefficient(x) != g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ else if (g.coefficient(x) < g.coefficient(y))
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ else {
+ // Here i == 0.
+ if (is_equality) {
+ // The constraint has form ax = b.
+ // To satisfy the constraint it's necessary that the scalar product
+ // is not zero.It happens when the coefficient of the variable 'x'
+ // in the generator is not zero, because the scalar
+ // product has the form:
+ // 'a * x_i' where x_i = g.coefficient(x)..
+ if (!x_dimension_incompatible && g.coefficient(x) != 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else
+ // We have the unary inequality constraints.
+ if (!dbm_ij_is_infinity) {
+ // The constraint has form ax <= b.
+ // The scalar product has the form:
+ // '-a * x_i' where x_i = g.coefficient(x).
+ if (is_line
+ && !x_dimension_incompatible
+ && g.coefficient(x) != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (g.coefficient(x) > 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ else if (!dbm_ji_is_infinity) {
+ // The constraint has form -ax <= b.
+ // The scalar product has the form:
+ // 'a * x_i' where x_i = g.coefficient(x).
+ if (is_line
+ && !x_dimension_incompatible
+ && g.coefficient(x) != 0)
+ return Poly_Gen_Relation::nothing();
+ else if (g.coefficient(x) < 0)
+ return Poly_Gen_Relation::nothing();
+ }
+ }
+ }
+ }
+ return Poly_Gen_Relation::subsumes();
+}
+
+template <typename T>
+void
+BD_Shape<T>::shortest_path_closure_assign() const {
+ using Implementation::BD_Shapes::min_assign;
+
+ // 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; ) {
+ assert(is_plus_infinity(x.dbm[h][h]));
+ assign_r(x.dbm[h][h], 0, ROUND_NOT_NEEDED);
+ }
+
+ N sum;
+ for (dimension_type k = num_dimensions + 1; k-- > 0; ) {
+ const DB_Row<N>& xdbm_k = x.dbm[k];
+ for (dimension_type i = num_dimensions + 1; i-- > 0; ) {
+ DB_Row<N>& xdbm_i = x.dbm[i];
+ const N& xdbm_i_k = xdbm_i[k];
+ if (!is_plus_infinity(xdbm_i_k))
+ for (dimension_type j = num_dimensions + 1; j-- > 0; ) {
+ const N& xdbm_k_j = xdbm_k[j];
+ if (!is_plus_infinity(xdbm_k_j)) {
+ // Rounding upward for correctness.
+ add_assign_r(sum, xdbm_i_k, xdbm_k_j, ROUND_UP);
+ min_assign(xdbm_i[j], sum);
+ }
+ }
+ }
+ }
+
+ // Check for emptyness: 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 (x_dbm_hh < 0) {
+ x.status.set_empty();
+ return;
+ }
+ else {
+ assert(x_dbm_hh == 0);
+ // Restore PLUS_INFINITY on the main diagonal.
+ x_dbm_hh = PLUS_INFINITY;
+ }
+ }
+
+ // The BDS is not empty and it is now shortest-path closed.
+ x.status.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;
+
+ // First find the tighest 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();
+
+ const dimension_type space_dim = space_dimension();
+ // TODO: directly work on `redundancy_dbm' so as to minimize allocations.
+ std::deque<bool> redundancy_row(space_dim + 1, true);
+ std::vector<std::deque<bool> > redundancy(space_dim + 1, redundancy_row);
+
+ // Step 2: flag non-redundant constraints in the (zero-cycle-free)
+ // subsystem of bounded differences having only leaders as variables.
+ 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];
+ std::deque<bool>& 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[j] = false;
+ 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[j] = true;
+ 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 pred_j = predecessor[j];
+ if (j == pred_j) {
+ // We finally found the leader of `i'.
+ assert(redundancy[i][j]);
+ redundancy[i][j] = false;
+ // Here we dealt with `j' (i.e., `pred_j'), but it is useless
+ // to update `dealt_with' because `j' is a leader.
+ break;
+ }
+ // We haven't found the leader of `i' yet.
+ assert(redundancy[pred_j][j]);
+ redundancy[pred_j][j] = false;
+ dealt_with[pred_j] = true;
+ j = pred_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);
+ std::swap(x.redundancy_dbm, redundancy);
+ x.status.set_shortest_path_reduced();
+
+ assert(is_shortest_path_reduced());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_hull_assign(const BD_Shape& y) {
+ const dimension_type space_dim = space_dimension();
+
+ // Dimension-compatibility check.
+ if (space_dim != y.space_dimension())
+ throw_dimension_incompatible("bds_hull_assign(y)", y);
+
+ // The poly-hull of a polyhedron `bd' with an empty polyhedron 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'.
+ 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;
+ }
+ }
+ // The result is still closed.
+ assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::bds_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("bds_difference_assign(y)", y);
+
+ BD_Shape new_bdiffs(space_dim, EMPTY);
+
+ BD_Shape& x = *this;
+
+ x.shortest_path_closure_assign();
+ // The difference of an empty system of bounded differences
+ // and of a system of bounded differences `p' is empty.
+ if (x.marked_empty())
+ return;
+ y.shortest_path_closure_assign();
+ // The difference of a system of bounded differences `p'
+ // and an empty system of bounded differences is `p'.
+ if (y.marked_empty())
+ return;
+
+ // If both systems of bounded differences 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 complementaries 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 system of bounded differences `x' is included
+ // in the system of bounded differences defined by `c',
+ // then `c' _must_ be skipped, as adding its complement to `x'
+ // would result in the empty system of bounded differences,
+ // 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 = Linear_Expression(c);
+ bool change = false;
+ if (c.is_nonstrict_inequality())
+ change = z.add_constraint_and_minimize(e <= 0);
+ if (c.is_equality()) {
+ BD_Shape w = x;
+ if (w.add_constraint_and_minimize(e <= 0))
+ new_bdiffs.bds_hull_assign(w);
+ change = z.add_constraint_and_minimize(e >= 0);
+ }
+ if (change)
+ new_bdiffs.bds_hull_assign(z);
+ }
+ *this = new_bdiffs;
+ // The result is still closed, because both bds_hull_assign() and
+ // add_constraint_and_minimize() preserve closure.
+ assert(OK());
+}
+
+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 system of bounded differences,
+ // 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())
+ status.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)
+ status.set_shortest_path_closed();
+
+ 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);
+ }
+ status.set_shortest_path_closed();
+ }
+ assert(OK());
+ return;
+ }
+
+ // To project an n-dimension space system of bounded differences
+ // 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())
+ status.reset_shortest_path_closed();
+ assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::remove_space_dimensions(const Variables_Set& to_be_removed) {
+ // 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 (to_be_removed.empty()) {
+ assert(OK());
+ return;
+ }
+
+ // Dimension-compatibility check: the variable having
+ // maximum cardinality is the one occurring last in the set.
+ const dimension_type max_dim_to_be_removed = to_be_removed.rbegin()->id();
+ const dimension_type old_space_dim = space_dimension();
+ if (max_dim_to_be_removed >= old_space_dim)
+ throw_dimension_incompatible("remove_space_dimensions(vs)",
+ max_dim_to_be_removed);
+
+ // 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 - to_be_removed.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();
+ assert(OK());
+ return;
+ }
+
+ // Shortest-path closure is maintained.
+ // TODO: see whether reduction can be (efficiently!) maintained too.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+
+ // For each variable to remove, we erase the corresponding column and
+ // row by shifting the other columns and rows, than are not removed,
+ // respectively left and above.
+ Variables_Set::const_iterator tbr = to_be_removed.begin();
+ Variables_Set::const_iterator tbr_end = to_be_removed.end();
+ dimension_type dst = tbr->id() + 1;
+ dimension_type src = dst + 1;
+ for (++tbr; tbr != tbr_end; ++tbr) {
+ const dimension_type tbr_next = tbr->id() + 1;
+ // All other columns and rows are moved respectively to the left
+ // and above.
+ while (src < tbr_next) {
+ dbm[dst] = dbm[src];
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ dbm_i[dst] = dbm_i[src];
+ }
+ ++dst;
+ ++src;
+ }
+ ++src;
+ }
+
+ // Moving the remaining rows and columns.
+ while (src <= old_space_dim) {
+ dbm[dst] = dbm[src];
+ for (dimension_type i = old_space_dim + 1; i-- > 0; ) {
+ DB_Row<N>& dbm_i = dbm[i];
+ dbm_i[dst] = dbm_i[src];
+ }
+ ++src;
+ ++dst;
+ }
+
+ // Update the space dimension.
+ dbm.resize_no_copy(new_space_dim + 1);
+ assert(OK());
+}
+
+template <typename T>
+template <typename PartialFunction>
+void
+BD_Shape<T>::map_space_dimensions(const PartialFunction& 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);
+ assert(OK());
+ 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 system of bounded differences.
+ 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())
+ status.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.
+ const 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)) {
+ x_0[new_j + 1] = dbm_0[j];
+ 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)) {
+ const 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;
+ x_new_i[new_j] = dbm_i[j];
+ x[new_j][new_i] = dbm[j][i];
+ }
+ }
+ }
+ }
+
+ std::swap(dbm, x);
+ 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 systems of bounded differences is empty,
+ // the intersection is empty.
+ if (marked_empty())
+ return;
+ if (y.marked_empty()) {
+ set_empty();
+ return;
+ }
+
+ // If both systems of bounded differences 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 systems of bounded differences 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())
+ status.reset_shortest_path_closed();
+ 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);
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // If both systems of bounded differences 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
+ dbm_ij = PLUS_INFINITY;
+ }
+ }
+ }
+ status.reset_shortest_path_closed();
+ assert(OK());
+}
+
+template <typename T>
+void
+BD_Shape<T>::get_limiting_shape(const Constraint_System& cs,
+ BD_Shape& limiting_shape) const {
+ using Implementation::BD_Shapes::div_round_up;
+
+ const dimension_type cs_space_dim = cs.space_dimension();
+ // Private method: the caller has to ensure the following.
+ assert(cs_space_dim <= space_dimension());
+
+ bool changed = false;
+ for (Constraint_System::const_iterator i = cs.begin(),
+ iend = cs.end(); i != iend; ++i) {
+ const Constraint& c = *i;
+ dimension_type num_vars = 0;
+ dimension_type i = 0;
+ dimension_type j = 0;
+ TEMP_INTEGER(coeff);
+ // Constraints that are not bounded differences are ignored.
+ if (extract_bounded_difference(c, cs_space_dim, 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 N& x = (coeff < 0) ? dbm[i][j] : dbm[j][i];
+ const N& y = (coeff < 0) ? dbm[j][i] : dbm[i][j];
+ DB_Matrix<N>& ls_dbm = limiting_shape.dbm;
+ N& ls_x = (coeff < 0) ? ls_dbm[i][j] : ls_dbm[j][i];
+ N& ls_y = (coeff < 0) ? ls_dbm[j][i] : ls_dbm[i][j];
+ if (coeff < 0)
+ coeff = -coeff;
+ // Compute the bound for `x', rounding towards plus infinity.
+ N d;
+ div_round_up(d, c.inhomogeneous_term(), coeff);
+ if (x <= d)
+ if (c.is_inequality())
+ if (ls_x > d) {
+ ls_x = d;
+ changed = true;
+ }
+ else {
+ // Compute the bound for `y', rounding towards plus infinity.
+ div_round_up(d, -c.inhomogeneous_term(), coeff);
+ if (y <= d)
+ if (ls_y > d) {
+ ls_y = d;
+ changed = true;
+ }
+
+ }
+ }
+ }
+
+ // In general, adding a constraint does not preserve the shortest-path
+ // closure of the system of bounded differences.
+ if (changed && limiting_shape.marked_shortest_path_closed())
+ limiting_shape.status.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_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 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;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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);
+ assert(OK());
+}
+
+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);
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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();
+ 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.
+ 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 std::deque<bool>& 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)
+ dbm_ij = PLUS_INFINITY;
+ }
+ }
+ // 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.
+ status.reset_shortest_path_closed();
+ 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_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+ "(y, cs)");
+
+ // Strict inequalities are not allowed.
+ if (cs.has_strict_inequalities())
+ throw_constraint_incompatible("limited_BHMZ05_extrapolation_assign"
+ "(y, cs)");
+
+ // 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;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' is contained in or equal to `*this'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(x_copy.contains(y_copy));
+ }
+#endif
+
+ // 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);
+ assert(OK());
+}
+
+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);
+
+#ifndef NDEBUG
+ {
+ // We assume that `*this' is contained in or equal to `y'.
+ const BD_Shape x_copy = *this;
+ const BD_Shape y_copy = y;
+ assert(y_copy.contains(x_copy));
+ }
+#endif
+
+ // If both systems of bounded differences 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())
+ status.reset_shortest_path_closed();
+ 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_den,
+ const N& pos_sum) {
+ // 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/den' 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)'.
+ mpq_class mpq_sc_den;
+ assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+ const DB_Row<N>& dbm_0 = dbm[0];
+ // No need to consider indices greater than `last_v'.
+ for (dimension_type u = last_v; u > 0; --u)
+ if (u != v) {
+ const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+ if (expr_u > 0)
+ if (expr_u >= sc_den)
+ // Deducing `v - u <= ub_v - ub_u'.
+ sub_assign_r(dbm[u][v], pos_sum, dbm_0[u], ROUND_UP);
+ else {
+ DB_Row<N>& dbm_u = dbm[u];
+ 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_den' be the
+ // rational coefficient of `u' in `sc_expr/sc_den',
+ // the upper bound for `v - u' is computed as
+ // `ub_v - (q * ub_u + (1-q) * lb_u)', i.e.,
+ // `pos_sum + (-lb_u) - q * (ub_u + (-lb_u))'.
+ mpq_class minus_lb_u;
+ assign_r(minus_lb_u, dbm_u0, ROUND_NOT_NEEDED);
+ mpq_class q;
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+ mpq_class ub_u;
+ assign_r(ub_u, dbm_0[u], 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);
+ N up_approx;
+ 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], pos_sum, 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_den,
+ const N& neg_sum) {
+ // 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/den' 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'.
+ mpq_class mpq_sc_den;
+ assign_r(mpq_sc_den, sc_den, ROUND_NOT_NEEDED);
+ DB_Row<N>& dbm_0 = dbm[0];
+ DB_Row<N>& dbm_v = dbm[v];
+ // No need to consider indices greater than `last_v'.
+ for (dimension_type u = last_v; u > 0; --u)
+ if (u != v) {
+ const Coefficient& expr_u = sc_expr.coefficient(Variable(u-1));
+ if (expr_u > 0)
+ if (expr_u >= sc_den)
+ // Deducing `u - v <= lb_u - lb_v',
+ // i.e., `u - v <= (-lb_v) - (-lb_u)'.
+ sub_assign_r(dbm_v[u], neg_sum, dbm[u][0], ROUND_UP);
+ else {
+ const N& dbm_0u = dbm_0[u];
+ 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_den' be the
+ // rational coefficient of `u' in `sc_expr/sc_den',
+ // 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)) + neg_sum'.
+ mpq_class ub_u;
+ assign_r(ub_u, dbm_0u, ROUND_NOT_NEEDED);
+ mpq_class q;
+ assign_r(q, expr_u, ROUND_NOT_NEEDED);
+ div_assign_r(q, q, mpq_sc_den, ROUND_NOT_NEEDED);
+ mpq_class minus_lb_u;
+ assign_r(minus_lb_u, dbm[u][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);
+ N up_approx;
+ 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], up_approx, neg_sum, ROUND_UP);
+ }
+ }
+ }
+}
+
+template <typename T>
+void
+BD_Shape<T>::affine_image(const Variable var,
+ const Linear_Expression& expr,
+ Coefficient_traits::const_reference denominator) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_generic("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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ w = i+1;
+
+ // 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.
+ TEMP_INTEGER(minus_den);
+ neg_assign(minus_den, 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())
+ status.reset_shortest_path_reduced();
+ // Add the constraint `var == b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ add_dbm_constraint(v, 0, b, minus_den);
+ assert(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.coefficient(Variable(w-1));
+ if (a == denominator || a == minus_den) {
+ // 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'.
+ N d;
+ div_round_up(d, b, denominator);
+ N c;
+ div_round_up(c, b, minus_den);
+ 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'.
+ std::swap(dbm[v][0], dbm[0][v]);
+ // Shortest-path closure is not preserved.
+ status.reset_shortest_path_closed();
+ if (b != 0) {
+ // Translate the unary constraints on `var',
+ // adding or subtracting the value `b/denominator'.
+ N c;
+ div_round_up(c, b, minus_den);
+ N& dbm_v0 = dbm[v][0];
+ add_assign_r(dbm_v0, dbm_v0, c, ROUND_UP);
+ 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())
+ status.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_den);
+ }
+ 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'.
+ N d;
+ div_round_up(d, b, denominator);
+ add_assign_r(dbm[0][v], d, dbm_w0, ROUND_UP);
+ status.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'.
+ N c;
+ div_round_up(c, b, minus_den);
+ add_assign_r(dbm[v][0], dbm_0w, c, ROUND_UP);
+ status.reset_shortest_path_closed();
+ }
+ }
+ }
+ 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);
+ TEMP_INTEGER(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_den = is_sc ? denominator : minus_den;
+ const Coefficient& minus_sc_den = is_sc ? minus_den : 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;
+
+ N pos_sum;
+ N neg_sum;
+ // Indices of the variables that are unbounded in `this->dbm'.
+ // (The initializations are just to quiet a compiler warning.)
+ dimension_type pos_pinf_index = 0;
+ dimension_type neg_pinf_index = 0;
+ // 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'.
+ // Note: indices above `w' can be disregarded, as they all have
+ // a zero coefficient in `sc_expr'.
+ const DB_Row<N>& dbm_0 = dbm[0];
+ for (dimension_type i = w; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i > 0) {
+ N coeff_i;
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i];
+ 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;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i][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;
+ }
+ }
+ }
+ else if (sign_i < 0) {
+ TEMP_INTEGER(minus_sc_i);
+ neg_assign(minus_sc_i, sc_i);
+ N minus_coeff_i;
+ assign_r(minus_coeff_i, minus_sc_i, ROUND_UP);
+ // Approximating `sc_expr'.
+ if (pos_pinf_count <= 1) {
+ const N& up_approx_minus_i = dbm[i][0];
+ if (!is_plus_infinity(up_approx_minus_i))
+ add_mul_assign_r(pos_sum,
+ minus_coeff_i, up_approx_minus_i, ROUND_UP);
+ else {
+ ++pos_pinf_count;
+ pos_pinf_index = i;
+ }
+ }
+ // Approximating `-sc_expr'.
+ if (neg_pinf_count <= 1) {
+ const N& up_approx_i = dbm_0[i];
+ if (!is_plus_infinity(up_approx_i))
+ add_mul_assign_r(neg_sum, minus_coeff_i, up_approx_i, ROUND_UP);
+ else {
+ ++neg_pinf_count;
+ neg_pinf_index = i;
+ }
+ }
+ }
+ }
+
+ // Remove all constraints on 'v'.
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is maintained, but not reduction.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pos_pinf_count > 1 && neg_pinf_count > 1) {
+ assert(OK());
+ return;
+ }
+
+ // In the following, shortest-path closure will be definitely lost.
+ status.reset_shortest_path_closed();
+
+ // Before computing quotients, the denominator should be approximated
+ // towards zero. Since `sc_den' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+
+ // Exploit the upper approximation, if possible.
+ if (pos_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_den != 1)
+ div_assign_r(pos_sum, pos_sum, down_sc_den, ROUND_UP);
+ // Add the upper bound constraint, if meaningful.
+ if (pos_pinf_count == 0) {
+ // Add the constraint `v <= pos_sum'.
+ DB_Row<N>& dbm_0 = dbm[0];
+ assign_r(dbm_0[v], pos_sum, ROUND_UP);
+ // Deduce constraints of the form `v - u', where `u != v'.
+ deduce_v_minus_u_bounds(v, w, sc_expr, sc_den, pos_sum);
+ }
+ else
+ // Here `pos_pinf_count == 1'.
+ if (pos_pinf_index != v
+ && sc_expr.coefficient(Variable(pos_pinf_index-1)) == sc_den)
+ // Add the constraint `v - pos_pinf_index <= pos_sum'.
+ assign_r(dbm[pos_pinf_index][v], pos_sum, ROUND_UP);
+ }
+
+ // Exploit the lower approximation, if possible.
+ if (neg_pinf_count <= 1) {
+ // Compute quotient (if needed).
+ if (down_sc_den != 1)
+ div_assign_r(neg_sum, neg_sum, down_sc_den, 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];
+ assign_r(dbm_v[0], neg_sum, ROUND_UP);
+ // Deduce constraints of the form `u - v', where `u != v'.
+ deduce_u_minus_v_bounds(v, w, sc_expr, sc_den, neg_sum);
+ }
+ else
+ // Here `neg_pinf_count == 1'.
+ if (neg_pinf_index != v
+ && sc_expr.coefficient(Variable(neg_pinf_index-1)) == sc_den)
+ // Add the constraint `v - neg_pinf_index >= -neg_sum',
+ // i.e., `neg_pinf_index - v <= neg_sum'.
+ assign_r(dbm[v][neg_pinf_index], neg_sum, ROUND_UP);
+ }
+
+ assert(OK());
+}
+
+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_generic("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 systems of bounded differences.
+ 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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ j = i;
+
+ // 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())
+ status.reset_shortest_path_reduced();
+ assert(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.coefficient(Variable(j));
+ if (a == denominator || a == -denominator) {
+ // Case 2: expr = a*w + b, with a = +/- denominator.
+ if (j == var.id())
+ // Apply affine_image() on the inverse of this transformation.
+ affine_image(var, a*var - b, denominator);
+ 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())
+ status.reset_shortest_path_reduced();
+ }
+ 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())
+ status.reset_shortest_path_reduced();
+ }
+ assert(OK());
+}
+
+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) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_generic("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_generic("generalized_affine_image(v, r, e, d)",
+ "r is a strict relation symbol and "
+ "*this is a BD_Shape");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "==":
+ // this is just an affine image computation.
+ affine_image(var, expr, denominator);
+ assert(OK());
+ 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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ w = i+1;
+
+ // 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];
+ TEMP_INTEGER(minus_den);
+ neg_assign(minus_den, 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.
+ status.reset_shortest_path_closed();
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, b, minus_den);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ assert(OK());
+ return;
+ }
+
+ if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& a = expr.coefficient(Variable(w-1));
+ if (a == denominator || a == minus_den) {
+ // Case 2: expr == a*w + b, with a == +/- denominator.
+ N d;
+ switch (relsym) {
+ case LESS_THAN_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.
+ status.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);
+ dbm_v[i] = PLUS_INFINITY;
+ }
+ }
+ 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'.
+ dbm_v0 = PLUS_INFINITY;
+ 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())
+ status.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.
+ status.reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ case GREATER_THAN_OR_EQUAL:
+ div_round_up(d, b, minus_den);
+ if (w == v) {
+ // `expr' is of the form: a*w + b.
+ // Shortest-path closure and reduction are not preserved.
+ status.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);
+ dbm[i][v] = PLUS_INFINITY;
+ }
+ }
+ 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'.
+ dbm_0v = PLUS_INFINITY;
+ 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())
+ status.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.
+ status.reset_shortest_path_closed();
+ }
+ }
+ }
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ 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);
+ TEMP_INTEGER(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_den = is_sc ? denominator : minus_den;
+ const Coefficient& minus_sc_den = is_sc ? minus_den : 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;
+
+ N sum;
+ // Index of variable that is unbounded in `this->dbm'.
+ // (The initialization is just to quiet a compiler warning.)
+ dimension_type pinf_index = 0;
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case LESS_THAN_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'.
+ for (dimension_type i = w; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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())
+ status.reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ assert(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_den != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_den' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.coefficient(Variable(pinf_index-1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_THAN_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 (dimension_type i = expr_space_dim + 1; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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())
+ status.reset_shortest_path_reduced();
+ // Return immediately if no approximation could be computed.
+ if (pinf_count > 1) {
+ assert(OK());
+ return;
+ }
+
+ // Divide by the (sign corrected) denominator (if needed).
+ if (sc_den != 1) {
+ // Before computing the quotient, the denominator should be approximated
+ // towards zero. Since `sc_den' is known to be positive, this amounts to
+ // rounding downwards, which is achieved as usual by rounding upwards
+ // `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.coefficient(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.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ 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_generic("generalized_affine_image(e1, r, e2)",
+ "r is a strict relation symbol and "
+ "*this is a BD_Shape");
+
+ // 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 = 0;
+ // Compute the number of the non-zero components of `lhs'.
+ for (dimension_type i = lhs_space_dim; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0)
+ if (t_lhs++ == 1)
+ break;
+ else
+ j_lhs = i;
+
+ 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_THAN_OR_EQUAL:
+ add_constraint(lhs <= rhs);
+ break;
+ case EQUAL:
+ add_constraint(lhs == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ 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& den = lhs.coefficient(v);
+ Relation_Symbol new_relsym = relsym;
+ if (den < 0)
+ if (relsym == LESS_THAN_OR_EQUAL)
+ new_relsym = GREATER_THAN_OR_EQUAL;
+ else if (relsym == GREATER_THAN_OR_EQUAL)
+ new_relsym = LESS_THAN_OR_EQUAL;
+ Linear_Expression expr = rhs - b_lhs;
+ generalized_affine_image(v, new_relsym, expr, den);
+ }
+ else {
+ // Here `lhs' is of the general form, having at least two variables.
+ // Compute the set of variables occurring in `lhs'.
+ bool lhs_vars_intersects_rhs_vars = false;
+ std::vector<Variable> lhs_vars;
+ for (dimension_type i = lhs_space_dim; i-- > 0; )
+ if (lhs.coefficient(Variable(i)) != 0) {
+ lhs_vars.push_back(Variable(i));
+ if (rhs.coefficient(Variable(i)) != 0)
+ lhs_vars_intersects_rhs_vars = true;
+ }
+
+ if (!lhs_vars_intersects_rhs_vars) {
+ // `lhs' and `rhs' variables are disjoint.
+ // Cylindrificate on 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_THAN_OR_EQUAL:
+ add_constraint(lhs <= rhs);
+ break;
+ case EQUAL:
+ add_constraint(lhs == rhs);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= rhs);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ 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 = Variable(space_dim);
+ add_space_dimensions_and_embed(1);
+ // Constrain the new dimension to be equal to `rhs'.
+ // NOTE: calling affine_image() instead of add_constraint()
+ // ensures some approximation is tried even when the constraint
+ // is not a bounded difference.
+ affine_image(new_var, rhs);
+ // Cylindrificate on all variables in the lhs.
+ // NOTE: enforce shortest-path closure for precision.
+ shortest_path_closure_assign();
+ 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 add_constraint() will simply ignore it.
+ // Should we compute approximations for this constraint?
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ add_constraint(lhs <= new_var);
+ break;
+ case EQUAL:
+ add_constraint(lhs == new_var);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ add_constraint(lhs >= new_var);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ // Remove the temporarily added dimension.
+ remove_higher_space_dimensions(space_dim-1);
+#endif // Currently unnecessarily complex computation.
+ }
+ }
+
+ 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) {
+ using Implementation::BD_Shapes::div_round_up;
+
+ // The denominator cannot be zero.
+ if (denominator == 0)
+ throw_generic("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_generic("generalized_affine_preimage(v, r, e, d)",
+ "r is a strict relation symbol and "
+ "*this is a BD_Shape");
+
+ if (relsym == EQUAL) {
+ // The relation symbol is "==":
+ // this is just an affine preimage computation.
+ affine_preimage(var, expr, denominator);
+ assert(OK());
+ return;
+ }
+
+ // The image 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_THAN_OR_EQUAL)
+ ? GREATER_THAN_OR_EQUAL : LESS_THAN_OR_EQUAL;
+ const Linear_Expression inverse
+ = expr - (expr_v + denominator)*var;
+ TEMP_INTEGER(inverse_den);
+ neg_assign(inverse_den, expr_v);
+ const Relation_Symbol inverse_relsym
+ = (sgn(denominator) == sgn(inverse_den)) ? relsym : reversed_relsym;
+ generalized_affine_image(var, inverse_relsym, inverse, inverse_den);
+ return;
+ }
+
+ // Here `var_coefficient == 0', so that the preimage cannot
+ // be easily computed by inverting the affine relation.
+ // Shrink the BD shape by adding the constraint induced
+ // by the affine relation.
+ 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 = 0;
+ // Get information about the number of non-zero coefficients in `expr'.
+ for (dimension_type i = expr_space_dim; i-- > 0; )
+ if (expr.coefficient(Variable(i)) != 0)
+ if (t++ == 1)
+ break;
+ else
+ j = i+1;
+
+ // 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, the `expr' is of the general form.
+ DB_Row<N>& dbm_0 = dbm[0];
+
+ if (t == 0) {
+ // Case 1: expr == b.
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ // Add the constraint `var <= b/denominator'.
+ add_dbm_constraint(0, v, b, denominator);
+ break;
+ case GREATER_THAN_OR_EQUAL:
+ // Add the constraint `var >= b/denominator',
+ // i.e., `-var <= -b/denominator',
+ add_dbm_constraint(v, 0, -b, denominator);
+ break;
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ }
+ else if (t == 1) {
+ // Value of the one and only non-zero coefficient in `expr'.
+ const Coefficient& expr_j = expr.coefficient(Variable(j-1));
+ N d;
+ switch (relsym) {
+ case LESS_THAN_OR_EQUAL:
+ div_round_up(d, b, denominator);
+ // Note that: `j != v', so that `expr' is of the form
+ // expr_j * j + b, with `j != v'.
+ if (expr_j == denominator)
+ // Add the new constraint `v - j <= b/denominator'.
+ add_dbm_constraint(j, v, d);
+ else {
+ // Here expr_j != denominator, so that we should be adding
+ // the constraint `v <= b/denominator - j'.
+ N sum;
+ // Approximate the homogeneous part of `expr'.
+ const int sign_j = sgn(expr_j);
+ const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+ if (!is_plus_infinity(approx_j)) {
+ N coeff_j;
+ if (sign_j > 0)
+ assign_r(coeff_j, expr_j, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_expr_j);
+ neg_assign(minus_expr_j, expr_j);
+ assign_r(coeff_j, minus_expr_j, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+ add_dbm_constraint(0, v, sum);
+ }
+ }
+ break;
+
+ case GREATER_THAN_OR_EQUAL:
+ div_round_up(d, -b, denominator);
+ // Note that: `j != v', so that `expr' is of the form
+ // expr_j * j + b, with `j != v'.
+ if (expr_j == denominator)
+ // Add the new constraint `v - j >= b/denominator'.
+ add_dbm_constraint(j, v, d);
+ else {
+ // Here expr_j != denominator, so that we should be adding
+ // the constraint `v <= b/denominator - j'.
+ N sum;
+ // Approximate the homogeneous part of `expr_j'.
+ const int sign_j = sgn(expr_j);
+ const N& approx_j = (sign_j > 0) ? dbm_0[j] : dbm[j][0];
+ if (!is_plus_infinity(approx_j)) {
+ N coeff_j;
+ if (sign_j > 0)
+ assign_r(coeff_j, expr_j, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_expr_j);
+ neg_assign(minus_expr_j, expr_j);
+ assign_r(coeff_j, minus_expr_j, ROUND_UP);
+ }
+ add_mul_assign_r(sum, coeff_j, approx_j, ROUND_UP);
+ add_dbm_constraint(0, v, sum);
+ }
+ }
+ break;
+
+ default:
+ // We already dealt with the other cases.
+ throw std::runtime_error("PPL internal error");
+ 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);
+ TEMP_INTEGER(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;
+ TEMP_INTEGER(minus_den);
+ neg_assign(minus_den, denominator);
+ const Coefficient& sc_den = is_sc ? denominator : minus_den;
+ const Coefficient& minus_sc_den = is_sc ? minus_den : 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;
+
+ N sum;
+ // Index of variable that is unbounded in `this->dbm'.
+ // (The initialization is just to quiet a compiler warning.)
+ dimension_type pinf_index = 0;
+ // Number of unbounded variables found.
+ dimension_type pinf_count = 0;
+
+ switch (relsym) {
+ case LESS_THAN_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 (dimension_type i = j; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm_0[i] : dbm[i][0];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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_den != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_den' is known to be
+ // positive, this amounts to rounding downwards, which is achieved
+ // by rounding upwards `minus_sc-den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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, j, sc_expr, sc_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (expr.coefficient(Variable(pinf_index-1)) == denominator)
+ // Add the constraint `v - pinf_index <= sum'.
+ add_dbm_constraint(pinf_index, v, sum);
+ break;
+
+ case GREATER_THAN_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 (dimension_type i = j; i > 0; --i) {
+ const Coefficient& sc_i = sc_expr.coefficient(Variable(i-1));
+ const int sign_i = sgn(sc_i);
+ if (sign_i == 0)
+ continue;
+ // Choose carefully: we are approximating `-sc_expr'.
+ const N& approx_i = (sign_i > 0) ? dbm[i][0] : dbm_0[i];
+ if (is_plus_infinity(approx_i)) {
+ if (++pinf_count > 1)
+ break;
+ pinf_index = i;
+ continue;
+ }
+ N coeff_i;
+ if (sign_i > 0)
+ assign_r(coeff_i, sc_i, ROUND_UP);
+ else {
+ TEMP_INTEGER(minus_sc_i);
+ 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_den != 1) {
+ // Before computing the quotient, the denominator should be
+ // approximated towards zero. Since `sc_den' is known to be positive,
+ // this amounts to rounding downwards, which is achieved by rounding
+ // upwards `minus_sc_den' and negating again the result.
+ N down_sc_den;
+ assign_r(down_sc_den, minus_sc_den, ROUND_UP);
+ neg_assign_r(down_sc_den, down_sc_den, ROUND_UP);
+ div_assign_r(sum, sum, down_sc_den, 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, j, sc_expr, sc_den, sum);
+ }
+ else if (pinf_count == 1)
+ if (pinf_index != v
+ && expr.coefficient(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.
+ throw std::runtime_error("PPL internal error");
+ break;
+ }
+ }
+
+ // If the shrunk BD_Shape is empty, its preimage is empty too.
+ if (is_empty())
+ return;
+ forget_all_dbm_constraints(v);
+ // Shortest-path closure is preserved, but not reduction.
+ if (marked_shortest_path_reduced())
+ status.reset_shortest_path_reduced();
+ assert(OK());
+}
+
+template <typename T>
+Constraint_System
+BD_Shape<T>::constraints() const {
+ using Implementation::BD_Shapes::numer_denom;
+
+ Constraint_System cs;
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ }
+ else if (marked_empty())
+ cs.insert(0*Variable(space_dim-1) <= -1);
+ else if (marked_shortest_path_reduced())
+ // Disregard redundant constraints.
+ cs = minimized_constraints();
+ else {
+ // KLUDGE: in the future `cs' will be constructed of the right dimension.
+ // For the time being, we force the dimension with the following line.
+ cs.insert(0*Variable(space_dim-1) <= 0);
+
+ TEMP_INTEGER(a);
+ TEMP_INTEGER(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];
+ N negated_dbm_j0;
+ if (neg_assign_r(negated_dbm_j0, dbm_j0, ROUND_NOT_NEEDED) == V_EQ
+ && negated_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];
+ N negated_dbm_ji;
+ if (neg_assign_r(negated_dbm_ji, dbm_ji, ROUND_NOT_NEEDED) == V_EQ
+ && negated_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 {
+ using Implementation::BD_Shapes::numer_denom;
+
+ shortest_path_reduction_assign();
+ Constraint_System cs;
+ const dimension_type space_dim = space_dimension();
+ if (space_dim == 0) {
+ if (marked_empty())
+ cs = Constraint_System::zero_dim_empty();
+ }
+ else if (marked_empty())
+ cs.insert(0*Variable(space_dim-1) <= -1);
+ else {
+ // KLUDGE: in the future `cs' will be constructed of the right dimension.
+ // For the time being, we force the dimension with the following line.
+ cs.insert(0*Variable(space_dim-1) <= 0);
+
+ TEMP_INTEGER(num);
+ TEMP_INTEGER(den);
+
+ // 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.
+ assert(!is_plus_infinity(dbm_0[i]));
+ numer_denom(dbm_0[i], num, den);
+ cs.insert(den*Variable(i-1) == num);
+ }
+ else {
+ // A binary equality has to be generated.
+ assert(!is_plus_infinity(dbm[i][leader]));
+ numer_denom(dbm[i][leader], num, den);
+ cs.insert(den*Variable(leader-1) - den*Variable(i-1) == num);
+ }
+ }
+
+ // Go through the leaders to generate inequality constraints.
+ // First generate all the unary inequalities.
+ const std::deque<bool>& 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], num, den);
+ cs.insert(den*Variable(i-1) <= num);
+ }
+ if (!redundancy_dbm[i][0]) {
+ numer_denom(dbm[i][0], num, den);
+ cs.insert(-den*Variable(i-1) <= num);
+ }
+ }
+ // 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 std::deque<bool>& 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], num, den);
+ cs.insert(den*Variable(j-1) - den*Variable(i-1) <= num);
+ }
+ if (!redundancy_dbm[j][i]) {
+ numer_denom(dbm[j][i], num, den);
+ cs.insert(den*Variable(i-1) - den*Variable(j-1) <= num);
+ }
+ }
+ }
+ }
+ return cs;
+}
+
+/*! \relates Parma_Polyhedra_Library::BD_Shape */
+template <typename T>
+std::ostream&
+IO_Operators::operator<<(std::ostream& s, const BD_Shape<T>& c) {
+ typedef typename BD_Shape<T>::coefficient_type N;
+ if (c.is_universe())
+ s << "true";
+ else {
+ // We control empty system of bounded differences.
+ dimension_type n = c.space_dimension();
+ if (c.marked_empty())
+ s << "false";
+ else {
+ 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 = c.dbm[i][j];
+ const N& c_j_i = c.dbm[j][i];
+ N negated_c_ji;
+ if (neg_assign_r(negated_c_ji, c_j_i, ROUND_NOT_NEEDED) == V_EQ
+ && negated_c_ji == 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 (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 an only Variable.
+ s << Variable(j - 1);
+ N v;
+ neg_assign_r(v, c_j_i, ROUND_DOWN);
+ s << " >= " << v;
+ }
+ else {
+ // We have got a constraint with two Variables.
+ if (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);
+ N v;
+ 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 an only Variable.
+ s << Variable(j - 1);
+ s << " <= " << c_i_j;
+ }
+ else {
+ // We have got a constraint with two Variables.
+ if (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);
+ N v;
+ 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);
+ // Redundancy info.
+ s << "\n";
+ const char separator = ' ';
+ const dimension_type nrows = redundancy_dbm.size();
+ s << nrows << separator << "\n";
+ for (dimension_type i = 0; i < nrows; ++i) {
+ for (dimension_type j = 0; j < nrows; ++j)
+ s << redundancy_dbm[i][j] << separator;
+ s << "\n";
+ }
+}
+
+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;
+ // Load redundancy info.
+ dimension_type nrows;
+ if (!(s >> nrows))
+ return false;
+ redundancy_dbm.clear();
+ redundancy_dbm.reserve(nrows);
+ std::deque<bool> redundancy_row(nrows, false);
+ for (dimension_type i = 0; i < nrows; ++i) {
+ for (dimension_type j = 0; j < nrows; ++j)
+ if (!(s >> redundancy_row[j]))
+ return false;
+ redundancy_dbm.push_back(redundancy_row);
+ }
+ return true;
+}
+
+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 << "][" << i << "] = "
+ << dbm[i][i] << "!"
+ << 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.status.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;
+ }
+ }
+
+ // 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 << "][" << i << "] = "
+ << dbm[i][i] << " is marked as non-redundant!"
+ << std::endl;
+#endif
+ return false;
+ }
+
+ BD_Shape x = *this;
+ x.status.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::";
+ s << "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::";
+ s << "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::";
+ s << "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 Generator& g) const {
+ std::ostringstream s;
+ s << "PPL::";
+ s << "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_constraint_incompatible(const char* method) {
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << "the constraint is incompatible.";
+ throw std::invalid_argument(s.str());
+}
+
+template <typename T>
+void
+BD_Shape<T>::throw_expression_too_complex(const char* method,
+ const Linear_Expression& e) {
+ using namespace IO_Operators;
+ std::ostringstream s;
+ s << "PPL::BD_Shape::" << method << ":" << std::endl
+ << e << " is too complex.";
+ throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_dimension_incompatible(const char* method,
+ const char* name_row,
+ const Linear_Expression& y) const {
+ std::ostringstream s;
+ s << "PPL::";
+ s << "BD_Shape::" << method << ":" << std::endl
+ << "this->space_dimension() == " << space_dimension()
+ << ", " << name_row << "->space_dimension() == "
+ << y.space_dimension() << ".";
+ throw std::invalid_argument(s.str());
+}
+
+
+template <typename T>
+void
+BD_Shape<T>::throw_generic(const char* method, const char* reason) {
+ std::ostringstream s;
+ s << "PPL::";
+ s << "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 1341
+
+// Automatically generated from PPL source file ../src/Determinate.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Determinate;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Determinate.defs.hh line 1
+/* Determinate class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Determinate.defs.hh line 31
+#include <iosfwd>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are the same domain element.
+
+ \relates Determinate
+*/
+template <typename PH>
+bool operator==(const Determinate<PH>& x, const Determinate<PH>& y);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p x and \p y are different domain elements.
+
+ \relates Determinate
+*/
+template <typename PH>
+bool operator!=(const Determinate<PH>& x, const Determinate<PH>& y);
+
+namespace IO_Operators {
+
+//! Output operator.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+std::ostream&
+operator<<(std::ostream&, const Determinate<PH>&);
+
+} // namespace IO_Operators
+
+} // namespace Parma_Polyhedra_Library
+
+//! Wraps a PPL class into a determinate constraint system interface.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Determinate {
+public:
+ //! \name Constructors and Destructor
+ //@{
+
+ /*! \brief
+ Injection operator: builds the determinate constraint system element
+ corresponding to the base-level element \p p.
+ */
+ Determinate(const PH& p);
+
+ /*! \brief
+ Injection operator: builds the determinate constraint system element
+ corresponding to the base-level element represented by \p cs.
+ */
+ Determinate(const Constraint_System& cs);
+
+ //! \brief
+ //! Injection operator: builds the determinate constraint system element
+ //! corresponding to the base-level element represented 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 element.
+ const PH& element() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the top of the
+ determinate constraint system (i.e., the whole vector space).
+ */
+ bool is_top() const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if \p *this is the bottom
+ of the determinate constraint system.
+ */
+ 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 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;
+
+ //! 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);
+
+ /*! \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.
+ PH& element();
+
+#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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ void mutate();
+
+ //! Assignment operator.
+ Determinate& operator=(const Determinate& y);
+
+ //! Swaps \p *this with \p y.
+ void 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 PH, producing the corresponding function object taking
+ arguments of type Determinate<PH>.
+
+ 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(PH& x, const PH& 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 // 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 // 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 ph is non-const;
+ - 1: one reference, \p ph is non-const;
+ - > 1: more than one reference, \p ph 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:
+ //! A possibly shared base-level domain element.
+ PH ph;
+
+ /*! \brief
+ Builds a new representation by creating a domain element
+ of the specified kind, in the specified vector space.
+ */
+ Rep(dimension_type num_dimensions, Degenerate_Element kind);
+
+ //! Builds a new representation by copying base-level element \p p.
+ Rep(const PH& 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==<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+ friend bool
+ operator!=<PH>(const Determinate<PH>& x, const Determinate<PH>& y);
+};
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+ Parma_Polyhedra_Library::Determinate<PH>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Determinate.inlines.hh line 1
+/* Determinate class implementation: inline functions.
+*/
+
+
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : references(0), ph(num_dimensions, kind) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const PH& p)
+ : references(0), ph(p) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Constraint_System& cs)
+ : references(0), ph(cs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::Rep(const Congruence_System& cgs)
+ : references(0), ph(cgs) {
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Rep::~Rep() {
+ assert(references == 0);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::Rep::new_reference() const {
+ ++references;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::del_reference() const {
+ return --references == 0;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::Rep::is_shared() const {
+ return references > 1;
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::external_memory_in_bytes() const {
+ return ph.external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::Rep::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const PH& ph)
+ : prep(new Rep(ph)) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Constraint_System& cs)
+ : prep(new Rep(cs)) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Congruence_System& cgs)
+ : prep(new Rep(cgs)) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::Determinate(const Determinate& y)
+ : prep(y.prep) {
+ prep->new_reference();
+}
+
+template <typename PH>
+inline
+Determinate<PH>::~Determinate() {
+ if (prep->del_reference())
+ delete prep;
+}
+
+template <typename PH>
+inline Determinate<PH>&
+Determinate<PH>::operator=(const Determinate& y) {
+ y.prep->new_reference();
+ if (prep->del_reference())
+ delete prep;
+ prep = y.prep;
+ return *this;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::swap(Determinate& y) {
+ std::swap(prep, y.prep);
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::mutate() {
+ if (prep->is_shared()) {
+ Rep* new_prep = new Rep(prep->ph);
+ (void) prep->del_reference();
+ new_prep->new_reference();
+ prep = new_prep;
+ }
+}
+
+template <typename PH>
+inline const PH&
+Determinate<PH>::element() const {
+ return prep->ph;
+}
+
+template <typename PH>
+inline PH&
+Determinate<PH>::element() {
+ mutate();
+ return prep->ph;
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::upper_bound_assign(const Determinate& y) {
+ element().upper_bound_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::meet_assign(const Determinate& y) {
+ element().intersection_assign(y.element());
+}
+
+template <typename PH>
+inline void
+Determinate<PH>::concatenate_assign(const Determinate& y) {
+ element().concatenate_assign(y.element());
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::definitely_entails(const Determinate& y) const {
+ return prep == y.prep || y.prep->ph.contains(prep->ph);
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_definitely_equivalent_to(const Determinate& y) const {
+ return prep == y.prep || prep->ph == y.prep->ph;
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_top() const {
+ return prep->ph.is_universe();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::is_bottom() const {
+ return prep->ph.is_empty();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::external_memory_in_bytes() const {
+ return prep->total_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Determinate<PH>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <typename PH>
+inline bool
+Determinate<PH>::OK() const {
+ return prep->ph.OK();
+}
+
+namespace IO_Operators {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline std::ostream&
+operator<<(std::ostream& s, const Determinate<PH>& x) {
+ s << x.element();
+ return s;
+}
+
+} // namespace IO_Operators
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator==(const Determinate<PH>& x, const Determinate<PH>& y) {
+ return x.prep == y.prep || x.prep->ph == y.prep->ph;
+}
+
+/*! \relates Determinate */
+template <typename PH>
+inline bool
+operator!=(const Determinate<PH>& x, const Determinate<PH>& y) {
+ return x.prep != y.prep && x.prep->ph != y.prep->ph;
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+Binary_Operator_Assign_Lifter(Binary_Operator_Assign op_assign)
+ : op_assign_(op_assign) {
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline void
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>::
+operator()(Determinate& x, const Determinate& y) const {
+ op_assign_(x.element(), y.element());
+}
+
+template <typename PH>
+template <typename Binary_Operator_Assign>
+inline
+Determinate<PH>::Binary_Operator_Assign_Lifter<Binary_Operator_Assign>
+Determinate<PH>::lift_op_assign(Binary_Operator_Assign op_assign) {
+ return Binary_Operator_Assign_Lifter<Binary_Operator_Assign>(op_assign);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Determinate */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Determinate<PH>& x,
+ Parma_Polyhedra_Library::Determinate<PH>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Determinate.defs.hh line 315
+
+// 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/Powerset.defs.hh line 1
+/* Powerset class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Powerset.defs.hh line 27
+#include <iosfwd>
+#include <iterator>
+#include <list>
+
+namespace Parma_Polyhedra_Library {
+
+//! 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 templatic 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 Element
+ //@{
+
+ /*! \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 Element
+
+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;
+
+ class omega_iterator;
+ class omega_const_iterator;
+
+ /*! \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 omega_iterator iterator;
+ //! A bidirectional %const_iterator on the disjuncts of a Powerset element.
+ typedef omega_const_iterator 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;
+
+ //! Returns <CODE>true</CODE> if and only if there are no disjuncts.
+ 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 Element
+ //@{
+
+ //! The assignment operator.
+ Powerset& operator=(const Powerset& y);
+
+ //! Swaps \p *this with \p y.
+ void 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);
+
+ //! 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.
+ */
+ iterator add_non_bottom_disjunct(const D& d,
+ iterator first,
+ iterator last);
+
+ /*! \brief
+ Adds to \p *this the disjunct \p d,
+ assuming \p d is not the bottom element.
+ */
+ void add_non_bottom_disjunct(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);
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! A %const_iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+ This class implements a read-only bidirectional iterator
+ on the sequence of disjuncts.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_const_iterator {
+protected:
+ //! The type of the underlying %const_iterator.
+ typedef typename Powerset::Sequence::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.
+ omega_const_iterator(const Base& b);
+
+ 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.
+ omega_const_iterator();
+
+ //! Copy constructor.
+ omega_const_iterator(const omega_const_iterator& y);
+
+ //! Constructs from the corresponding non-const iterator.
+ omega_const_iterator(const omega_iterator& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect member selector.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ omega_const_iterator& operator++();
+
+ //! Postfix increment operator.
+ omega_const_iterator operator++(int);
+
+ //! Prefix decrement operator.
+ omega_const_iterator& operator--();
+
+ //! Postfix decrement operator.
+ omega_const_iterator operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const omega_const_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const omega_const_iterator& y) const;
+};
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! An iterator on the disjuncts of a Powerset element.
+/*! \ingroup PPL_CXX_interface
+ This class implements a <EM>read-only</EM> bidirectional iterator
+ on the sequence of disjuncts. That is, by using an instance of
+ this iterator class it is not possible to overwrite the disjuncts
+ contained in a Powerset element. However, using such an instance
+ allows for the removal of disjuncts by using methods
+ <CODE>Powerset::drop_disjunct(iterator position)</CODE> and
+ <CODE>Powerset::drop_disjuncts(iterator first, iterator last)</CODE>.
+ Such a policy is needed to allow for a reliable use of the Boolean
+ flag <CODE>Powerset::reduced</CODE>.
+
+ \note
+ For any developers' need, (low-level) iterators on the sequence of
+ disjuncts are still available by accessing the protected member
+ <CODE>Powerset::sequence</CODE>.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+class Parma_Polyhedra_Library::Powerset<D>::omega_iterator {
+protected:
+ //! The type of the underlying mutable iterator.
+ typedef typename Powerset::Sequence::iterator Base;
+
+ //! A shortcut for naming the const_iterator traits.
+ typedef typename
+ std::iterator_traits<typename Powerset::Sequence::const_iterator> Traits;
+
+ //! A (mutable) iterator on the sequence of elements.
+ Base base;
+
+ //! Constructs from the lower-level iterator.
+ omega_iterator(const Base& b);
+
+ friend class Powerset;
+ friend Powerset<D>::omega_const_iterator
+ ::omega_const_iterator(const omega_iterator& y);
+
+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.
+ omega_iterator();
+
+ //! Copy constructor.
+ omega_iterator(const omega_iterator& y);
+
+ //! Dereference operator.
+ reference operator*() const;
+
+ //! Indirect access operator.
+ pointer operator->() const;
+
+ //! Prefix increment operator.
+ omega_iterator& operator++();
+
+ //! Postfix increment operator.
+ omega_iterator operator++(int);
+
+ //! Prefix decrement operator.
+ omega_iterator& operator--();
+
+ //! Postfix decrement operator.
+ omega_iterator operator--(int);
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are identical.
+ */
+ bool operator==(const omega_iterator& y) const;
+
+ /*! \brief
+ Returns <CODE>true</CODE> if and only if
+ \p *this and \p y are different.
+ */
+ bool operator!=(const omega_iterator& 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 Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& 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 Powerset::omega_const_iterator
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename D>
+bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& y);
+
+} // namespace Parma_Polyhedra_Library
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+void swap(Parma_Polyhedra_Library::Powerset<D>& x,
+ Parma_Polyhedra_Library::Powerset<D>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Powerset.inlines.hh line 1
+/* Powerset class implementation: inline functions.
+*/
+
+
+#include <algorithm>
+#include <cassert>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator()
+ : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const omega_iterator& y)
+ : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_iterator::omega_iterator(const Base& b)
+ : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::reference
+Powerset<D>::omega_iterator::operator*() const {
+ return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator::pointer
+Powerset<D>::omega_iterator::operator->() const {
+ return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator++(int) {
+ omega_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator&
+Powerset<D>::omega_iterator::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_iterator
+Powerset<D>::omega_iterator::operator--(int) {
+ omega_iterator tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator==(const omega_iterator& y) const {
+ return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>::omega_iterator::operator!=(const omega_iterator& y) const {
+ return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator()
+ : base() {
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_const_iterator& y)
+ : base(y.base) {
+}
+
+template <typename D>
+inline
+Powerset<D>::omega_const_iterator::omega_const_iterator(const Base& b)
+ : base(b) {
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::reference
+Powerset<D>::omega_const_iterator::operator*() const {
+ return *base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator::pointer
+Powerset<D>::omega_const_iterator::operator->() const {
+ return &*base;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator++() {
+ ++base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator++(int) {
+ omega_const_iterator tmp = *this;
+ operator++();
+ return tmp;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator&
+Powerset<D>::omega_const_iterator::operator--() {
+ --base;
+ return *this;
+}
+
+template <typename D>
+inline typename Powerset<D>::omega_const_iterator
+Powerset<D>::omega_const_iterator::operator--(int) {
+ omega_const_iterator tmp = *this;
+ operator--();
+ return tmp;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator==(const omega_const_iterator& y) const {
+ return base == y.base;
+}
+
+template <typename D>
+inline bool
+Powerset<D>
+::omega_const_iterator::operator!=(const omega_const_iterator& y) const {
+ return !operator==(y);
+}
+
+template <typename D>
+inline
+Powerset<D>
+::omega_const_iterator::omega_const_iterator(const omega_iterator& y)
+ : base(y.base) {
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator==(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& y) {
+ return Powerset<D>::omega_const_iterator(x).operator==(y);
+}
+
+/*! \relates Powerset::omega_const_iterator */
+template <typename D>
+inline bool
+operator!=(const typename Powerset<D>::omega_iterator& x,
+ const typename Powerset<D>::omega_const_iterator& y) {
+ return !(x == y);
+}
+
+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>::swap(Powerset& y) {
+ std::swap(sequence, y.sequence);
+ std::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(true) {
+ if (!d.is_bottom())
+ sequence.push_back(d);
+ assert(OK());
+}
+
+template <typename D>
+inline
+Powerset<D>::~Powerset() {
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_non_bottom_disjunct(const D& d) {
+ assert(!d.is_bottom());
+ add_non_bottom_disjunct(d, begin(), end());
+}
+
+template <typename D>
+inline void
+Powerset<D>::add_disjunct(const D& d) {
+ if (!d.is_bottom())
+ add_non_bottom_disjunct(d);
+}
+
+/*! \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 memory_size_type
+Powerset<D>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Powerset */
+template <typename D>
+inline void
+swap(Parma_Polyhedra_Library::Powerset<D>& x,
+ Parma_Polyhedra_Library::Powerset<D>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Powerset.templates.hh line 1
+/* Powerset class implementation: non-inline template functions.
+*/
+
+
+#include <algorithm>
+#include <cassert>
+#include <iostream>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename D>
+void
+Powerset<D>::collapse(const Sequence_iterator sink) {
+ 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;
+
+ assert(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 && xi != x.end()) {
+ // Hurry up!
+ x.collapse(xi.base);
+ break;
+ }
+ }
+ reduced = true;
+ assert(OK());
+}
+
+template <typename D>
+void
+Powerset<D>::collapse(const unsigned max_disjuncts) {
+ 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);
+ }
+ assert(OK());
+ 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(const D& d,
+ iterator first,
+ iterator last) {
+ 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);
+ 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> yy = y;
+ for (typename Powerset<D>::const_iterator xi = x.begin(),
+ x_end = x.end(); xi != x_end; ++xi) {
+ typename Powerset<D>::iterator yyi = yy.begin();
+ typename Powerset<D>::iterator yy_end = yy.end();
+ yyi = std::find(yyi, yy_end, *xi);
+ if (yyi == yy_end)
+ return false;
+ else
+ yy.drop_disjunct(yyi);
+ }
+ 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.
+ std::swap(sequence, new_sequence);
+ reduced = false;
+}
+
+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(*i, old_begin, old_end);
+}
+
+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++ << " }";
+ 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 619
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.types.hh line 1
+
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+class Polyhedra_Powerset;
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 1
+/* Polyhedra_Powerset class declaration.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 39
+#include <iosfwd>
+#include <list>
+#include <map>
+
+//! The powerset construction instantiated on PPL polyhedra.
+/*! \ingroup PPL_CXX_interface */
+template <typename PH>
+class Parma_Polyhedra_Library::Polyhedra_Powerset
+ : public Parma_Polyhedra_Library::Powerset
+<Parma_Polyhedra_Library::Determinate<PH> > {
+public:
+ typedef PH element_type;
+
+private:
+ typedef Determinate<PH> CS;
+ typedef Powerset<CS> Base;
+
+public:
+ //! Returns the maximum space dimension a Polyhedra_Powerset<PH> can handle.
+ static dimension_type max_space_dimension();
+
+ //! \name Constructors
+ //@{
+
+ //! Builds a universe (top) or empty (bottom) Polyhedra_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
+ Polyhedra_Powerset(dimension_type num_dimensions = 0,
+ Degenerate_Element kind = UNIVERSE);
+
+ //! Ordinary copy-constructor.
+ Polyhedra_Powerset(const Polyhedra_Powerset& y);
+
+ /*! \brief
+ If \p ph is nonempty, builds a powerset containing only \p ph.
+ Builds the empty powerset otherwise.
+ */
+ explicit Polyhedra_Powerset(const PH& ph);
+
+ /*! \brief
+ Copy-constructor allowing a source powerset with elements of a
+ different polyhedron kind.
+ */
+ template <typename QH>
+ explicit Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+ /*! \brief
+ Creates a Polyhedra_Powerset with a single polyhedron
+ with the same information contents as \p cs.
+ */
+ explicit Polyhedra_Powerset(const Constraint_System& cs);
+
+ //! Creates a Polyhedra_Powerset with a single polyhedron
+ //! with the same information contents as \p cgs.
+ explicit Polyhedra_Powerset(const Congruence_System& cgs);
+
+ //@} // Constructors and Destructor
+
+ //! \name Member Functions that Do Not Modify the Powerset of Polyhedra
+ //@{
+
+ //! 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 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 topology-incompatible or
+ dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_covers(const Polyhedra_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 topology-incompatible or
+ dimension-incompatible.
+
+ \warning
+ This may be <EM>really</EM> expensive!
+ */
+ bool geometrically_equals(const Polyhedra_Powerset& 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;
+
+ //! Checks if all the invariants are satisfied.
+ bool OK() const;
+
+ //@} // Member Functions that Do Not Modify the Powerset
+
+ //! \name Space Dimension Preserving Member Functions that May Modify the Powerset of Polyhedra
+ //@{
+
+ //! 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 PH& 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);
+
+ //! Intersects \p *this with the constraint \p c, minimizing the result.
+ /*!
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p c are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool add_constraint_and_minimize(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
+ Intersects \p *this with the constraints in \p cs,
+ minimizing the result.
+
+ \return
+ <CODE>false</CODE> if and only if the result is empty.
+
+ \param cs
+ The constraints to intersect with.
+
+ \exception std::invalid_argument
+ Thrown if \p *this and \p cs are topology-incompatible or
+ dimension-incompatible.
+ */
+ bool add_constraints_and_minimize(const Constraint_System& cs);
+
+ /*! \brief
+ Assign to \p *this the result of (recursively) merging together
+ the pairs of polyhedra whose poly-hull is the same as their
+ set-theoretical union.
+
+ On exit, for all the pairs \f$\cP\f$, \f$\cQ\f$ of different polyhedra
+ 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 wf
+ and the cardinality threshold \p max_disjuncts.
+
+ \param y
+ A finite powerset of polyhedra.
+ It <EM>must</EM> definitely entail \p *this;
+
+ \param wf
+ 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 topology-incompatible or
+ 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 Polyhedra_Powerset& y,
+ Widening wf,
+ 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 wf
+ certified by the convergence certificate \p Cert.
+
+ \param y
+ The finite powerset of polyhedra computed in the previous iteration step.
+ It <EM>must</EM> definitely entail \p *this;
+
+ \param wf
+ The widening function to be used on polyhedra objects.
+ 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 topology-incompatible or
+ 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 wf; 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 Polyhedra_Powerset& y, Widening wf);
+
+ //@} // 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).
+ */
+ Polyhedra_Powerset& operator=(const Polyhedra_Powerset& y);
+
+ /*! \brief
+ Assignment operator allowing a source powerset with elements of a
+ different polyhedron kind
+ (\p *this and \p y can be dimension-incompatible).
+ */
+ template <typename QH>
+ Polyhedra_Powerset& operator=(const Polyhedra_Powerset<QH>& y);
+
+ //! Swaps \p *this with \p y.
+ void swap(Polyhedra_Powerset& y);
+
+ /*! \brief
+ Adds \p m new dimensions to the vector space containing \p *this
+ and embeds each polyhedron 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 polyhedra in \p *this in the new space.
+ */
+ void add_space_dimensions_and_project(dimension_type m);
+
+ //! Assigns to \p *this the intersection of \p *this and \p y.
+ /*!
+ The result is obtained by intersecting each polyhedron in \p *this
+ with each polyhedron in \p y and collecting all these intersections.
+ */
+ void intersection_assign(const Polyhedra_Powerset& y);
+
+ //! Assigns to \p *this the difference of \p *this and \p y.
+ /*!
+ The result is obtained by computing the
+ \ref Convex_Polyhedral_Difference "poly-difference" of each polyhedron
+ in \p *this with each polyhedron in \p y and collecting all these
+ differences.
+ */
+ void poly_difference_assign(const Polyhedra_Powerset& y);
+
+ //! 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 polyhedron
+ in \p *this with each polyhedron in \p y.
+ */
+ void concatenate_assign(const Polyhedra_Powerset& y);
+
+ /*! \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 polyhedron
+ in \p *this with each polyhedron in \p y.
+ */
+ void time_elapse_assign(const Polyhedra_Powerset& y);
+
+ //! Removes all the specified space dimensions.
+ /*!
+ \param to_be_removed
+ 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 to_be_removed.
+ */
+ void remove_space_dimensions(const Variables_Set& to_be_removed);
+
+ /*! \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);
+
+ //@} // 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;
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ /*! \brief
+ Loads from \p s an ASCII representation (as produced by \ref
+ ascii_dump) and sets \p *this accordingly. Returns <CODE>true</CODE>
+ if successful, <CODE>false</CODE> otherwise.
+ */
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+ 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 *this the result of applying the BGP99 heuristics
+ to \p *this and \p y, using the widening function \p wf.
+ */
+ template <typename Widening>
+ void BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf);
+
+ //! Records in \p cert_ms the certificates for this set of polyhedra.
+ 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 polyhedra
+ 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 templatic constructor
+ // template <typename QH>
+ // Polyhedra_Powerset(const Polyhedra_Powerset<QH>&)
+ // but, apparently, this cannot be done.
+ // As a workaround, we could use
+ // friend class Polyhedra_Powerset<NNC_Polyhedron>
+ // but GCC 3.3.3 has a bug that causes its rejection.
+ // So, temporarily, we make all Polyhedra_Powerset's friends of each other.
+ template <typename QH> friend class Polyhedra_Powerset;
+};
+
+
+namespace Parma_Polyhedra_Library {
+
+//! Partitions \p q with respect to \p p.
+/*! \relates Polyhedra_Powerset
+ Let \p p and \p q be two polyhedra.
+ The function returns an object <CODE>r</CODE> of type
+ <CODE>std::pair\<PH, Polyhedra_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 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://www.cs.unipr.it/ppl/Documentation/bibliography#Srivastava93">
+ this paper</A> for more information about the implementation.
+ \endif
+*/
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& 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 Polyhedra_Powerset
+*/
+bool
+check_containment(const NNC_Polyhedron& ph,
+ const Polyhedra_Powerset<NNC_Polyhedron>& ps);
+
+/*! \brief
+ Returns <CODE>true</CODE> if and only if the union of
+ the objects in \p ps contains \p ph.
+
+ \relates Polyhedra_Powerset
+ \note
+ It is assumed that the template parameter PH can be converted
+ without precision loss into an NNC_Polyhedron; otherwise,
+ an incorrect result might be obtained.
+*/
+template <typename PH>
+bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps);
+
+// CHECK ME: 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>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// CHECK ME: 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>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y);
+
+// Non-inline full specializations should be declared here
+// so as to inhibit multiple instantiations of the generic template.
+template <>
+template <>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y);
+
+template <>
+template <>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y);
+
+template <>
+void
+Polyhedra_Powerset<NNC_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y);
+
+template <>
+bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_covers(const Polyhedra_Powerset& y) const;
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+//! Specializes <CODE>std::swap</CODE>.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+void swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+ Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y);
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.inlines.hh line 1
+/* Polyhedra_Powerset class implementation: inline functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.inlines.hh line 34
+#include <algorithm>
+#include <deque>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::space_dimension() const {
+ return space_dim;
+}
+
+template <typename PH>
+inline dimension_type
+Polyhedra_Powerset<PH>::max_space_dimension() {
+ return PH::max_space_dimension();
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(dimension_type num_dimensions,
+ Degenerate_Element kind)
+ : Base(), space_dim(num_dimensions) {
+ Polyhedra_Powerset& x = *this;
+ if (kind == UNIVERSE)
+ x.sequence.push_back(Determinate<PH>(PH(num_dimensions, kind)));
+ assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Polyhedra_Powerset& y)
+ : Base(y), space_dim(y.space_dim) {
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const PH& ph)
+ : Base(ph), space_dim(ph.space_dimension()) {
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<C_Polyhedron>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (Polyhedra_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->element()))
+ );
+ x.reduced = y.reduced;
+ assert(x.OK());
+}
+
+// FIXME: This full specialization is declared inline and placed here
+// just as a workaround to a bug in GCC 3.3.3. In principle, it should
+// not be declared inline and moved in Polyhedra_Powerset.cc.
+// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13635.
+template <>
+template <>
+inline
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<NNC_Polyhedron>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (Polyhedra_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->element()))
+ );
+ // 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;
+ assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Constraint_System& cs)
+ // FIXME: calling Base(Determinate<PH>(cs)) will automatically handle
+ // the flag `reduced', but it will also force a non-emptiness test
+ // on the constraint system `cs'.
+ : Base(), space_dim(cs.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ x.sequence.push_back(Determinate<PH>(cs));
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <typename PH>
+inline
+Polyhedra_Powerset<PH>::Polyhedra_Powerset(const Congruence_System& cgs)
+ // FIXME: calling Base(Determinate<PH>(cgs)) will automatically handle
+ // the flag `reduced', but it will also force a non-emptiness test
+ // on the congruence system `cgs'.
+ : Base(), space_dim(cgs.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ x.sequence.push_back(Determinate<PH>(cgs));
+ x.reduced = false;
+ assert(OK());
+}
+
+template <typename PH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.Base::operator=(y);
+ x.space_dim = y.space_dim;
+ return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::swap(Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.Base::swap(y);
+ std::swap(x.space_dim, y.space_dim);
+}
+
+template <typename PH>
+template <typename QH>
+inline Polyhedra_Powerset<PH>&
+Polyhedra_Powerset<PH>::operator=(const Polyhedra_Powerset<QH>& y) {
+ Polyhedra_Powerset& x = *this;
+ Polyhedra_Powerset<PH> pps(y);
+ x.swap(pps);
+ return x;
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::intersection_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y, CS::lift_op_assign(std::mem_fun_ref(&PH::intersection_assign)));
+}
+
+template <typename PH>
+inline void
+Polyhedra_Powerset<PH>::time_elapse_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ x.pairwise_apply_assign
+ (y, CS::lift_op_assign(std::mem_fun_ref(&PH::time_elapse_assign)));
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_covers(const Polyhedra_Powerset& y) const {
+ const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+ const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy);
+}
+
+template <typename PH>
+inline bool
+Polyhedra_Powerset<PH>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+ const Polyhedra_Powerset<NNC_Polyhedron> xx(*this);
+ const Polyhedra_Powerset<NNC_Polyhedron> yy(y);
+ return xx.geometrically_covers(yy) && yy.geometrically_covers(xx);
+}
+
+template <>
+inline bool
+Polyhedra_Powerset<NNC_Polyhedron>
+::geometrically_equals(const Polyhedra_Powerset& y) const {
+ const Polyhedra_Powerset& x = *this;
+ return x.geometrically_covers(y) && y.geometrically_covers(x);
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::external_memory_in_bytes() const {
+ return Base::external_memory_in_bytes();
+}
+
+template <typename PH>
+inline memory_size_type
+Polyhedra_Powerset<PH>::total_memory_in_bytes() const {
+ return sizeof(*this) + external_memory_in_bytes();
+}
+
+template <>
+inline void
+Polyhedra_Powerset<C_Polyhedron>
+::poly_difference_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset<NNC_Polyhedron> nnc_this(*this);
+ Polyhedra_Powerset<NNC_Polyhedron> nnc_y(y);
+ nnc_this.poly_difference_assign(nnc_y);
+ *this = nnc_this;
+}
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+inline bool
+check_containment(const PH& ph, const Polyhedra_Powerset<PH>& ps) {
+ const NNC_Polyhedron pph = NNC_Polyhedron(ph.constraints());
+ const Polyhedra_Powerset<NNC_Polyhedron> pps(ps);
+ return check_containment(pph, pps);
+}
+
+/*! \relates Polyhedra_Powerset */
+template <>
+inline bool
+check_containment(const C_Polyhedron& ph,
+ const Polyhedra_Powerset<C_Polyhedron>& ps) {
+ return check_containment(NNC_Polyhedron(ph),
+ Polyhedra_Powerset<NNC_Polyhedron>(ps));
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+namespace std {
+
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset */
+template <typename PH>
+inline void
+swap(Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& x,
+ Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& y) {
+ x.swap(y);
+}
+
+} // namespace std
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.templates.hh line 1
+/* Polyhedra_Powerset class implementation: non-inline template functions.
+*/
+
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.templates.hh line 31
+#include <algorithm>
+#include <deque>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <stdexcept>
+
+namespace Parma_Polyhedra_Library {
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_disjunct(const PH& ph) {
+ Polyhedra_Powerset& x = *this;
+ if (x.space_dimension() != ph.space_dimension()) {
+ std::ostringstream s;
+ s << "PPL::Polyhedra_Powerset<PH>::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<PH>(ph));
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<NNC_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (typename Polyhedra_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->element().constraints()))
+ );
+ x.reduced = y.reduced;
+ assert(x.OK());
+}
+
+template <>
+template <typename QH>
+Polyhedra_Powerset<C_Polyhedron>
+::Polyhedra_Powerset(const Polyhedra_Powerset<QH>& y)
+ : Base(), space_dim(y.space_dimension()) {
+ Polyhedra_Powerset& x = *this;
+ for (typename Polyhedra_Powerset<QH>::const_iterator i = y.begin(),
+ y_end = y.end(); i != y_end; ++i)
+ x.sequence.push_back(Determinate<C_Polyhedron>(
+ C_Polyhedron(i->element().constraints()))
+ );
+ // 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;
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::concatenate_assign(const Polyhedra_Powerset& y) {
+ Polyhedra_Powerset& x = *this;
+ // Ensure omega-reduction here, since what follows has quadratic complexity.
+ x.omega_reduce();
+ y.omega_reduce();
+ Polyhedra_Powerset<PH> 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) {
+ CS zi = *xi;
+ zi.concatenate_assign(*yi);
+ assert(!zi.is_bottom());
+ new_x.sequence.push_back(zi);
+ }
+ ++xi;
+ if (abandon_expensive_computations && xi != x_end && y_begin != y_end) {
+ // Hurry up!
+ PH xph = xi->element();
+ for (++xi; xi != x_end; ++xi)
+ xph.upper_bound_assign(xi->element());
+ const_iterator yi = y_begin;
+ PH yph = yi->element();
+ for (++yi; yi != y_end; ++yi)
+ yph.upper_bound_assign(yi->element());
+ xph.concatenate_assign(yph);
+ x.swap(new_x);
+ x.add_disjunct(xph);
+ assert(x.OK());
+ return;
+ }
+ }
+ x.swap(new_x);
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraint(const Constraint& c) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_constraint(c);
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::add_constraint_and_minimize(const Constraint& c) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; )
+ if (!si->element().add_constraint_and_minimize(c))
+ si = x.sequence.erase(si);
+ else {
+ x.reduced = false;
+ ++si;
+ }
+ assert(x.OK());
+ return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_constraints(const Constraint_System& cs) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_constraints(cs);
+ x.reduced = false;
+ assert(x.OK());
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::
+add_constraints_and_minimize(const Constraint_System& cs) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; )
+ if (!si->element().add_constraints_and_minimize(cs))
+ si = x.sequence.erase(si);
+ else {
+ x.reduced = false;
+ ++si;
+ }
+ assert(x.OK());
+ return !x.empty();
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_embed(dimension_type m) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_space_dimensions_and_embed(m);
+ x.space_dim += m;
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::add_space_dimensions_and_project(dimension_type m) {
+ Polyhedra_Powerset& x = *this;
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si)
+ si->element().add_space_dimensions_and_project(m);
+ x.space_dim += m;
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::
+remove_space_dimensions(const Variables_Set& to_be_removed) {
+ Polyhedra_Powerset& x = *this;
+ Variables_Set::size_type num_removed = to_be_removed.size();
+ if (num_removed > 0) {
+ for (Sequence_iterator si = x.sequence.begin(),
+ s_end = x.sequence.end(); si != s_end; ++si) {
+ si->element().remove_space_dimensions(to_be_removed);
+ x.reduced = false;
+ }
+ x.space_dim -= num_removed;
+ assert(x.OK());
+ }
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::remove_higher_space_dimensions(dimension_type
+ new_dimension) {
+ Polyhedra_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->element().remove_higher_space_dimensions(new_dimension);
+ x.reduced = false;
+ }
+ x.space_dim = new_dimension;
+ assert(x.OK());
+ }
+}
+
+template <typename PH>
+template <typename Partial_Function>
+void
+Polyhedra_Powerset<PH>::map_space_dimensions(const Partial_Function& pfunc) {
+ Polyhedra_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->element().map_space_dimensions(pfunc);
+ x.space_dim = s_begin->element().space_dimension();
+ x.reduced = false;
+ }
+ assert(x.OK());
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::pairwise_reduce() {
+ Polyhedra_Powerset& x = *this;
+ // It is wise to omega-reduce before pairwise-reducing.
+ x.omega_reduce();
+
+ size_type n = x.size();
+ size_type deleted;
+ do {
+ Polyhedra_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;
+ PH& pi = si->element();
+ 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 PH& pj = sj->element();
+ if (pi.upper_bound_assign_if_exact(pj)) {
+ marked[si_index] = marked[sj_index] = true;
+ new_x.add_non_bottom_disjunct(pi);
+ ++deleted;
+ goto next;
+ }
+ }
+ next:
+ ;
+ }
+ iterator nx_begin = new_x.begin();
+ iterator nx_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])
+ nx_begin = new_x.add_non_bottom_disjunct(*xi, nx_begin, nx_end);
+ std::swap(x.sequence, new_x.sequence);
+ n -= deleted;
+ } while (deleted > 0);
+ assert(x.OK());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_heuristics_assign(const Polyhedra_Powerset& y, Widening wf) {
+ // `x' is the current iteration value.
+ Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Polyhedra_Powerset<PH> x_copy = x;
+ const Polyhedra_Powerset<PH> y_copy = y;
+ assert(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ size_type n = x.size();
+ Polyhedra_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 PH& pi = i->element();
+ const PH& pj = j->element();
+ if (pi.contains(pj)) {
+ PH pi_copy = pi;
+ wf(pi_copy, pj);
+ new_x.add_non_bottom_disjunct(pi_copy);
+ marked[i_index] = true;
+ }
+ }
+ iterator nx_begin = new_x.begin();
+ iterator nx_end = new_x.end();
+ i_index = 0;
+ for (const_iterator i = x_begin; i != x_end; ++i, ++i_index)
+ if (!marked[i_index])
+ nx_begin = new_x.add_non_bottom_disjunct(*i, nx_begin, nx_end);
+ std::swap(x.sequence, new_x.sequence);
+ assert(x.OK());
+ assert(x.is_omega_reduced());
+}
+
+template <typename PH>
+template <typename Widening>
+void
+Polyhedra_Powerset<PH>::
+BGP99_extrapolation_assign(const Polyhedra_Powerset& y,
+ Widening wf,
+ unsigned max_disjuncts) {
+ // `x' is the current iteration value.
+ Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Polyhedra_Powerset<PH> x_copy = x;
+ const Polyhedra_Powerset<PH> y_copy = y;
+ assert(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ x.pairwise_reduce();
+ if (max_disjuncts != 0)
+ x.collapse(max_disjuncts);
+ x.BGP99_heuristics_assign(y, wf);
+}
+
+template <typename PH>
+template <typename Cert>
+void
+Polyhedra_Powerset<PH>::
+collect_certificates(std::map<Cert, size_type,
+ typename Cert::Compare>& cert_ms) const {
+ const Polyhedra_Powerset& x = *this;
+ assert(x.is_omega_reduced());
+ assert(cert_ms.size() == 0);
+ for (const_iterator i = x.begin(), end = x.end(); i != end; i++) {
+ Cert ph_cert(i->element());
+ ++cert_ms[ph_cert];
+ }
+}
+
+template <typename PH>
+template <typename Cert>
+bool
+Polyhedra_Powerset<PH>::
+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(),
+ xend = x_cert_ms.end(),
+ yi = y_cert_ms.begin(),
+ yend = y_cert_ms.end();
+ while (xi != xend && yi != yend) {
+ 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 == xend or yi == yend.
+ // Stabilization is achieved if `y_cert_ms' still has other elements.
+ return yi != yend;
+}
+
+template <typename PH>
+template <typename Cert, typename Widening>
+void
+Polyhedra_Powerset<PH>::BHZ03_widening_assign(const Polyhedra_Powerset& y,
+ Widening wf) {
+ // `x' is the current iteration value.
+ Polyhedra_Powerset& x = *this;
+
+#ifndef NDEBUG
+ {
+ // We assume that `y' entails `x'.
+ const Polyhedra_Powerset<PH> x_copy = x;
+ const Polyhedra_Powerset<PH> y_copy = y;
+ assert(y_copy.definitely_entails(x_copy));
+ }
+#endif
+
+ // First widening technique: do nothing.
+
+ // If `y' is the empty collection, do nothing.
+ assert(x.size() > 0);
+ if (y.size() == 0)
+ return;
+
+ // Compute the poly-hull of `x'.
+ PH 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->element());
+
+ // Compute the poly-hull of `y'.
+ PH 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->element());
+ // 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.
+ Polyhedra_Powerset<PH> bgp99_heuristics = x;
+ bgp99_heuristics.BGP99_heuristics_assign(y, wf);
+
+ // Compute the poly-hull of `bgp99_heuristics'.
+ PH bgp99_heuristics_hull(x.space_dim, EMPTY);
+ for (const_iterator i = bgp99_heuristics.begin(),
+ bh_end = bgp99_heuristics.end(); i != bh_end; ++i)
+ bgp99_heuristics_hull.upper_bound_assign(i->element());
+
+ // 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.
+ std::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)) {
+ std::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.
+ Polyhedra_Powerset<PH> reduced_bgp99_heuristics(bgp99_heuristics);
+ reduced_bgp99_heuristics.pairwise_reduce();
+ if (reduced_bgp99_heuristics.is_cert_multiset_stabilizing(y_cert_ms)) {
+ std::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).
+ PH ph = bgp99_heuristics_hull;
+ wf(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.
+ Polyhedra_Powerset<PH> x_hull_singleton(x.space_dim, EMPTY);
+ x_hull_singleton.add_disjunct(x_hull);
+ std::swap(x, x_hull_singleton);
+}
+
+template <typename PH>
+void
+Polyhedra_Powerset<PH>::ascii_dump(std::ostream& s) const {
+ const Polyhedra_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->element().ascii_dump(s);
+}
+
+PPL_OUTPUT_TEMPLATE_DEFINITIONS(PH, Polyhedra_Powerset<PH>);
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::ascii_load(std::istream& s) {
+ Polyhedra_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;
+
+ Polyhedra_Powerset new_x(x.space_dim, EMPTY);
+ while (sz-- > 0) {
+ PH ph;
+ if (!ph.ascii_load(s))
+ return false;
+ new_x.add_disjunct(ph);
+ }
+ x.swap(new_x);
+
+ // Check for well-formedness.
+ assert(x.OK());
+ return true;
+}
+
+template <typename PH>
+bool
+Polyhedra_Powerset<PH>::OK() const {
+ const Polyhedra_Powerset& x = *this;
+ for (const_iterator xi = x.begin(), x_end = x.end(); xi != x_end; ++xi) {
+ const PH& pi = xi->element();
+ 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 Polyhedra_Powersets {
+
+#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+//! Partitions polyhedron \p qq according to constraint \p c.
+/*! \relates Parma_Polyhedra_Library::Polyhedra_Powerset
+ On exit, the intersection of \p qq and constraint \p c is stored
+ in \p qq, whereas the intersection of \p qq with the negation of \p c
+ is added as a new disjunct of the powerset \p r.
+*/
+#endif // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+void
+linear_partition_aux(const Constraint& c,
+ PH& qq,
+ Polyhedra_Powerset<NNC_Polyhedron>& r) {
+ Linear_Expression le(c);
+ Constraint neg_c = c.is_strict_inequality() ? (le <= 0) : (le < 0);
+ NNC_Polyhedron qqq(qq);
+ if (qqq.add_constraint_and_minimize(neg_c))
+ r.add_disjunct(qqq);
+ qq.add_constraint(c);
+}
+
+} // namespace Polyhedra_Powersets
+
+} // namespace Implementation
+
+
+/*! \relates Polyhedra_Powerset */
+template <typename PH>
+std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+linear_partition(const PH& p, const PH& q) {
+ using Implementation::Polyhedra_Powersets::linear_partition_aux;
+
+ Polyhedra_Powerset<NNC_Polyhedron> r(p.space_dimension(), EMPTY);
+ PH qq = q;
+ const Constraint_System& pcs = p.constraints();
+ for (Constraint_System::const_iterator i = pcs.begin(),
+ pcs_end = pcs.end(); i != pcs_end; ++i) {
+ const Constraint c = *i;
+ if (c.is_equality()) {
+ Linear_Expression le(c);
+ linear_partition_aux(le <= 0, qq, r);
+ linear_partition_aux(le >= 0, qq, r);
+ }
+ else
+ linear_partition_aux(c, qq, r);
+ }
+ return std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >(qq, r);
+}
+
+} // namespace Parma_Polyhedra_Library
+
+// Automatically generated from PPL source file ../src/Polyhedra_Powerset.defs.hh line 552
+
+// 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/max_space_dimension.hh line 30
+#include <algorithm>
+
+namespace Parma_Polyhedra_Library {
+
+//! Returns the maximum space dimension this library can handle.
+inline dimension_type
+max_space_dimension() {
+ using std::min;
+ return
+ min(Polyhedron::max_space_dimension(),
+ min(Polyhedra_Powerset<C_Polyhedron>::max_space_dimension(),
+ Polyhedra_Powerset<NNC_Polyhedron>::max_space_dimension()
+ )
+ );
+}
+
+} // 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/algorithms.hh line 28
+#include <utility>
+#include <cassert>
+
+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 // 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 // PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
+template <typename PH>
+bool
+poly_hull_assign_if_exact(PH& p, const PH& q) {
+ PH phull = p;
+ NNC_Polyhedron nnc_p(p);
+ phull.poly_hull_assign(q);
+ std::pair<PH, Polyhedra_Powerset<NNC_Polyhedron> >
+ partition = linear_partition(q, phull);
+ const Polyhedra_Powerset<NNC_Polyhedron>& s = partition.second;
+ typedef Polyhedra_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->element()))
+ return false;
+ p = phull;
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+
+#ifdef PPL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PPL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/src/ppl_header.hh b/src/ppl_header.hh
new file mode 100644
index 0000000..b24a9b1
--- /dev/null
+++ b/src/ppl_header.hh
@@ -0,0 +1,51 @@
+/* This is the header file of the Parma Polyhedra Library.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_hh
+#define PPL_ppl_hh 1
+
+#ifdef NDEBUG
+# define PPL_SAVE_NDEBUG 1
+# undef NDEBUG
+#endif
+
+#include "config.h"
+#include "version.hh"
+#include "ppl_include_files.hh"
+
+#ifdef PPL_SAVE_NDEBUG
+# define NDEBUG 1
+# undef PPL_SAVE_NDEBUG
+#else
+# undef NDEBUG
+#endif
+#include <cassert>
+
+#undef PACKAGE
+#undef PACKAGE_BUGREPORT
+#undef PACKAGE_NAME
+#undef PACKAGE_STRING
+#undef PACKAGE_TARNAME
+#undef PACKAGE_VERSION
+#undef VERSION
+
+#endif
diff --git a/src/simplify.cc b/src/simplify.cc
new file mode 100644
index 0000000..6d8b45e
--- /dev/null
+++ b/src/simplify.cc
@@ -0,0 +1,307 @@
+/* Polyhedron class implementation: simplify().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "Linear_Row.defs.hh"
+#include "Linear_System.defs.hh"
+#include "Saturation_Row.defs.hh"
+#include "Saturation_Matrix.defs.hh"
+#include "Polyhedron.defs.hh"
+
+namespace PPL = 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.
+*/
+int
+PPL::Polyhedron::simplify(Linear_System& sys, Saturation_Matrix& sat) {
+ // This method is only applied to a well-formed system `sys'.
+ assert(sys.OK(true));
+
+ dimension_type num_rows = sys.num_rows();
+ const dimension_type num_columns = sys.num_columns();
+ const dimension_type num_cols_sat = sat.num_columns();
+
+ // 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]'.
+ static std::vector<dimension_type> num_saturators;
+ num_saturators.reserve(num_rows);
+
+ // 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[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[i].set_is_line_or_equality();
+ // Note: simple normalization already holds.
+ sys[i].sign_normalize();
+ // We also move it just after all the other equalities,
+ // so that system `sys' keeps its partial sortedness.
+ if (i != num_lines_or_equalities) {
+ std::swap(sys[i], sys[num_lines_or_equalities]);
+ std::swap(sat[i], sat[num_lines_or_equalities]);
+ std::swap(num_saturators[i], num_saturators[num_lines_or_equalities]);
+ }
+ ++num_lines_or_equalities;
+ // `sys' is no longer sorted.
+ sys.set_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();
+ }
+
+ // 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 moved 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;
+ std::swap(sys[redundant], sys[erasing]);
+ std::swap(sat[redundant], sat[erasing]);
+ std::swap(num_saturators[redundant], num_saturators[erasing]);
+ sys.set_sorted(false);
+ ++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;
+ // Adjusting the value of `num_lines_or_equalities'.
+ num_lines_or_equalities = rank;
+ }
+
+ // 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_irred_lines;
+ // dim_ray_space
+ // = dim_vector_space - num_irred_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 min_saturators
+ = 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;
+ std::swap(sys[i], sys[num_rows]);
+ std::swap(sat[i], sat[num_rows]);
+ std::swap(num_saturators[i], num_saturators[num_rows]);
+ sys.set_sorted(false);
+ }
+ 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;
+ std::swap(sys[j], sys[num_rows]);
+ std::swap(sat[j], sat[num_rows]);
+ std::swap(num_saturators[j], num_saturators[num_rows]);
+ sys.set_sorted(false);
+ }
+ 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;
+ std::swap(sys[i], sys[num_rows]);
+ std::swap(sat[i], sat[num_rows]);
+ std::swap(num_saturators[i], num_saturators[num_rows]);
+ sys.set_sorted(false);
+ }
+ else
+ // The inequality `sys[i]' is not redundant.
+ ++i;
+ }
+
+ // Here we physically remove the redundant inequalities previously
+ // moved to the bottom of `sys' and the corresponding `sat' rows.
+ sys.erase_to_end(num_rows);
+ sys.unset_pending_rows();
+ sat.rows_erase_to_end(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)
+ 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;
+}
diff --git a/src/swapping_sort.icc b/src/swapping_sort.icc
new file mode 100644
index 0000000..a5de46b
--- /dev/null
+++ b/src/swapping_sort.icc
@@ -0,0 +1,141 @@
+/* Sorting objects for which copies cost more than swaps. -*- C++ -*-
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_swapping_sort_icc
+#define PPL_swapping_sort_icc 1
+
+#include <iterator>
+#include <algorithm>
+
+namespace {
+/*
+ This sorting algorithm avoids (almost all) copies of objects
+ by performing more iter_swap's: it is meant to be used when
+ object copying costs much more than object swapping.
+
+ Moreover, the algorithm always uses std:iter_swap() instead of
+ std::swap() so as to behave as expected when instantiated on
+ Linear_System::With_Saturation_Matrix_iterator. Namely, using a sorting
+ routine that either copies objects or directly swaps them
+ (i.e., without calling std::iter_swap) would not be correct
+ when using Linear_System::With_Saturation_Matrix_iterator.
+*/
+
+template <typename Value_Type, typename Compare>
+inline const Value_Type&
+median(const Value_Type& x, const Value_Type& y, const Value_Type& z,
+ Compare comp) {
+ return comp(x, y)
+ ? (comp(y, z) ? y : (comp(x, z) ? z : x))
+ : (comp(x, z) ? x : (comp(y, z) ? z : y));
+}
+
+template <typename Iter, typename Value_Type, typename Compare>
+Iter
+swapping_partition(Iter first, Iter last, const Value_Type& pivot,
+ Compare comp) {
+ for ( ; ; ) {
+ while (comp(*first, pivot))
+ ++first;
+ --last;
+ while (comp(pivot, *last))
+ --last;
+ if (first < last) {
+ std::iter_swap(first, last);
+ ++first;
+ }
+ else
+ return first;
+ }
+}
+
+template <typename Iter, typename Compare>
+void
+swapping_insertion_sort(Iter first, Iter last, Compare comp) {
+ if (first == last)
+ return;
+ for (Iter i = first + 1; i != last; ++i) {
+ Iter current = i;
+ if (comp(*current, *first)) {
+ Iter next = current + 1;
+ while (current != first)
+ std::iter_swap(--current, --next);
+ }
+ else {
+ Iter previous = current - 1;
+ while (comp(*current, *previous))
+ std::iter_swap(current--, previous--);
+ }
+ }
+}
+
+template <typename Iter, typename Compare>
+void
+swapping_quicksort_loop(Iter first, Iter last, Compare comp) {
+ const typename std::iterator_traits<Iter>::difference_type threshold = 16;
+ while (last - first > threshold) {
+ // The construction of this temporary object is
+ // required for the correctness of the algorithm.
+ Iter middle = first + (last - first) / 2;
+ typename std::iterator_traits<Iter>::value_type
+ pivot = median(*first, *middle, *(last - 1), comp);
+ Iter part_point = swapping_partition(first, last, pivot, comp);
+ swapping_quicksort_loop(part_point, last, comp);
+ last = part_point;
+ }
+}
+
+template <typename Iter, typename Compare>
+inline void
+swapping_sort(Iter first, Iter last, Compare comp) {
+ if (first == last)
+ return;
+ swapping_quicksort_loop(first, last, comp);
+ swapping_insertion_sort(first, last, comp);
+}
+
+template <typename Iter>
+Iter
+swapping_unique(Iter first, Iter last) {
+ if (first == last)
+ return last;
+ Iter current = first;
+ Iter next = current;
+ ++next;
+ while(next != last && *current != *next) {
+ current = next;
+ ++next;
+ }
+ if (next == last)
+ return last;
+ ++next;
+ while (next != last) {
+ if (*current != *next)
+ std::iter_swap(++current, next);
+ ++next;
+ }
+ return ++current;
+}
+
+} // namespace
+
+#endif // !defined(PPL_swapping_sort_icc)
diff --git a/src/version.cc b/src/version.cc
new file mode 100644
index 0000000..72cbeab
--- /dev/null
+++ b/src/version.cc
@@ -0,0 +1,83 @@
+/* Definition of functions providing version and licensing information.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+#include "version.hh"
+
+namespace PPL = Parma_Polyhedra_Library;
+
+namespace {
+
+const char version_string[] = PACKAGE_VERSION;
+
+const char banner_string[] =
+"This is "PACKAGE_NAME" (PPL) version "PACKAGE_VERSION".\n"
+"Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>.\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"
+#if defined(__GNUC__)
+"Compiled by the GNU C++ compiler version "__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(__COMO__)
+#define str(s) # s
+#define xstr(s) str(s)
+"Compiled by the Comeau C++ compiler version "xstr(__COMO_VERSION__)".\n"
+#endif
+"Report bugs to "PACKAGE_BUGREPORT".\n"
+"For the most up-to-date information see the Parma Polyhedra Library\n"
+"site: http://www.cs.unipr.it/ppl/ .\n";
+
+} // 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..01d76d8
--- /dev/null
+++ b/src/version.hh.in
@@ -0,0 +1,92 @@
+/* Declaration of macros and functions providing version -*- C++ -*-
+ and licensing information.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 {
+
+//! 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();
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_version_hh)
diff --git a/tests/BBox.cc b/tests/BBox.cc
new file mode 100644
index 0000000..a113b88
--- /dev/null
+++ b/tests/BBox.cc
@@ -0,0 +1,188 @@
+/* Implementation of class BBox (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "globals.defs.hh"
+#include "Coefficient.defs.hh"
+#include "BBox.hh"
+
+#include "Variable.defs.hh"
+#include <iostream>
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+void
+BInterval::raise_lower_bound(bool closed,
+ Coefficient_traits::const_reference c,
+ Coefficient_traits::const_reference d) {
+ assert(d > 0 && ld >= 0);
+ if ((closed && lc*d <= c*ld) || (!closed && lc*d < c*ld)) {
+ lc = c;
+ ld = d;
+ lclosed = closed;
+ }
+}
+
+void
+BInterval::lower_upper_bound(bool closed,
+ Coefficient_traits::const_reference c,
+ Coefficient_traits::const_reference d) {
+ assert(d > 0 && ud >= 0);
+ if ((!closed && uc*d >= c*ud) || (closed && uc*d > c*ud)) {
+ uc = c;
+ ud = d;
+ uclosed = closed;
+ }
+}
+
+void
+BInterval::set_empty() {
+ uc = -1;
+ lc = 1;
+ ud = 1;
+ ld = 1;
+}
+
+static void
+print_rational(std::ostream& s,
+ Coefficient_traits::const_reference c,
+ Coefficient_traits::const_reference d) {
+ s << c;
+ if (d != 1)
+ s << "/" << d;
+}
+
+void
+BInterval::print(std::ostream& s) const {
+ if (ld != 0) {
+ s << (lclosed ? "[" : "(");
+ print_rational(s, lc, ld);
+ }
+ else
+ s << "(-inf";
+ s << ", ";
+ if (ud != 0) {
+ print_rational(s, uc, ud);
+ s << (uclosed ? "]" : ")");
+ }
+ else
+ s << "+inf)";
+}
+
+bool
+operator==(const BInterval& x, const BInterval& y) {
+ return x.lclosed == y.lclosed
+ && x.uclosed == y.uclosed
+ && x.lc*y.ld == y.lc*x.ld
+ && x.uc*y.ud == y.uc*x.ud;
+}
+
+bool
+operator<=(const BInterval& x, const BInterval& y) {
+ int l_sign = sgn(x.ld) * sgn(y.ld);
+ int u_sign = sgn(x.ud) * sgn(y.ud);
+ if (y.lclosed || (!x.lclosed && !y.lclosed)) {
+ if (l_sign > 0 && x.lc * y.ld < y.lc * x.ld)
+ return false;
+ if (l_sign < 0 && x.lc * y.ld > y.lc * x.ld)
+ return false;
+ if (l_sign == 0)
+ if (x.ld == 0 && x.lc < 0 && (y.ld != 0 || (y.ld == 0 && y.ld > 0)))
+ return false;
+ }
+ else {
+ assert(!y.lclosed && x.lclosed);
+ if (l_sign > 0 && x.lc * y.ld <= y.lc * x.ld)
+ return false;
+ if (l_sign < 0 && x.lc * y.ld >= y.lc * x.ld)
+ return false;
+ if (l_sign == 0)
+ if (x.ld == 0 && x.lc < 0)
+ return false;
+ }
+ if (y.uclosed || (!x.uclosed && !y.uclosed)) {
+ if (u_sign > 0 && x.uc * y.ud > y.uc * x.ud)
+ return false;
+ if (u_sign < 0 && x.uc * y.ud < y.uc * x.ud)
+ return false;
+ if (u_sign == 0)
+ if (x.ud == 0 && x.uc > 0 && (y.ud != 0 || (y.ud == 0 && y.ud < 0)))
+ return false;
+ }
+ else {
+ assert(!y.uclosed && x.uclosed);
+ if (u_sign > 0 && x.uc * y.ud >= y.uc * x.ud)
+ return false;
+ if (u_sign < 0 && x.uc * y.ud <= y.uc * x.ud)
+ return false;
+ if (u_sign == 0)
+ if (x.ud == 0 && x.uc > 0)
+ return false;
+ }
+ return true;
+}
+
+void
+BBox::print(std::ostream& s, const std::string& intro) const {
+ if (!intro.empty())
+ s << intro << std::endl;
+ dimension_type dim = box.size();
+ for (dimension_type j = 0; j != dim ; j++) {
+ s << Variable(j) << ": ";
+ box[j].print(s);
+ s << std::endl;
+ }
+}
+
+void
+BBox::set_empty() {
+ for (dimension_type k = box.size(); k-- > 0; )
+ box[k].set_empty();
+}
+
+bool
+operator==(const BBox& x, const BBox& y) {
+ dimension_type dimension = x.space_dimension();
+ if (dimension != y.space_dimension())
+ return false;
+
+ for (dimension_type i = dimension; i-- > 0; )
+ if (x[i] != y[i])
+ return false;
+
+ return true;
+}
+
+bool
+operator<=(const BBox& x, const BBox& y) {
+ dimension_type dimension = x.space_dimension();
+ if (dimension > y.space_dimension())
+ return false;
+
+ for (dimension_type i = dimension; i-- > 0; )
+ if (!(x[i] <= y[i]))
+ return false;
+
+ return true;
+}
diff --git a/tests/BBox.hh b/tests/BBox.hh
new file mode 100644
index 0000000..ff3327b
--- /dev/null
+++ b/tests/BBox.hh
@@ -0,0 +1,129 @@
+/* Declarations and inline functions for class BBox, a toy bounding box.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_BBox_hh
+#define PPL_BBox_hh 1
+
+#include <iosfwd>
+#include <vector>
+
+class BInterval {
+public:
+ BInterval();
+ void raise_lower_bound
+ (bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+ void lower_upper_bound
+ (bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+ void set_empty();
+ void print(std::ostream& s) const;
+
+private:
+ bool uclosed;
+ Parma_Polyhedra_Library::Coefficient uc;
+ Parma_Polyhedra_Library::Coefficient ud;
+ bool lclosed;
+ Parma_Polyhedra_Library::Coefficient lc;
+ Parma_Polyhedra_Library::Coefficient ld;
+
+ friend bool operator==(const BInterval& x, const BInterval& y);
+ friend bool operator<=(const BInterval& x, const BInterval& y);
+};
+
+inline
+BInterval::BInterval()
+ : uclosed(true), uc(1), ud(0), lclosed(true), lc(-1), ld(0) {
+}
+
+inline bool
+operator!=(const BInterval& x, const BInterval& y) {
+ return !(x == y);
+}
+
+class BBox {
+public:
+ BBox(Parma_Polyhedra_Library::dimension_type dimension);
+ Parma_Polyhedra_Library::dimension_type space_dimension() const;
+ const BInterval& operator[](Parma_Polyhedra_Library::dimension_type k) const;
+ void print(std::ostream& s, const std::string& intro = "") const;
+ void raise_lower_bound
+ (Parma_Polyhedra_Library::dimension_type k, bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+ void lower_upper_bound
+ (Parma_Polyhedra_Library::dimension_type k, bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d);
+ void set_empty();
+
+private:
+ std::vector<BInterval> box;
+};
+
+inline
+BBox::BBox(Parma_Polyhedra_Library::dimension_type dimension) {
+ box.resize(dimension);
+}
+
+inline Parma_Polyhedra_Library::dimension_type
+BBox::space_dimension() const {
+ return box.size();
+}
+
+inline const BInterval&
+BBox::operator[](Parma_Polyhedra_Library::dimension_type k) const {
+ return box[k];
+}
+
+inline void
+BBox::raise_lower_bound
+(Parma_Polyhedra_Library::dimension_type k, bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d) {
+ assert(k < box.size());
+ box[k].raise_lower_bound(closed, c, d);
+}
+
+inline void
+BBox::lower_upper_bound
+(Parma_Polyhedra_Library::dimension_type k, bool closed,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference c,
+ Parma_Polyhedra_Library::Coefficient_traits::const_reference d) {
+ assert(k < box.size());
+ box[k].lower_upper_bound(closed, c, d);
+}
+
+bool
+operator==(const BBox& x, const BBox& y);
+
+bool
+operator<=(const BBox& x, const BBox& y);
+
+inline bool
+operator!=(const BBox& x, const BBox& y) {
+ return !(x == y);
+}
+
+#endif // !defined(PPL_BBox_hh)
diff --git a/tests/BD_Shape/Makefile.am b/tests/BD_Shape/Makefile.am
new file mode 100644
index 0000000..ff2ab73
--- /dev/null
+++ b/tests/BD_Shape/Makefile.am
@@ -0,0 +1,202 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+#CHECKER =
+CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = CHEKER="$(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 affinepreimage2 \
+ ascii_dump_load1 \
+ bdsdifference1 \
+ bdshull1 \
+ bgp99extrapolation1 \
+ bhmz05widening1 \
+ bhz03widening1 \
+ cc76narrowing1 \
+ cc76extrapolation1 \
+ closure1 \
+ concatenate1 \
+ constraints1 \
+ contains1 \
+ empty1 \
+ equality1 \
+ fromgensys1 \
+ generalizedaffineimage1 generalizedaffineimage2 \
+ generalizedaffinepreimage1 generalizedaffinepreimage2 \
+ geomcovers1 \
+ h79widening1 \
+ intersection1 \
+ limitedbhmz05extrapolation1 \
+ limitedcc76extrapolation1 \
+ limitedh79extrapolation1 \
+ mapspacedims1 \
+ maxspacedim \
+ minconstraints1 \
+ relations1 relations2 relations3 \
+ removespacedims1 \
+ timeelapse1 \
+ universe1 \
+ writebdshape1
+
+# This will be overriden by the `run_tests' script.
+TEST_CPPFLAGS=-DBD_SHAPE_INSTANCE=mpq_class
+
+dist_check_SCRIPTS = run_tests
+
+TESTS = $(dist_check_SCRIPTS)
+
+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
+affinepreimage2_SOURCES = affinepreimage2.cc
+
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+
+bdsdifference1_SOURCES = bdsdifference1.cc
+
+bdshull1_SOURCES = bdshull1.cc
+
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+
+closure1_SOURCES = closure1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+
+empty1_SOURCES = empty1.cc
+
+equality1_SOURCES = equality1.cc
+
+fromgensys1_SOURCES = fromgensys1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+
+geomcovers1_SOURCES = geomcovers1.cc
+
+h79widening1_SOURCES = h79widening1.cc
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+mapspacedims1_SOURCES = mapspacedims1.cc
+
+maxspacedim_SOURCES = maxspacedim.cc
+
+minconstraints1_SOURCES = minconstraints1.cc
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+universe1_SOURCES = universe1.cc
+
+writebdshape1_SOURCES = writebdshape1.cc
+
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
diff --git a/tests/BD_Shape/Makefile.in b/tests/BD_Shape/Makefile.in
new file mode 100644
index 0000000..147ca7c
--- /dev/null
+++ b/tests/BD_Shape/Makefile.in
@@ -0,0 +1,1217 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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) \
+ affinepreimage2$(EXEEXT) ascii_dump_load1$(EXEEXT) \
+ bdsdifference1$(EXEEXT) bdshull1$(EXEEXT) \
+ bgp99extrapolation1$(EXEEXT) bhmz05widening1$(EXEEXT) \
+ bhz03widening1$(EXEEXT) cc76narrowing1$(EXEEXT) \
+ cc76extrapolation1$(EXEEXT) closure1$(EXEEXT) \
+ concatenate1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+ empty1$(EXEEXT) equality1$(EXEEXT) fromgensys1$(EXEEXT) \
+ generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) geomcovers1$(EXEEXT) \
+ h79widening1$(EXEEXT) intersection1$(EXEEXT) \
+ limitedbhmz05extrapolation1$(EXEEXT) \
+ limitedcc76extrapolation1$(EXEEXT) \
+ limitedh79extrapolation1$(EXEEXT) mapspacedims1$(EXEEXT) \
+ maxspacedim$(EXEEXT) minconstraints1$(EXEEXT) \
+ relations1$(EXEEXT) relations2$(EXEEXT) relations3$(EXEEXT) \
+ removespacedims1$(EXEEXT) timeelapse1$(EXEEXT) \
+ universe1$(EXEEXT) writebdshape1$(EXEEXT)
+subdir = tests/BD_Shape
+DIST_COMMON = $(dist_check_SCRIPTS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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_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_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_bdsdifference1_OBJECTS = bdsdifference1.$(OBJEXT)
+bdsdifference1_OBJECTS = $(am_bdsdifference1_OBJECTS)
+bdsdifference1_LDADD = $(LDADD)
+bdsdifference1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_bdshull1_OBJECTS = bdshull1.$(OBJEXT)
+bdshull1_OBJECTS = $(am_bdshull1_OBJECTS)
+bdshull1_LDADD = $(LDADD)
+bdshull1_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_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_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_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_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_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_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_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_maxspacedim_OBJECTS = maxspacedim.$(OBJEXT)
+maxspacedim_OBJECTS = $(am_maxspacedim_OBJECTS)
+maxspacedim_LDADD = $(LDADD)
+maxspacedim_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_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_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_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_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
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+ $(affinepreimage2_SOURCES) $(ascii_dump_load1_SOURCES) \
+ $(bdsdifference1_SOURCES) $(bdshull1_SOURCES) \
+ $(bgp99extrapolation1_SOURCES) $(bhmz05widening1_SOURCES) \
+ $(bhz03widening1_SOURCES) $(cc76extrapolation1_SOURCES) \
+ $(cc76narrowing1_SOURCES) $(closure1_SOURCES) \
+ $(concatenate1_SOURCES) $(constraints1_SOURCES) \
+ $(contains1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+ $(fromgensys1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(geomcovers1_SOURCES) \
+ $(h79widening1_SOURCES) $(intersection1_SOURCES) \
+ $(limitedbhmz05extrapolation1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(maxspacedim_SOURCES) $(minconstraints1_SOURCES) \
+ $(relations1_SOURCES) $(relations2_SOURCES) \
+ $(relations3_SOURCES) $(removespacedims1_SOURCES) \
+ $(timeelapse1_SOURCES) $(universe1_SOURCES) \
+ $(writebdshape1_SOURCES)
+DIST_SOURCES = $(addconstraints1_SOURCES) $(addspacedims1_SOURCES) \
+ $(affinedimension1_SOURCES) $(affineimage1_SOURCES) \
+ $(affineimage2_SOURCES) $(affinepreimage1_SOURCES) \
+ $(affinepreimage2_SOURCES) $(ascii_dump_load1_SOURCES) \
+ $(bdsdifference1_SOURCES) $(bdshull1_SOURCES) \
+ $(bgp99extrapolation1_SOURCES) $(bhmz05widening1_SOURCES) \
+ $(bhz03widening1_SOURCES) $(cc76extrapolation1_SOURCES) \
+ $(cc76narrowing1_SOURCES) $(closure1_SOURCES) \
+ $(concatenate1_SOURCES) $(constraints1_SOURCES) \
+ $(contains1_SOURCES) $(empty1_SOURCES) $(equality1_SOURCES) \
+ $(fromgensys1_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(geomcovers1_SOURCES) \
+ $(h79widening1_SOURCES) $(intersection1_SOURCES) \
+ $(limitedbhmz05extrapolation1_SOURCES) \
+ $(limitedcc76extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(maxspacedim_SOURCES) $(minconstraints1_SOURCES) \
+ $(relations1_SOURCES) $(relations2_SOURCES) \
+ $(relations3_SOURCES) $(removespacedims1_SOURCES) \
+ $(timeelapse1_SOURCES) $(universe1_SOURCES) \
+ $(writebdshape1_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+
+#CHECKER =
+CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = CHEKER="$(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 overriden by the `run_tests' script.
+TEST_CPPFLAGS = -DBD_SHAPE_INSTANCE=mpq_class
+dist_check_SCRIPTS = run_tests
+TESTS = $(dist_check_SCRIPTS)
+XFAIL_TESTS =
+ 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
+affinepreimage2_SOURCES = affinepreimage2.cc
+ascii_dump_load1_SOURCES = ascii_dump_load1.cc
+bdsdifference1_SOURCES = bdsdifference1.cc
+bdshull1_SOURCES = bdshull1.cc
+bgp99extrapolation1_SOURCES = bgp99extrapolation1.cc
+bhmz05widening1_SOURCES = bhmz05widening1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+cc76narrowing1_SOURCES = cc76narrowing1.cc
+cc76extrapolation1_SOURCES = cc76extrapolation1.cc
+closure1_SOURCES = closure1.cc
+concatenate1_SOURCES = concatenate1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+empty1_SOURCES = empty1.cc
+equality1_SOURCES = equality1.cc
+fromgensys1_SOURCES = fromgensys1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+geomcovers1_SOURCES = geomcovers1.cc
+h79widening1_SOURCES = h79widening1.cc
+intersection1_SOURCES = intersection1.cc
+limitedbhmz05extrapolation1_SOURCES = limitedbhmz05extrapolation1.cc
+limitedcc76extrapolation1_SOURCES = limitedcc76extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+mapspacedims1_SOURCES = mapspacedims1.cc
+maxspacedim_SOURCES = maxspacedim.cc
+minconstraints1_SOURCES = minconstraints1.cc
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+universe1_SOURCES = universe1.cc
+writebdshape1_SOURCES = writebdshape1.cc
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/BD_Shape/Makefile'; \
+ 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
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+affinedimension1$(EXEEXT): $(affinedimension1_OBJECTS) $(affinedimension1_DEPENDENCIES)
+ @rm -f affinedimension1$(EXEEXT)
+ $(CXXLINK) $(affinedimension1_LDFLAGS) $(affinedimension1_OBJECTS) $(affinedimension1_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES)
+ @rm -f affineimage2$(EXEEXT)
+ $(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES)
+ @rm -f affinepreimage2$(EXEEXT)
+ $(CXXLINK) $(affinepreimage2_LDFLAGS) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(CXXLINK) $(ascii_dump_load1_LDFLAGS) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+bdsdifference1$(EXEEXT): $(bdsdifference1_OBJECTS) $(bdsdifference1_DEPENDENCIES)
+ @rm -f bdsdifference1$(EXEEXT)
+ $(CXXLINK) $(bdsdifference1_LDFLAGS) $(bdsdifference1_OBJECTS) $(bdsdifference1_LDADD) $(LIBS)
+bdshull1$(EXEEXT): $(bdshull1_OBJECTS) $(bdshull1_DEPENDENCIES)
+ @rm -f bdshull1$(EXEEXT)
+ $(CXXLINK) $(bdshull1_LDFLAGS) $(bdshull1_OBJECTS) $(bdshull1_LDADD) $(LIBS)
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES)
+ @rm -f bgp99extrapolation1$(EXEEXT)
+ $(CXXLINK) $(bgp99extrapolation1_LDFLAGS) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+bhmz05widening1$(EXEEXT): $(bhmz05widening1_OBJECTS) $(bhmz05widening1_DEPENDENCIES)
+ @rm -f bhmz05widening1$(EXEEXT)
+ $(CXXLINK) $(bhmz05widening1_LDFLAGS) $(bhmz05widening1_OBJECTS) $(bhmz05widening1_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+cc76extrapolation1$(EXEEXT): $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_DEPENDENCIES)
+ @rm -f cc76extrapolation1$(EXEEXT)
+ $(CXXLINK) $(cc76extrapolation1_LDFLAGS) $(cc76extrapolation1_OBJECTS) $(cc76extrapolation1_LDADD) $(LIBS)
+cc76narrowing1$(EXEEXT): $(cc76narrowing1_OBJECTS) $(cc76narrowing1_DEPENDENCIES)
+ @rm -f cc76narrowing1$(EXEEXT)
+ $(CXXLINK) $(cc76narrowing1_LDFLAGS) $(cc76narrowing1_OBJECTS) $(cc76narrowing1_LDADD) $(LIBS)
+closure1$(EXEEXT): $(closure1_OBJECTS) $(closure1_DEPENDENCIES)
+ @rm -f closure1$(EXEEXT)
+ $(CXXLINK) $(closure1_LDFLAGS) $(closure1_OBJECTS) $(closure1_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(CXXLINK) $(constraints1_LDFLAGS) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES)
+ @rm -f empty1$(EXEEXT)
+ $(CXXLINK) $(empty1_LDFLAGS) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+equality1$(EXEEXT): $(equality1_OBJECTS) $(equality1_DEPENDENCIES)
+ @rm -f equality1$(EXEEXT)
+ $(CXXLINK) $(equality1_LDFLAGS) $(equality1_OBJECTS) $(equality1_LDADD) $(LIBS)
+fromgensys1$(EXEEXT): $(fromgensys1_OBJECTS) $(fromgensys1_DEPENDENCIES)
+ @rm -f fromgensys1$(EXEEXT)
+ $(CXXLINK) $(fromgensys1_LDFLAGS) $(fromgensys1_OBJECTS) $(fromgensys1_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage2$(EXEEXT)
+ $(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES)
+ @rm -f geomcovers1$(EXEEXT)
+ $(CXXLINK) $(geomcovers1_LDFLAGS) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES)
+ @rm -f h79widening1$(EXEEXT)
+ $(CXXLINK) $(h79widening1_LDFLAGS) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+limitedbhmz05extrapolation1$(EXEEXT): $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_DEPENDENCIES)
+ @rm -f limitedbhmz05extrapolation1$(EXEEXT)
+ $(CXXLINK) $(limitedbhmz05extrapolation1_LDFLAGS) $(limitedbhmz05extrapolation1_OBJECTS) $(limitedbhmz05extrapolation1_LDADD) $(LIBS)
+limitedcc76extrapolation1$(EXEEXT): $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_DEPENDENCIES)
+ @rm -f limitedcc76extrapolation1$(EXEEXT)
+ $(CXXLINK) $(limitedcc76extrapolation1_LDFLAGS) $(limitedcc76extrapolation1_OBJECTS) $(limitedcc76extrapolation1_LDADD) $(LIBS)
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES)
+ @rm -f limitedh79extrapolation1$(EXEEXT)
+ $(CXXLINK) $(limitedh79extrapolation1_LDFLAGS) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+maxspacedim$(EXEEXT): $(maxspacedim_OBJECTS) $(maxspacedim_DEPENDENCIES)
+ @rm -f maxspacedim$(EXEEXT)
+ $(CXXLINK) $(maxspacedim_LDFLAGS) $(maxspacedim_OBJECTS) $(maxspacedim_LDADD) $(LIBS)
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES)
+ @rm -f minconstraints1$(EXEEXT)
+ $(CXXLINK) $(minconstraints1_LDFLAGS) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES)
+ @rm -f relations2$(EXEEXT)
+ $(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES)
+ @rm -f relations3$(EXEEXT)
+ $(CXXLINK) $(relations3_LDFLAGS) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES)
+ @rm -f universe1$(EXEEXT)
+ $(CXXLINK) $(universe1_LDFLAGS) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+writebdshape1$(EXEEXT): $(writebdshape1_OBJECTS) $(writebdshape1_DEPENDENCIES)
+ @rm -f writebdshape1$(EXEEXT)
+ $(CXXLINK) $(writebdshape1_LDFLAGS) $(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)/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)/bdsdifference1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/bdshull1.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)/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)/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)/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)/fromgensys1.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)/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)/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)/maxspacedim.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)/removespacedims1.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)/universe1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writebdshape1.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; \
+ 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; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ 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 \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ 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`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool ctags \
+ 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-exec install-exec-am install-info \
+ install-info-am install-man 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 uninstall uninstall-am uninstall-info-am
+
+
+print_check_PROGRAMS:
+ echo $(check_PROGRAMS)
+
+print_INSTANCES:
+ echo $(INSTANCES)
+# 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..fa79a46
--- /dev/null
+++ b/tests/BD_Shape/addconstraints1.cc
@@ -0,0 +1,231 @@
+/* Test BD_Shape::add_constraints_and_minimize().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 bd1(2);
+ bd1.add_constraints_and_minimize(cs);
+
+ print_constraints(bd1, "*** bd1.add_constraints_and_minimize(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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+
+ try {
+ // This is an invalid use of function
+ // BD_Shape::add_constraint: it is illegal
+ // to add a strict inequality.
+ bd1.add_constraint(x <= 0);
+ bd1.add_constraint(y < 0);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(2);
+
+ try {
+ // This is an invalid use of function
+ // BD_Shape::add_constraint: it is illegal
+ // to add a constraint with bigger dimension.
+ bd1.add_constraint(x <= 0);
+ bd1.add_constraint(y - x + z >= 0);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(3);
+
+ try {
+ // This is an invalid use of function
+ // BD_Shape::add_constraint: it is illegal
+ // to add a constraint with three dimension.
+ bd1.add_constraint(x <= 0);
+ bd1.add_constraint(y - x + z >= 0);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(3);
+
+ try {
+ // This is an invalid use of function
+ // BD_Shape::add_constraint: it is illegal
+ // to add a constraint with two different coefficients.
+ bd1.add_constraint(x <= 0);
+ bd1.add_constraint(2*y - 3*x <= 0);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(1);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::add_constraints_and_minimize(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);
+ bd.add_constraints_and_minimize(cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test07() {
+ Variable y(1);
+
+ TBD_Shape bd(1);
+
+ try {
+ // This is an invalid use of the function
+ // RBD_Shape::add_constraint(c): it is illegal to insert a
+ // constraints that contains a variable that is not in the space
+ // of the polyhedron.
+ bd.add_constraint(y >= 0);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(1);
+
+ try {
+ // This is an invalid use of the function
+ // 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);
+ bd.add_constraints(cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/BD_Shape/addspacedims1.cc b/tests/BD_Shape/addspacedims1.cc
new file mode 100644
index 0000000..ee7852a
--- /dev/null
+++ b/tests/BD_Shape/addspacedims1.cc
@@ -0,0 +1,277 @@
+/* Test BD_Shape::add_space_dimensions_and_embed():
+ we add two variables to a BD_Shape.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.add_space_dimensions_and_embed(2);
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd,
+ "*** bd.add_space_dimensions_and_embed(2) "
+ "and bd.add_constraint(z <= 2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bd1(0, EMPTY);
+ TBD_Shape bd2(1, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.add_space_dimensions_and_embed(2);
+ bd2.add_space_dimensions_and_embed(1);
+
+ bool ok = (bd1 == bd2) ;
+
+ print_constraints(bd1, "*** bd1.add_space_dimensions_and_embed(2) ***");
+ print_constraints(bd2, "*** bd2.add_space_dimensions_and_embed(1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ TBD_Shape bd1(0, UNIVERSE);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.add_space_dimensions_and_embed(3);
+
+ BD_Shape<mpq_class> known_result(3, UNIVERSE);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.add_space_dimension_and_embed(3) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bd1(0);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(4) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A == 1);
+ bd1.add_constraint(C - B >= 9);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.add_space_dimensions_and_project(0);
+
+ print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(0) ***");
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ return ok;
+}
+
+bool
+test06() {
+ //Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bd1(1);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBD_Shape bd(10, UNIVERSE);
+
+ bd.remove_higher_space_dimensions(5);
+ bd.add_space_dimensions_and_embed(6);
+
+ return bd == TBD_Shape(11, UNIVERSE);
+}
+
+bool
+test08() {
+ Variable x(0);
+ //Variable y(1);
+ Variable z(2);
+ Variable w(3);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.add_space_dimensions_and_project(2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ TBD_Shape bd1(0, EMPTY);
+ TBD_Shape bd2(1, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.add_space_dimensions_and_project(2);
+ bd2.add_space_dimensions_and_project(1);
+
+ bool ok = (bd1 == bd2) ;
+
+ print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(2) ***");
+ print_constraints(bd2, "*** bd2.add_space_dimensions_and_project(1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ TBD_Shape bd1(0, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.add_space_dimensions_and_project(3);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.add_space_dimension_and_project(3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bd1(0);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.add_space_dimensions_and_project(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);
+END_MAIN
diff --git a/tests/BD_Shape/affinedimension1.cc b/tests/BD_Shape/affinedimension1.cc
new file mode 100644
index 0000000..2958abb
--- /dev/null
+++ b/tests/BD_Shape/affinedimension1.cc
@@ -0,0 +1,236 @@
+/* Test BD_Shape::affine_dimension().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y == 3);
+ bd1.add_constraint(y <= 2);
+
+ TBD_Shape bd2(2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ dimension_type affine_dim1 = bd1.affine_dimension();
+ dimension_type affine_dim2 = bd2.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bd1' "
+ << endl
+ << affine_dim1
+ << endl;
+
+ nout << endl
+ << "The affine dimension of a system of `bd2' "
+ << endl
+ << affine_dim2
+ << endl;
+
+ bool ok = (affine_dim1 == affine_dim2);
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bd1(5);
+
+ bd1.add_constraint(A <= 5);
+ bd1.add_constraint(A - B == 3);
+ bd1.add_constraint(C <= 2);
+ bd1.add_constraint(E - D == 2);
+
+ TBD_Shape bd2(4);
+
+ bd2.add_constraint(A <= 1);
+ bd2.add_constraint(A - D == 8);
+ bd2.add_constraint(B <= 7);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ dimension_type affine_dim1 = bd1.affine_dimension();
+ dimension_type affine_dim2 = bd2.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bd1' "
+ << endl
+ << affine_dim1
+ << endl;
+
+ nout << endl
+ << "The affine dimension of a system of `bd2' "
+ << endl
+ << affine_dim2
+ << endl;
+
+ bool ok = (affine_dim1 == affine_dim2);
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bd1(5);
+
+ bd1.add_constraint(A == 5);
+ bd1.add_constraint(A - B == 3);
+ bd1.add_constraint(C <= 2);
+ bd1.add_constraint(E - D == 2);
+
+ TBD_Shape bd2(5);
+
+ bd2.add_constraint(A == 1);
+ bd2.add_constraint(E == 1);
+ bd2.add_constraint(A - D == 8);
+ bd2.add_constraint(B <= 7);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ dimension_type affine_dim1 = bd1.affine_dimension();
+ dimension_type affine_dim2 = bd2.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bd1' "
+ << endl
+ << affine_dim1
+ << endl;
+
+ nout << endl
+ << "The affine dimension of a system of `bd2' "
+ << endl
+ << affine_dim2
+ << endl;
+
+ bool ok = (affine_dim1 == affine_dim2);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+
+ bd1.add_constraint(A <= 3);
+ bd1.add_constraint(B - A <= -5);
+ bd1.add_constraint(-B <= 2);
+
+ TBD_Shape bd2(2);
+
+ bd2.add_constraint(A == 0);
+ bd2.add_constraint(B == 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ dimension_type affine_dim1 = bd1.affine_dimension();
+ dimension_type affine_dim2 = bd2.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bd1' "
+ << endl
+ << affine_dim1
+ << endl;
+
+ nout << endl
+ << "The affine dimension of a system of `bd2' "
+ << endl
+ << affine_dim2
+ << endl;
+
+ bool ok = (affine_dim1 == affine_dim2);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2, EMPTY);
+
+ TBD_Shape bd2(7);
+
+ bd2.add_constraint(A <= 1);
+ bd2.add_constraint(B == 2);
+ bd2.add_constraint(B - A <= -6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ dimension_type affine_dim1 = bd1.affine_dimension();
+ dimension_type affine_dim2 = bd2.affine_dimension();
+
+ nout << endl
+ << "The affine dimension of a system of `bd1' "
+ << endl
+ << affine_dim1
+ << endl;
+
+ nout << endl
+ << "The affine dimension of a system of `bd2' "
+ << endl
+ << affine_dim2
+ << endl;
+
+ bool ok = (affine_dim1 == affine_dim2);
+
+ 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/affineimage1.cc b/tests/BD_Shape/affineimage1.cc
new file mode 100644
index 0000000..540f84b
--- /dev/null
+++ b/tests/BD_Shape/affineimage1.cc
@@ -0,0 +1,467 @@
+/* Test BD_Shape::affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_image(x, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_image(x, x + 4) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_image(x, 4) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.affine_image(x, x);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_image(x, x) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_image(x, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_image(y, 2*x, 2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_image(y, 3*x + 3, 3) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= -1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "3.70e-7", "2.10e-7", "1.44e-7");
+
+ print_constraints(bd, "*** bd.affine_image(x, -2*x - 3*y + 1, -5) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(z >= 3);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result);
+
+ print_constraints(bd, "*** bd.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 bd(4);
+ bd.add_constraint(A <= 1);
+ bd.add_constraint(B <= 2);
+ bd.add_constraint(B >= 1);
+ bd.add_constraint(C <= 0);
+ bd.add_constraint(D == 3);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "7.95e-8", "7.95e-8", "7.95e-8");
+
+ print_constraints(bd, "*** bd.affine_image(A, -B + 2*C + 1, -3) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.affine_image(x, 2*y + z + 2, 4);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, 2*y + z + 2, 4) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x - y >= 0);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(x <= 2);
+
+ Linear_Expression coeff1 = x + 1;
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::affine_image(v, expr,d): it is illegal applying
+ // the function with a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 0;
+ bd.affine_image(x, coeff1, d);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(1);
+ bd.add_constraint(x >= 1);
+
+ try {
+ // This is an invalid used of the function
+ // BD_Shape::affine_image(v, expr, d): it is illegal to
+ // apply this function to a variable that is not in the space of
+ // the polyhedron.
+ bd.affine_image(y, x + 1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= 1);
+ bd.add_constraint(y >= 1);
+
+ try {
+ // This is an invalid used of the function
+ // 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.
+ bd.affine_image(y, x + z + 1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x - y >= 0);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(x <= 2);
+
+ Linear_Expression coeff1 = 2*x + 1;
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::affine_image(v, expr,d): it is illegal applying
+ // the function with a linear expression with the denominator equal to
+ // zero.
+ Coefficient d = 3;
+ bd.affine_image(x, coeff1, d);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= 1);
+ bd.add_constraint(y >= 1);
+
+ try {
+ // This is an invalid used of the function
+ // BD_Shape::affine_image(v, expr, d): it is illegal to
+ // use two variables in the expression.
+ bd.affine_image(y, y - x);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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
diff --git a/tests/BD_Shape/affineimage2.cc b/tests/BD_Shape/affineimage2.cc
new file mode 100644
index 0000000..4099504
--- /dev/null
+++ b/tests/BD_Shape/affineimage2.cc
@@ -0,0 +1,351 @@
+/* Test BD_Shape::affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(z >= 3);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, -x) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(z >= 3);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, -z) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, -y + 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, -2*y + 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, -2*y + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= -1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, 2*x + y + 1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= -1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_image(x, -2*x + y + 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= -1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "9.54e-8", "6.75e-8", "4.77e-8");
+
+ print_constraints(bd, "*** bd.affine_image(x, 2*x - 3*y + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= -1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "2.15e-7", "1.36e-7", "9.54e-8");
+
+ print_constraints(bd, "*** bd.affine_image(x, -2*x - 3*y + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(x >= 0);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(y >= -1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "1.91e-7", "1.17e-7", "9.54e-8");
+
+ print_constraints(bd, "*** bd.affine_image(x, 2*x - 3*y + 1, -5) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(y >= 0);
+ bd.add_constraint(y <= 2);
+ bd.add_constraint(z <= 3);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "1.12e-6", "6.56e-7", "4.77e-7");
+
+ print_constraints(bd, "*** bd.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..6eb17b9
--- /dev/null
+++ b/tests/BD_Shape/affinepreimage1.cc
@@ -0,0 +1,181 @@
+/* Test BD_Shape::affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x - y <= 3);
+ bd1.add_constraint(y <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.affine_preimage(x, y);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(y <= 2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.affine_preimage(x, y) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B >= 0);
+ bd.add_constraint(A - B - 3 >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.affine_preimage(A, B-1);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 0);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.affine_preimage(A, B-1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 2);
+ bd.add_constraint(B >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.affine_preimage(A, 2*A + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 2);
+ bd.add_constraint(B >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.affine_preimage(B, Linear_Expression(3));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(A >= 2);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.affine_preimage(B, 3) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the function
+ // BD_Shape::affine_preimage(v, expr, d): it is illegal
+ // to apply to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ bd.affine_preimage(x, x + 1, d);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the function
+ // BD_Shape::affine_preimage(v, expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greather than the space dimension of the BDS.
+ bd.affine_preimage(y, z);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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/BD_Shape/affinepreimage2.cc b/tests/BD_Shape/affinepreimage2.cc
new file mode 100644
index 0000000..d37c10a
--- /dev/null
+++ b/tests/BD_Shape/affinepreimage2.cc
@@ -0,0 +1,253 @@
+/* Test BD_Shape::affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A <= -1);
+ bd.add_constraint(B <= 0);
+ bd.add_constraint(C >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_preimage(A, 4*B + 6*C + 2, -2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A <= -1);
+ bd.add_constraint(B <= 0);
+ bd.add_constraint(C >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_preimage(A, 2*A + 3*C + 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A <= -1);
+ bd.add_constraint(B <= 0);
+ bd.add_constraint(C >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_preimage(A, -3*A + C - 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A <= -1);
+ bd.add_constraint(B <= 0);
+ bd.add_constraint(C >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_preimage(A, 3*A + C - 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A <= -1);
+ bd.add_constraint(B <= 0);
+ bd.add_constraint(C >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_preimage(A, -3*A + C - 1, -2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bd(4);
+ bd.add_constraint(A == 2);
+ bd.add_constraint(B == 0);
+ bd.add_constraint(C >= -3);
+ bd.add_constraint(D <= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "7.63e-7", "3.82e-7", "1.91e-7");
+
+ print_constraints(bd, "*** bd.affine_preimage"
+ "(D, 4*A - B + 2*C + 5*D - 1, 3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A <= -1);
+ bd.add_constraint(B <= 0);
+ bd.add_constraint(C >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_preimage(B, -B) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A <= -1);
+ bd.add_constraint(B <= 0);
+ bd.add_constraint(C >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ BD_Shape<mpq_class> known_result(bd);
+
+ bd.affine_preimage(B, -B, -1);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.affine_preimage(B, -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);
+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..78db9a0
--- /dev/null
+++ b/tests/BD_Shape/ascii_dump_load1.cc
@@ -0,0 +1,246 @@
+/* Test BD_Shape::ascii_dump() and BD_Shape::ascii_load().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bd.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 bd2;
+ bool ok = !bd2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test02() {
+
+ nout << "test02()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B >= 1);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bd.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 bd2;
+ bool ok = !bd2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test03() {
+
+ nout << "test03()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B >= 2);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bd.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 bd2;
+ bool ok = !bd2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test04() {
+
+ nout << "test04()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B >= 3);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bd.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 bd2;
+ bool ok = !bd2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test05() {
+
+ nout << "test05()" << endl;
+
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B >= 3);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bd.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 bd2;
+ bool ok = !bd2.ascii_load(f);
+ close(f);
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A - B >= 2);
+ bd1.add_constraint(B >= 0);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ bd1.ascii_dump(f);
+ close(f);
+
+ open(f, my_file, ios_base::in);
+ TBD_Shape bd2;
+ bd2.ascii_load(f);
+ close(f);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool ok = (bd1 == bd2) ;
+
+ 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/bdsdifference1.cc b/tests/BD_Shape/bdsdifference1.cc
new file mode 100644
index 0000000..8b3f64f
--- /dev/null
+++ b/tests/BD_Shape/bdsdifference1.cc
@@ -0,0 +1,278 @@
+/* Test BD_Shape::bds_difference_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(A <= -2);
+ bd1.add_constraint(B == 0);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A >= 0);
+ bd2.add_constraint(A <= 2);
+ bd2.add_constraint(B >= 0);
+ bd2.add_constraint(B <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** ph2 ***");
+
+ bd1.bds_difference_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.bds_difference_assign(ph2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bd1;
+ TBD_Shape bd2;
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.bds_difference_assign(bd2);
+
+ Constraint_System cs;
+ cs.insert(Linear_Expression(-4) >= 0);
+ BD_Shape<mpq_class> known_result(cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 2);
+ bd1.add_constraint(x >= 0);
+ bd1.add_constraint(y <= 5);
+ bd1.add_constraint(y >= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(x >= 1);
+ bd2.add_constraint(y <= 4);
+ bd2.add_constraint(y >= 1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.bds_difference_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 8);
+ bd1.add_constraint(x >= 0);
+ bd1.add_constraint(y <= 7);
+ bd1.add_constraint(y >= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(x >= 1);
+ bd2.add_constraint(y <= 0);
+ bd2.add_constraint(y >= 1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.bds_difference_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 8);
+ bd1.add_constraint(x >= 0);
+ bd1.add_constraint(y <= 7);
+ bd1.add_constraint(y >= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x <= 9);
+ bd2.add_constraint(x >= 0);
+ bd2.add_constraint(y <= 8);
+ bd2.add_constraint(y >= 1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.bds_difference_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 8);
+ bd1.add_constraint(y <= 7);
+ bd1.add_constraint(y >= 1);
+ bd1.add_constraint(z <= 2);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(x == 8);
+ bd2.add_constraint(y <= 2);
+ bd2.add_constraint(y >= 1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.bds_difference_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(B <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A >= 2);
+ bd2.add_constraint(A <= 4);
+ bd2.add_constraint(B >= 0);
+ bd2.add_constraint(B <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ 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);
+
+ bd1.bds_difference_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.bds_difference_assign(bd2) ***");
+ print_constraints(known_result, "*** known_result ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ TBD_Shape bd1(3);
+ TBD_Shape bd2(5);
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::bds_difference_assign(bd2): it is impossible to apply
+ // this function to two polyhedra of different dimensions.
+ bd1.bds_difference_assign(bd2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/BD_Shape/bdshull1.cc b/tests/BD_Shape/bdshull1.cc
new file mode 100644
index 0000000..5163992
--- /dev/null
+++ b/tests/BD_Shape/bdshull1.cc
@@ -0,0 +1,220 @@
+/* Test BD_Shape::bds_hull_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBD_Shape bd1(5);
+ bd1.add_constraint(x1 <= 5);
+ bd1.add_constraint(x2 <= -1);
+ bd1.add_constraint(x1 -x2 <= 10);
+
+ TBD_Shape bd2(5);
+ bd2.add_constraint(x1 <= 2);
+ bd2.add_constraint(x4 <= 7);
+ bd2.add_constraint(x1 - x2 <= 20);
+ bd2.add_constraint(x4 - x3 <= 3);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.bds_hull_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(5);
+ known_result.add_constraint(x1 <= 5);
+ known_result.add_constraint(x1 - x2 <= 20);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 4);
+ bd1.add_constraint(-x <= -1);
+ bd1.add_constraint(y <= 3);
+ bd1.add_constraint(-y <= -1);
+ bd1.add_constraint(x - y <= 1);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(y - x <= -1);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(-y <= 5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.bds_hull_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 4);
+ bd1.add_constraint(-x <= -1);
+ bd1.add_constraint(y <= 3);
+ bd1.add_constraint(-y <= -1);
+ bd1.add_constraint(x - y <= 1);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(y - x <= -1);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(x >= 5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.bds_hull_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.bds_hull_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(A >= 1);
+ bd1.add_constraint(B <= 3);
+ bd1.add_constraint(-B <= -1);
+ bd1.add_constraint(A - B <= 1);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(B - A <= -1);
+ bd2.add_constraint(A <= 3);
+ bd2.add_constraint(-B <= 5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.bds_hull_assign_and_minimize(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.bds_hull_assign_and_minimize(bd2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bd1(12);
+ TBD_Shape bd2(5);
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::bds_hull_assign(bd2): it is impossible to apply
+ // this function to two polyhedra of different dimensions.
+ bd1.bds_hull_assign(bd2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x >= y);
+
+ TBD_Shape bd2(3);
+
+ try {
+ // This is an invalid use of function
+ // BD_Shape::bds_hull_assign_and_minimize(bd2): it is illegal
+ // to apply this function to two polyhedra of different dimensions.
+ bd1.bds_hull_assign_and_minimize(bd2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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/BD_Shape/bgp99extrapolation1.cc b/tests/BD_Shape/bgp99extrapolation1.cc
new file mode 100644
index 0000000..0cdcd94
--- /dev/null
+++ b/tests/BD_Shape/bgp99extrapolation1.cc
@@ -0,0 +1,93 @@
+/* Test Polyhedra_Powerset<PH>::BGP99_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ typedef Polyhedra_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..2619918
--- /dev/null
+++ b/tests/BD_Shape/bhmz05widening1.cc
@@ -0,0 +1,343 @@
+/* Test BD_Shape::BHMZ05_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 1);
+ bd1.add_constraint(x - y <= 2);
+ bd1.add_constraint(y - x <= 7);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x - y <= 2);
+ bd2.add_constraint(-x <= 3);
+ bd2.add_constraint(x <= 0);
+ bd2.add_constraint(y - x <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.BHMZ05_widening_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bd1;
+ TBD_Shape bd2(0, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.BHMZ05_widening_assign(bd2);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** After bd1.BHMZ05_widening_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bd1(5);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(C >= 1);
+ bd1.add_constraint(D >= 0);
+ bd1.add_constraint(E >= 0);
+ bd1.add_constraint(C - D <= 76);
+ bd1.add_constraint(C - E <= 76);
+ bd1.add_constraint(E - D == 0);
+
+ TBD_Shape bd2(5);
+ bd2.add_constraint(A >= 0);
+ bd2.add_constraint(B >= 0);
+ bd2.add_constraint(C >= 1);
+ bd2.add_constraint(D >= 0);
+ bd2.add_constraint(E >= 0);
+ bd2.add_constraint(C - D <= 75);
+ bd2.add_constraint(C - E <= 75);
+ bd2.add_constraint(E - D == 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.BHMZ05_widening_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A - B <= 1);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(A - B <= 1);
+ bd2.add_constraint(A - C <= 1);
+ bd2.add_constraint(C - B <= 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.BHMZ05_widening_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(3);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A - B <= 1);
+ bd1.add_constraint(A - B >= 2);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(A - B <= 1);
+ bd2.add_constraint(A - B >= 2);
+ bd2.add_constraint(A - C <= 1);
+ bd2.add_constraint(C - B <= 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.BHMZ05_widening_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+ return ok;
+}
+
+TBD_Shape
+aux_test06(int i, Variable a, Variable b, Variable c) {
+ TBD_Shape bd(3);
+ if (i == 0) {
+ bd.add_constraint(0 <= a-b);
+ bd.add_constraint( a-b <= 0);
+ bd.add_constraint(-1 <= b-c);
+ bd.add_constraint( b-c <= 1);
+ }
+ else {
+ bd.add_constraint(-i <= a-b);
+ bd.add_constraint( a-b <= i);
+ bd.add_constraint(-1 <= b-c);
+ bd.add_constraint( b-c <= 1);
+ bd.add_constraint(-i <= a-c);
+ bd.add_constraint( a-c <= i);
+ }
+
+ using namespace IO_Operators;
+ nout << "*** n_" << i << " ***" << endl
+ << bd << endl;
+
+ // Force closure.
+ (void) (bd == bd);
+ return bd;
+}
+
+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.bds_hull_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 bd1(3);
+ bd1.add_constraint(A - B <= 1);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(A - B <= 1);
+ bd2.add_constraint(A - B >= 2);
+ bd2.add_constraint(A - C <= 1);
+ bd2.add_constraint(C - B <= 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.BHMZ05_widening_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.BHMZ05_widening_assign(bd2) ***");
+
+ 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 bd1(cs1);
+
+ Constraint_System cs2;
+ cs2.insert(x <= 1);
+ cs2.insert(y >= 0);
+ cs2.insert(y - x <= 0);
+
+ TBD_Shape bd2(cs2);
+
+ print_constraints(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+
+ BD_Shape<mpq_class> known_result(bd2);
+
+ bd2.BHMZ05_widening_assign(bd1);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2,
+ "*** bd2.BHMZ05_widening_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ TBD_Shape bd1(5);
+ TBD_Shape bd2(10);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::BHMZ05_widening_assign(bd1): it is illegal to apply
+ // this function to two polyhedra that are not dimensional
+ // compatible.
+ bd2.BHMZ05_widening_assign(bd1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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
diff --git a/tests/BD_Shape/bhz03widening1.cc b/tests/BD_Shape/bhz03widening1.cc
new file mode 100644
index 0000000..b7dcfe0
--- /dev/null
+++ b/tests/BD_Shape/bhz03widening1.cc
@@ -0,0 +1,76 @@
+/* Test Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ typedef Polyhedra_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/cc76extrapolation1.cc b/tests/BD_Shape/cc76extrapolation1.cc
new file mode 100644
index 0000000..9246220
--- /dev/null
+++ b/tests/BD_Shape/cc76extrapolation1.cc
@@ -0,0 +1,488 @@
+/* Test BD_Shape::CC76_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 1);
+ bd1.add_constraint(x - y <= 2);
+ bd1.add_constraint(y - x <= 7);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(x - y <= 2);
+ bd2.add_constraint(-x <= 3);
+ bd2.add_constraint(x <= 0);
+ bd2.add_constraint(y - x <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.CC76_extrapolation_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(x <= 1);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bd1(4);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(B <= 25);
+ bd1.add_constraint(C >= 0);
+ bd1.add_constraint(C <= 29);
+ bd1.add_constraint(D >= 0);
+ bd1.add_constraint(D <= 27);
+ bd1.add_constraint(B - A <= 25);
+ bd1.add_constraint(C - A <= 29);
+ bd1.add_constraint(D - A <= 27);
+ bd1.add_constraint(B - C <= 2);
+ bd1.add_constraint(C - B <= 6);
+ bd1.add_constraint(B - D <= 2);
+ bd1.add_constraint(D - B <= 4);
+ bd1.add_constraint(C - D <= 4);
+ bd1.add_constraint(D - C <= 4);
+
+ TBD_Shape bd2(4);
+ bd2.add_constraint(A >= 0);
+ bd2.add_constraint(B >= 0);
+ bd2.add_constraint(B <= 26);
+ bd2.add_constraint(C >= 3);
+ bd2.add_constraint(C <= 29);
+ bd2.add_constraint(D >= 2);
+ bd2.add_constraint(D <= 28);
+ bd2.add_constraint(B - A <= 26);
+ bd2.add_constraint(C - A <= 29);
+ bd2.add_constraint(D - A <= 28);
+ bd2.add_constraint(B - C <= 0);
+ bd2.add_constraint(C - B <= 6);
+ bd2.add_constraint(B - D == 2);
+ bd2.add_constraint(C - D <= 4);
+ bd2.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(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.bds_hull_assign(bd2);
+
+ bd1.limited_CC76_extrapolation_assign(bd2, 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bd1(4);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(B <= 39);
+ bd1.add_constraint(C >= 0);
+ bd1.add_constraint(C <= 40);
+ bd1.add_constraint(D >= 0);
+ bd1.add_constraint(D <= 40);
+ bd1.add_constraint(B - A <= 39);
+ bd1.add_constraint(C - A <= 40);
+ bd1.add_constraint(D - A <= 40);
+ bd1.add_constraint(B - C <= 0);
+ bd1.add_constraint(C - B <= 1);
+ bd1.add_constraint(B - D <= 0);
+ bd1.add_constraint(D - B <= 2);
+ bd1.add_constraint(C - D <= 0);
+ bd1.add_constraint(D - C <= 1);
+
+ TBD_Shape bd2(4);
+ bd2.add_constraint(A >= 0);
+ bd2.add_constraint(B >= 0);
+ bd2.add_constraint(B <= 38);
+ bd2.add_constraint(C >= 0);
+ bd2.add_constraint(C <= 39);
+ bd2.add_constraint(D >= 0);
+ bd2.add_constraint(D <= 40);
+ bd2.add_constraint(B - A <= 38);
+ bd2.add_constraint(C - A <= 39);
+ bd2.add_constraint(D - A <= 40);
+ bd2.add_constraint(B - C <= 0);
+ bd2.add_constraint(C - B <= 1);
+ bd2.add_constraint(B - D <= 0);
+ bd2.add_constraint(D - B <= 2);
+ bd2.add_constraint(C - D <= 0);
+ bd2.add_constraint(D - C <= 1);
+
+ // Force the closure of `bd1'.
+ bd1 == bd2;
+
+ 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(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.CC76_extrapolation_assign(bd2);
+
+ print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ // Force the closure of `bd1'.
+ bd1 == bd2;
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_widening) ;
+
+ print_constraints(bd1, "*** bd1.closure_assign() ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 0);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(B <= 2);
+ bd1.add_constraint(B - A <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A <= 0);
+ bd2.add_constraint(B >= 0);
+ bd2.add_constraint(B <= 1);
+ bd2.add_constraint(B - A <= 1);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.CC76_extrapolation_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+TBD_Shape
+aux_test05(int i, Variable a, Variable b, Variable c) {
+ TBD_Shape bd(3);
+ if (i == 0) {
+ bd.add_constraint(0 <= a-b);
+ bd.add_constraint( a-b <= 0);
+ bd.add_constraint(-1 <= b-c);
+ bd.add_constraint( b-c <= 1);
+ }
+ else {
+ bd.add_constraint(-i <= a-b);
+ bd.add_constraint( a-b <= i);
+ bd.add_constraint(-1 <= b-c);
+ bd.add_constraint( b-c <= 1);
+ bd.add_constraint(-i <= a-c);
+ bd.add_constraint( a-c <= i);
+ }
+
+ using namespace IO_Operators;
+ nout << "*** n_" << i << " ***" << endl
+ << bd << endl;
+
+ // Force closure.
+ (void) (bd == bd);
+ return bd;
+}
+
+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::base_type* no_stop_points = 0;
+ m_i_next.CC76_extrapolation_assign(m_i, no_stop_points, no_stop_points);
+ m_i_next.bds_hull_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 bd1(0);
+
+ TBD_Shape bd2(0, EMPTY);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.CC76_extrapolation_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ TBD_Shape bd1(2, EMPTY);
+ TBD_Shape bd2(2, EMPTY);
+ BD_Shape<mpq_class> known_result(bd2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.CC76_extrapolation_assign(bd1);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+ print_constraints(bd2,
+ "*** bd2.CC76_extrapolation_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A - B >= 2);
+ bd1.add_constraint(B - C >= -1);
+ bd1.add_constraint(C - A >= -3);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(A - B >= 2);
+ bd2.add_constraint(B - C >= 1);
+ bd2.add_constraint(C - A >= 3);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.CC76_extrapolation_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A <= 1);
+ bd2.add_constraint(B == -1);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.CC76_extrapolation_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(C <= 4);
+ bd1.add_constraint(B >= 2);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(C == 3);
+ bd2.add_constraint(A - C >= 0);
+ bd2.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(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.CC76_extrapolation_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ TBD_Shape bd1(1);
+ TBD_Shape bd2(2);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::CC76_extrapolation_assign(bd): it is
+ // illegal to apply this function to two polyhedra that are not
+ // dimension-compatible.
+ bd2.CC76_extrapolation_assign(bd1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test12() {
+ TBD_Shape bd1(5);
+ TBD_Shape bd2(10);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::CC76_widening_assign(bd2): it is illegal to apply
+ // this function to two polyhedra that are not dimensional
+ // compatible.
+ bd2.CC76_extrapolation_assign(bd1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/BD_Shape/cc76narrowing1.cc b/tests/BD_Shape/cc76narrowing1.cc
new file mode 100644
index 0000000..46f4d68
--- /dev/null
+++ b/tests/BD_Shape/cc76narrowing1.cc
@@ -0,0 +1,216 @@
+/* Test BD_Shape::CC76_narrowing_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 1);
+ bd1.add_constraint(y - x <= 7);
+ bd1.add_constraint(x - y <= 6);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(-x <= 3);
+ bd2.add_constraint(y - x <= 2);
+ bd2.add_constraint(x - y <= 5);
+ bd2.add_constraint(x <= 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.CC76_narrowing_assign(bd1);
+
+ 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 = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(4);
+ bd1.add_constraint(z <= 1);
+
+ TBD_Shape bd2(4);
+ bd2.add_constraint(-y <= 3);
+ bd2.add_constraint(-x <= 2);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(y - x <= 4);
+ bd2.add_constraint(z <= 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.CC76_narrowing_assign(bd1);
+
+ 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 = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(3);
+ TBD_Shape bd2(3);
+
+ bd1.add_constraint(z <= 1);
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bd2.add_constraint(-y <= 3);
+ bd2.add_constraint(x >= 4);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(y - x <= 4);
+ bd2.add_constraint(z <= 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.CC76_narrowing_assign(bd1);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(z <= 1);
+ bd1.add_constraint(z >= 3);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(-y <= 3);
+ bd2.add_constraint(x >= 4);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(y - x <= 4);
+ bd2.add_constraint(z <= 0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.CC76_narrowing_assign(bd1);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bd1;
+ TBD_Shape bd2(0, EMPTY);
+ BD_Shape<mpq_class> known_result(bd2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.CC76_narrowing_assign(bd1);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2, "*** bd2.CC76_narrowing_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable y(1);
+
+ TBD_Shape bd1(1);
+ TBD_Shape bd2(2);
+
+ Constraint_System cs;
+ cs.insert(y >= 6);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::CC76_narrowing_assign(bd2, cs): it is
+ // illegal to apply this function to two polyhedra that are not
+ // dimension-compatible.
+ bd2.CC76_narrowing_assign(bd1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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/BD_Shape/closure1.cc b/tests/BD_Shape/closure1.cc
new file mode 100644
index 0000000..4deacea
--- /dev/null
+++ b/tests/BD_Shape/closure1.cc
@@ -0,0 +1,379 @@
+/* Test shortest path closure.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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>& bd, const Edge* edges, unsigned n) {
+ for (unsigned i = 0; i < n; ++i) {
+ const mpq_class& q = perturbate(edges[i].distance);
+ Coefficient a;
+ assign_r(a, q.get_den(), ROUND_NOT_NEEDED);
+ Coefficient b;
+ assign_r(b, q.get_num(), ROUND_NOT_NEEDED);
+
+ nout << "a = " << a << "; b = " << b << endl;
+
+ bd.add_constraint(a*Variable(edges[i].from) - a*Variable(edges[i].to)
+ <= b);
+ }
+}
+
+} // namespace
+
+#define DISTANCE(To, Temp) \
+ do { \
+ Checked_Number<To, Extended_Number_Policy> distance; \
+ rectilinear_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+ nout << "Rectilinear distance<" #To ", " #Temp "> = " << distance \
+ << endl; \
+ euclidean_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+ nout << "Euclidean distance<" #To ", " #Temp "> = " << distance \
+ << endl; \
+ l_infinity_distance_assign<Temp>(distance, qbd1, qbd2, ROUND_UP); \
+ nout << "L-infinity distance<" #To ", " #Temp "> = " << distance \
+ << endl; \
+ } while (0)
+
+bool test01() {
+ BD_Shape<mpq_class> qbd1(126);
+ add_edges(qbd1, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+ TBD_Shape tbd(126);
+ add_edges(tbd, hawaii, sizeof(hawaii)/sizeof(Edge));
+
+ BD_Shape<mpq_class> qbd2(tbd);
+ if (!qbd2.contains(qbd1))
+ return false;
+
+ // FIXME!!!
+#if 1
+ DISTANCE(double, float);
+ DISTANCE(double, mpq_class);
+ DISTANCE(int, double);
+#endif
+ return true;
+}
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/concatenate1.cc b/tests/BD_Shape/concatenate1.cc
new file mode 100644
index 0000000..3ddda80
--- /dev/null
+++ b/tests/BD_Shape/concatenate1.cc
@@ -0,0 +1,203 @@
+/* Test BD_Shape::concatenate_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 bd1(6);
+ bd1.add_constraint(x2 - x3 <= 0);
+ bd1.add_constraint(x3 <= 2);
+ bd1.add_constraint(x6 - x5 <= 2);
+ bd1.add_constraint(x5 <= 3);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(x2 - x3 <= 2);
+ bd2.add_constraint(x3 <= 7);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.concatenate_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 3);
+ bd1.add_constraint(x - y <= 4);
+
+ TBD_Shape bd2(0, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.concatenate_assign(bd1);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2, "*** bd2.concatenate_assign(bd1) ***");
+
+ 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 bd1(2);
+ bd1.add_constraints(cs);
+
+ TBD_Shape bd2(0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.concatenate_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+ Variable E(4);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint_and_minimize(C >= 0);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A >= 0);
+ bd2.add_constraint(A <= 1);
+ bd2.add_constraint(B >= 0);
+ bd2.add_constraint(B <= 2);
+ bd2.add_constraint(A - B <= 0);
+ bd2.add_constraint_and_minimize(B - A <= 1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.concatenate_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 3);
+ bd1.add_constraint(x - y <= 4);
+
+ TBD_Shape bd2(0, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.concatenate_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.concatenate_assign(bd2) ***");
+
+ 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/constraints1.cc b/tests/BD_Shape/constraints1.cc
new file mode 100644
index 0000000..6e3569c
--- /dev/null
+++ b/tests/BD_Shape/constraints1.cc
@@ -0,0 +1,124 @@
+/* Test BD_Shape::constraints().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape bd1(0, EMPTY);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ Constraint_System cs = bd1.constraints();
+ TBD_Shape bd2(cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bd1(0, UNIVERSE);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ Constraint_System cs = bd1.constraints();
+ TBD_Shape bd2(cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(B - C >= 1);
+ bd1.add_constraint(C - A <= 9);
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.contains(bd1);
+
+ Constraint_System cs = bd1.constraints();
+ TBD_Shape bd2(cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A >= 0);
+ bd1.add_constraint(B >= 0);
+ bd1.add_constraint(B - C == 1);
+ bd1.add_constraint(C - A <= 9);
+
+ Constraint_System cs = bd1.constraints();
+ TBD_Shape bd2(cs);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/BD_Shape/contains1.cc b/tests/BD_Shape/contains1.cc
new file mode 100644
index 0000000..6d4afa6
--- /dev/null
+++ b/tests/BD_Shape/contains1.cc
@@ -0,0 +1,124 @@
+/* Test BD_Shape::contains().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x - y <= 1);
+
+ // The BD_Shape is empty, because it has got a negative cycle.
+ TBD_Shape bd2(3);
+ bd2.add_constraint(x - y <= 2);
+ bd2.add_constraint(y - z <= 2);
+ bd2.add_constraint(z - x <= -5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool ok = bd1.contains(bd2);
+
+ nout << "*** bd1.contains(bd2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bd1;
+ TBD_Shape bd2(0, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool ok = bd1.contains(bd2);
+
+ nout << "*** bd1.contains(bd2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test03() {
+ TBD_Shape bd1(0, EMPTY);
+ TBD_Shape bd2(0, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool ok = bd1.contains(bd2);
+
+ nout << "*** bd1.contains(bd2) ***"
+ << endl
+ << (ok ? "true" : "false")
+ << endl;
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x - y >= 0);
+
+ TBD_Shape bd2(2);
+ bd2.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.
+ bd1.contains(bd2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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/BD_Shape/empty1.cc b/tests/BD_Shape/empty1.cc
new file mode 100644
index 0000000..37e7806
--- /dev/null
+++ b/tests/BD_Shape/empty1.cc
@@ -0,0 +1,206 @@
+/* Different ways of creating an empty BD_Shape.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(4);
+ TBD_Shape bd2(4);
+
+ bd1.add_constraint(-x <= 4);
+ bd1.add_constraint(y - x <= 0);
+ bd1.add_constraint(x - y <= -5);
+
+ bool empty = bd1.is_empty();
+
+ nout << "*** bd1.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false ") << endl;
+
+ bd2.add_constraint(-x <= 4);
+ bd2.add_constraint(y - x <= 0);
+ bd2.add_constraint(x - y <= 5);
+ bd2.add_constraint(z - x <= 1);
+
+ bool empty1 = bd2.is_empty();
+
+ nout << "*** bd2.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ return !empty1 && empty;
+
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(4);
+ TBD_Shape bd2(4);
+
+ bd1.add_constraint(-x <= 2);
+ bd1.add_constraint(y - x <= -9);
+ bd1.add_constraint(x - y <= -7);
+
+ bool empty = bd1.is_empty();
+
+ print_constraints(bd1, "*** bd1 ***");
+ nout << "*** bd1.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ bd2.add_constraint(-x <= 7);
+ bd2.add_constraint(y - x <= 1);
+ bd2.add_constraint(-y <= 2);
+ bd2.add_constraint(z - x <= 1);
+
+ bool empty1 = bd2.is_empty();
+
+ print_constraints(bd2, "*** bd2 ***");
+ nout << "*** bd2.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 bd1(6);
+ TBD_Shape bd2(6);
+
+ bd1.add_constraint(x1 <= 3);
+ bd1.add_constraint(x4 <= 3);
+ bd1.add_constraint(x2 - x1 <= 0);
+ bd1.add_constraint(x3 - x1 <= -2);
+ bd1.add_constraint(x5 - x1 <= 2);
+ bd1.add_constraint(-x2 <= 0);
+ bd1.add_constraint(x3 - x2 <= 5);
+ bd1.add_constraint(x4 - x3 <= -6);
+ bd1.add_constraint(x1 - x4 <= 5);
+ bd1.add_constraint(x5 - x4 <= 2);
+ bd1.add_constraint(-x5 <= -5);
+ bd1.add_constraint(x3 - x5 <= 7);
+
+ bool empty = bd1.is_empty();
+
+ nout << "*** bd1.is_empty() ***" << endl;
+ nout << (empty ? "true" : "false") << endl;
+
+ bd2.add_constraint(x1 <= 3);
+ bd2.add_constraint(x4 <= 3);
+ bd2.add_constraint(x2 - x1 <= 0);
+ bd2.add_constraint(x3 - x1 <= 2);
+ bd2.add_constraint(x5 - x1 <= 2);
+ bd2.add_constraint(-x2 <= 0);
+ bd2.add_constraint(x3 - x2 <= 5);
+ bd2.add_constraint(x4 - x3 <= 6);
+ bd2.add_constraint(x1 - x4 <= 5);
+ bd2.add_constraint(x5 - x4 <= 2);
+ bd2.add_constraint(-x5 <= 5);
+ bd2.add_constraint(x3 - x5 <= 7);
+
+ bool empty1 = bd2.is_empty();
+
+ nout << "*** bd2.is_empty() ***" << endl;
+ nout << (empty1 ? "true" : "false") << endl;
+
+ return !empty1 && empty;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+
+ bd.add_constraint(A == 0);
+ bd.add_constraint(C >= 0);
+ bd.add_constraint(B - C >= 1);
+
+ bool empty = bd.is_empty();
+
+ print_constraints(bd, "*** bd ***");
+ nout << "*** bd.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 bd(5);
+
+ Coefficient a;
+ if (std::numeric_limits<Coefficient>::is_bounded)
+ a = -(std::numeric_limits<Coefficient>::min()/2) + 1;
+ else
+ a = 1300000000;
+
+ bd.add_constraint(x1 - x2 <= -a);
+ bd.add_constraint(x2 - x3 <= -a);
+ bd.add_constraint(x3 - x4 <= a);
+ bd.add_constraint(x4 - x5 <= a);
+ bd.add_constraint(x5 - x1 <= a);
+
+ print_constraints(bd, "*** bd ***");
+
+ bool empty = bd.is_empty();
+
+ nout << "*** bd.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..19d1fb7
--- /dev/null
+++ b/tests/BD_Shape/equality1.cc
@@ -0,0 +1,131 @@
+/* Test BD_Shape::operator==().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(3);
+ TBD_Shape bd2(2);
+
+ bd1.add_constraint(x <= 3);
+ bd1.add_constraint(x - y <= 4);
+
+ bd2.add_constraint(x - y <= 5);
+ bd2.add_constraint(-y <= -2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool known_result = false;
+ bool ok = ((bd1 == bd2) == known_result);
+
+ return ok;
+}
+
+bool
+test02() {
+ TBD_Shape bd1(0, EMPTY);
+ TBD_Shape bd2(0);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool known_result = false;
+ bool ok = ((bd1 == bd2) == known_result);
+
+ return ok;
+}
+
+bool
+test03() {
+ TBD_Shape bd1(0);
+ TBD_Shape bd2(0, EMPTY);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool known_result = false;
+ bool ok = ((bd1 == bd2) == known_result);
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A - B <= 1);
+ bd1.add_constraint(B - A <= -2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A - B <= 1);
+ bd2.add_constraint(B - A <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool known_result = false;
+ bool ok = ((bd1 == bd2) == known_result);
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A - B <= 1);
+ bd1.add_constraint(B - A <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A - B <= 1);
+ bd2.add_constraint(B - A <= -2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bool known_result = false;
+ bool ok = ((bd1 == bd2) == 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/fromgensys1.cc b/tests/BD_Shape/fromgensys1.cc
new file mode 100644
index 0000000..1294e03
--- /dev/null
+++ b/tests/BD_Shape/fromgensys1.cc
@@ -0,0 +1,163 @@
+/* Test BD_Shape::BD_Shape(const Generator_System&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Generator_System gs;
+ TBD_Shape bd(gs);
+
+ BD_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd ***");
+
+ 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 bd(gs);
+
+ // It is an error if the exception is not thrown.
+ return false;
+ }
+ catch (std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ return false;
+ }
+ return true;
+}
+
+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 bd(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));
+ TBD_Shape bd(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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd ***");
+
+ 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 bd(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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd ***");
+
+ 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/generalizedaffineimage1.cc b/tests/BD_Shape/generalizedaffineimage1.cc
new file mode 100644
index 0000000..18b4a29
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage1.cc
@@ -0,0 +1,592 @@
+/* Test BD_Shape::generalized_affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+ bd.add_constraint(A <= B);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(B, GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image"
+ "(B, GREATER_THAN_OR_EQUAL, A+2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(B >= 0);
+ bd.add_constraint(A - B >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ BD_Shape<mpq_class> known_result(bd);
+
+ bd.generalized_affine_image(A, EQUAL, A + 2);
+
+ known_result.affine_image(A, A + 2);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image"
+ "(A, EQUAL, A + 2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2, EMPTY);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(A, LESS_THAN_OR_EQUAL, B + 1);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image"
+ "(A, LESS_THAN_OR_EQUAL, B + 1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(3);
+
+ bd.add_constraint(x >= 2);
+ bd.add_constraint(x - y <= 3);
+ bd.add_constraint(y <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(x,GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(x, "
+ "GREATER_THAN_OR_EQUAL, 2*x - 2, 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(x >= 2);
+ bd.add_constraint(x - y <= 3);
+ bd.add_constraint(y <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(y,GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(y, "
+ "GREATER_THAN_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 bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+ bd.add_constraint(A <= B);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(e1, GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(A, "
+ "GREATER_THAN_OR_EQUAL, A) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+ bd.add_constraint(A - B <= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(A, GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(A, "
+ "GREATER_THAN_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+ bd.add_constraint(A - B <= 0);
+ bd.add_constraint(B - C == 2);
+ bd.add_constraint(C - A <= -2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(-B, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(-B, "
+ "LESS_THAN_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 bd(3);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+ bd.add_constraint(C <= 2);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(e1, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(C, "
+ "LESS_THAN_OR_EQUAL, A + 1) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(A, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(A, "
+ "LESS_THAN_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x == 4);
+ bd.add_constraint(y <= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(3*x + 2, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_image(3*x + 2, "
+ "LESS_THAN_OR_EQUAL, 2*x - 3) ***");
+
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x - y <= 7);
+ bd.add_constraint(y >= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ BD_Shape<mpq_class> known_result(bd);
+
+ bd.generalized_affine_image(Linear_Expression(6), EQUAL, 3*x - 4);
+
+ known_result.add_constraint(3*x == 10);
+
+ bool ok = check_result(bd, known_result, "3.98e-7", "2.39e-7", "1.59e-7");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_image(6, EQUAL, 3*x - 4) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B >= 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(2*B + 3*A,
+ LESS_THAN_OR_EQUAL, Linear_Expression(1));
+
+ BD_Shape<mpq_class> known_result(2);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(3*A + 2*B, "
+ "LESS_THAN_OR_EQUAL, 1) ***");
+
+ return ok;
+}
+
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A == 0);
+ bd.add_constraint(B >= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ BD_Shape<mpq_class> known_result(bd);
+
+ bd.generalized_affine_image(-2*A + 5, EQUAL, -4*B);
+
+ known_result.affine_image(A, 4*B + 5, 2);
+
+ bool ok = check_result(bd, known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_image(-2*A + 5, "
+ "EQUAL, -4*B) ***");
+
+ return ok;
+}
+
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(A + 2*B - 5, GREATER_THAN_OR_EQUAL, 3*B);
+
+ BD_Shape<mpq_class> known_result(2);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(A + 2*B - 5, "
+ "GREATER_THAN_OR_EQUAL, 3*B) ***");
+
+ return ok;
+}
+
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(2*B + C + 1, LESS_THAN_OR_EQUAL, A - 3*B + 2*C);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_image(2*B + C + 1, "
+ "LESS_THAN_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(2*B + C + 1,
+ GREATER_THAN_OR_EQUAL, A - 3*B + 2*C);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 1);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(2*B + C + 1, "
+ "GREATER_THAN_OR_EQUAL, A - 3*B + 2*C) ***");
+
+ return ok;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(-2*A - B - 1,
+ GREATER_THAN_OR_EQUAL, 3*A + B + 4*C - 2);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(C <= 3);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(-2*A - B - 1, "
+ "GREATER_THAN_OR_EQUAL, 3*A + B + 4*C - 2) ***");
+
+ return ok;
+}
+
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(-2*C + 3, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(-2*C + 3, "
+ "LESS_THAN_OR_EQUAL, -3*B + 4) ***");
+
+ return ok;
+}
+
+bool
+test20() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C + A <=2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(Linear_Expression(3),
+ GREATER_THAN_OR_EQUAL,
+ Linear_Expression(4));
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_image(3, "
+ "GREATER_THAN_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..a467da6
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffineimage2.cc
@@ -0,0 +1,516 @@
+/* Test BD_Shape::generalized_affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 4);
+ bd.add_constraint(x >= -6);
+ bd.add_constraint(y == 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(y, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(y, "
+ "LESS_THAN_OR_EQUAL, -y + 1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x <= 4);
+ bd.add_constraint(x >= -6);
+ bd.add_constraint(y == 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(x, GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(x, "
+ "GREATER_THAN_OR_EQUAL, -x - 3) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(B <= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(B, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(B, "
+ "LESS_THAN_OR_EQUAL, 3*B + 1, 2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A == 0);
+ bd.add_constraint(B >= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(B, GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(B, "
+ "GREATER_THAN_OR_EQUAL, B - 2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(A - B == 0);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(A, GREATER_THAN_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(bd, known_result, "7.63e-17", "3.82e-17", "1.91e-17");
+
+ print_constraints(bd, "*** bd.generalized_affine_image(A, "
+ "GREATER_THAN_OR_EQUAL, 2*A + 3, 2) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(C, LESS_THAN_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(bd, known_result, "9.54e-8", "9.54e-8", "9.54e-8");
+
+ print_constraints(bd, "*** bd.generalized_affine_image(C, "
+ "LESS_THAN_OR_EQUAL, 2*C + 1, 5) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ BD_Shape<mpq_class> known_result(bd);
+
+ bd.generalized_affine_image(C, EQUAL, 5*C - 3, 4);
+
+ known_result.affine_image(C, 5*C - 3, 4);
+
+ bool ok = check_result(bd, known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(C, "
+ "EQUAL, 5*C - 3, 4) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(B, GREATER_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(B, "
+ "GREATER_THAN_OR_EQUAL, -B - 2, 3) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <= 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_image(B, LESS_THAN_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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.generalized_affine_image(B, "
+ "LESS_THAN_OR_EQUAL, 4*A - 2*C + 3, -3) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A - B == 0);
+ bd.add_constraint(B <= 1);
+ bd.add_constraint(C - A <=2);
+
+ print_constraints(bd, "*** bd ***");
+
+ BD_Shape<mpq_class> known_result(bd);
+
+ bd.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(bd, known_result);
+
+ print_constraints(bd, "*** bd.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 bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.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 bd(2);
+ bd.add_constraint(A >= 0);
+ bd.add_constraint(A <= 4);
+ bd.add_constraint(B <= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.generalized_affine_image(B-3,EQUAL, B+1) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the function
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to use a strict relation symbol.
+ bd.generalized_affine_image(x, LESS_THAN, x + 1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the function
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to use a strict relation symbol.
+ bd.generalized_affine_image(x, GREATER_THAN, x + 1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the function
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to apply to a expression with the denominator
+ // equal to zero.
+ Coefficient d = 0;
+ bd.generalized_affine_image(x, LESS_THAN_OR_EQUAL, x + 1, d);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x >= y);
+
+ try {
+ // This is an incorrect use of the function
+ // BD_Shape::generalized_affine_image(v, r, expr, d): it is illegal
+ // to apply it to an expression whose space dimension is
+ // greather than the BDS's space dimension.
+ bd.generalized_affine_image(y, GREATER_THAN_OR_EQUAL, z);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 0);
+
+ try {
+ // This is an incorrect use of the function
+ // 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.
+
+ bd.generalized_affine_image(A + B, GREATER_THAN_OR_EQUAL, B + C);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of function
+ // 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.
+ bd.generalized_affine_image(B + C, LESS_THAN_OR_EQUAL, A + 1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+ 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..3fb01e8
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage1.cc
@@ -0,0 +1,477 @@
+/* Test BD_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <limits>
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(2*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL,
+ Linear_Expression(-1));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ bool ok = check_result(bd, known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "GREATER_THAN_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(2*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_OR_EQUAL, Linear_Expression(-1));
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(4*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_OR_EQUAL, -B+1) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(4*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_OR_EQUAL, B+1) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(7*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "2.13e-8", "1.25e-8", "8.52e-9");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_OR_EQUAL, 2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(5*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "2.69e-8", "1.72e-8", "1.20e-8");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_OR_EQUAL, -2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "2.89e-7", "1.85e-7", "1.40e-7");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_OR_EQUAL, 3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(B >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "5.27e-7", "3.53e-7", "2.59e-7");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_OR_EQUAL, -3*A-2*B+1) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(2*B >= 7);
+ bd.add_constraint(3*C <= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "5.48e-6", "2.97e-6", "1.77e-6");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_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 bd(3);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(2*B >= 7);
+ bd.add_constraint(3*C <= 7);
+ bd.add_constraint(5*C >= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "4.48e-6", "2.36e-6", "1.36e-6");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_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 bd(3);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(2*B >= 7);
+ bd.add_constraint(3*C <= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "3.68e-7", "2.41e-7", "1.79e-7");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_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 bd(3);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(2*B >= 7);
+ bd.add_constraint(3*C <= 7);
+ bd.add_constraint(5*C >= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, LESS_THAN_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(bd, known_result, "5.13e-6", "2.73e-6", "1.67e-6");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "LESS_THAN_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 bd(3);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(2*B <= 7);
+ bd.add_constraint(3*C <= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, GREATER_THAN_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(bd, known_result, "7.39e-6", "4.07e-6", "2.55e-6");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "GREATER_THAN_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 bd(3);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(2*B <= 7);
+ bd.add_constraint(3*C <= 7);
+ bd.add_constraint(5*C >= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, GREATER_THAN_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(bd, known_result, "1.98e-6", "9.26e-7", "5.25e-7");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "GREATER_THAN_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 bd(3);
+ bd.add_constraint(3*A == 1);
+ bd.add_constraint(2*B >= 7);
+ bd.add_constraint(3*C <= 7);
+ bd.add_constraint(5*C >= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, GREATER_THAN_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(bd, known_result, "4.26e-7", "2.44e-7", "1.79e-7");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "GREATER_THAN_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..f55e894
--- /dev/null
+++ b/tests/BD_Shape/generalizedaffinepreimage2.cc
@@ -0,0 +1,118 @@
+/* Test BD_Shape::generalized_affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(2*A == 1);
+ bd.add_constraint(B >= 5);
+ bd.add_constraint(3*C <= 7);
+ bd.add_constraint(5*C >= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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(bd, known_result, "3.66e-7", "2.28e-7", "1.59e-7");
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(2*A == 1);
+ bd.add_constraint(B <= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, GREATER_THAN_OR_EQUAL,
+ Linear_Expression(-1));
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(2*A == 1);
+
+ bool ok = check_result(bd, known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "GREATER_THAN_OR_EQUAL, -1) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(2*A == 1);
+ bd.add_constraint(B <= 5);
+ bd.add_constraint(3*C <= 8);
+ bd.add_constraint(2*C >= 7);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.generalized_affine_preimage(B, EQUAL, 3*A+2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = check_result(bd, known_result);
+
+ print_constraints(bd,
+ "*** bd.generalized_affine_preimage(B, "
+ "EQUAL, 3*A+2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/BD_Shape/geomcovers1.cc b/tests/BD_Shape/geomcovers1.cc
new file mode 100644
index 0000000..15a1696
--- /dev/null
+++ b/tests/BD_Shape/geomcovers1.cc
@@ -0,0 +1,69 @@
+/* Test Polyhedra_Powerset<BD_Shape>::geometrically_covers().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 bd1(cs1), bd2(cs2), bd3(cs3);
+
+ Polyhedra_Powerset<TBD_Shape> ps12(1, EMPTY);
+ ps12.add_disjunct(bd1);
+ ps12.add_disjunct(bd2);
+
+ Polyhedra_Powerset<TBD_Shape> ps3(1, EMPTY);
+ ps3.add_disjunct(bd3);
+
+ 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..3b36700
--- /dev/null
+++ b/tests/BD_Shape/h79widening1.cc
@@ -0,0 +1,62 @@
+/* Test BD_Shape::H79_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x <= 1);
+ bd1.add_constraint(x - y <= 2);
+ bd1.add_constraint(y - x <= 7);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x - y <= 2);
+ bd2.add_constraint(-x <= 3);
+ bd2.add_constraint(x <= 0);
+ bd2.add_constraint(y - x <= 2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.H79_widening_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x - y <= 2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/intersection1.cc b/tests/BD_Shape/intersection1.cc
new file mode 100644
index 0000000..83b5ea7
--- /dev/null
+++ b/tests/BD_Shape/intersection1.cc
@@ -0,0 +1,324 @@
+/* Test BD_Shape::intersection_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 3);
+ bd1.add_constraint(x - y <= 4);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(-y <= -2);
+ bd2.add_constraint(x - y <= 5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.intersection_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(4);
+ bd1.add_constraint(x - y <= 4);
+ bd1.add_constraint(x <= 3);
+
+ TBD_Shape bd2(4);
+ bd2.add_constraint(x - y <= 5);
+ bd2.add_constraint(-y <= -2);
+ bd2.add_constraint(z - x <= 0);
+ bd2.add_constraint(y - z <= -1);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.intersection_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 4);
+ bd1.add_constraint(-x <= -1);
+ bd1.add_constraint(y <= 3);
+ bd1.add_constraint(-y <= -1);
+ bd1.add_constraint(x - y <= 1);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(y - x <= -1);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(-y <= 5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.intersection_assign(bd2);
+
+ 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 4);
+ bd1.add_constraint(x >= 5);
+ bd1.add_constraint(y <= 3);
+ bd1.add_constraint(y >= 1);
+ bd1.add_constraint(x - y <= 1);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(y - x <= -1);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(y >= -5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.intersection_assign(bd2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(x <= 4);
+ bd1.add_constraint(x >= 5);
+ bd1.add_constraint(y <= 3);
+ bd1.add_constraint(y >= 1);
+ bd1.add_constraint(x - y <= 1);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(y - x <= -1);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(y >= -5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd2.intersection_assign(bd1);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd2) == known_result) ;
+
+ print_constraints(bd2, "*** bd2.intersection_assign(bd1) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ TBD_Shape bd1;
+ TBD_Shape bd2;
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ bd1.intersection_assign(bd2);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(3);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(y - x <= -1);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(y >= -5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ BD_Shape<mpq_class> known_result(bd2);
+
+ bd1.intersection_assign(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(3);
+ TBD_Shape bd2(3);
+ bd2.add_constraint(y - x <= -1);
+ bd2.add_constraint(x <= 3);
+ bd2.add_constraint(y >= -5);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ BD_Shape<mpq_class> known_result(bd2);
+
+ bd1.intersection_assign_and_minimize(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.intersection_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x >= y);
+
+ TBD_Shape bd2(3);
+
+ try {
+ // This is an invalid use of function
+ // BD_Shape::intersection_assign_and_minimize(bd2): it is illegal
+ // to apply this function to two polyhedra of different dimensions.
+ bd1.intersection_assign_and_minimize(bd2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test10() {
+ TBD_Shape bd1(7);
+ TBD_Shape bd2(15);
+
+ try {
+ // This is an invalid use of function
+ // BD_Shape::intersection_assign(bd2): it is illegal
+ // to apply this function to two polyhedra of different dimensions.
+ bd1.intersection_assign(bd2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/BD_Shape/limitedbhmz05extrapolation1.cc b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
new file mode 100644
index 0000000..ba1e521
--- /dev/null
+++ b/tests/BD_Shape/limitedbhmz05extrapolation1.cc
@@ -0,0 +1,526 @@
+/* Test BD_Shape::limited_BHMZ05_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 bd1(cs1);
+ TBD_Shape bd2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 3);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ****");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+
+ print_constraints(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ cs.insert(y >= 0);
+ cs.insert(x <= 5);
+ cs.insert(y <= 5);
+
+ print_constraints(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(bd2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(cs2);
+ BD_Shape<mpq_class> known_result(bd1);
+
+ print_constraints(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ TBD_Shape bd1;
+ TBD_Shape bd2;
+ Constraint_System cs;
+
+ print_constraints(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(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(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x == 0);
+ cs.insert(y >= 0);
+ cs.insert(y <= 5);
+ cs.insert(x - y + z <= 5);
+
+ print_constraints(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(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(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(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(bd1, "*** bd1 ****");
+ print_constraints(bd2, "*** bd2 ****");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_BHMZ05_extrapolation_assign(bd2, 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_BHMZ05_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x - y >= 0);
+ bd1.add_constraint(x >= 0);
+ bd1.add_constraint(x <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x - y >= 0);
+ bd2.add_constraint(x >= 0);
+ bd2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::limited_BHMZ05_extrapolation_assign(bd, cs): it is
+ // illegal to apply this function to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test11() {
+ Variable y(1);
+
+ TBD_Shape bd1(1);
+ TBD_Shape bd2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::limited_BHMZ05_extrapolation_assign(bd2, cs): it is
+ // illegal to apply this function to two polyhedra that are not
+ // dimension-compatible.
+ bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x - y >= 0);
+ bd1.add_constraint(x >= 0);
+ bd1.add_constraint(x <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x - y >= 0);
+ bd2.add_constraint(x >= 0);
+ bd2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(x < 5);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::limited_BHMZ05_extrapolation_assign(bd, cs): it is
+ // illegal to apply this function to a system of constraints that
+ // has a strict-inequality.
+ bd2.limited_BHMZ05_extrapolation_assign(bd1, cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/BD_Shape/limitedcc76extrapolation1.cc b/tests/BD_Shape/limitedcc76extrapolation1.cc
new file mode 100644
index 0000000..a8bcc01
--- /dev/null
+++ b/tests/BD_Shape/limitedcc76extrapolation1.cc
@@ -0,0 +1,537 @@
+/* Test BD_Shape::limited_CC76_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape bd1(0);
+ TBD_Shape bd2(0);
+ Constraint_System cs;
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A == -2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A == -2);
+ bd2.add_constraint(B == 3);
+
+ Constraint_System cs;
+ cs.insert(A <= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 4);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A == -2);
+
+ Constraint_System cs;
+ cs.insert(A <= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd1(3);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(B >= 1);
+
+ TBD_Shape bd2(3);
+ bd2.add_constraint(A <= -2);
+ bd2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A <= 5);
+ cs.insert(A - B + C <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(3);
+ known_result.add_constraint(A <= 5);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(B >= 1);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A <= -2);
+ bd2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A + B <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(B >= 1);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A <= -2);
+ bd2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(B >= 1);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(A >= 5);
+ bd1.add_constraint(B >= 1);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A <= -2);
+ bd2.add_constraint(A >= 3);
+ bd2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(B >= 1);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(A <= -2);
+ bd2.add_constraint(A >= 3);
+ bd2.add_constraint(B >= 4);
+
+ Constraint_System cs;
+ cs.insert(A >= 0);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ TBD_Shape bd1(4);
+ bd1.add_constraint(A <= 4);
+ bd1.add_constraint(B <= 6);
+ bd1.add_constraint(C - D == 5);
+
+ TBD_Shape bd2(4);
+ bd2.add_constraint(A <= 4);
+ bd2.add_constraint(C - D == 5);
+ bd2.add_constraint(B <= 5);
+
+ Constraint_System cs;
+ cs.insert(A == 4);
+ cs.insert(C - D == 5);
+ cs.insert(A - B <= 6);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(4);
+ known_result.add_constraint(A <= 4);
+ known_result.add_constraint(C - D == 5);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, 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 bd1(cs1);
+ TBD_Shape bd2(cs2);
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ****");
+
+ bd1.limited_CC76_extrapolation_assign(bd2, 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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+
+ return ok;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3, EMPTY);
+ TBD_Shape bd2(3, EMPTY);
+
+ Constraint_System cs;
+ cs.insert(x <= 1);
+ cs.insert(y >= 4);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs, "*** cs ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2) ***");
+
+ 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 bd1(cs1);
+ TBD_Shape bd2(2, EMPTY);
+
+ Constraint_System cs2;
+ cs2.insert(x <= 0);
+ cs2.insert(y >= 3);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(cs2, "*** cs2 ***");
+
+ BD_Shape<mpq_class> known_result(bd1);
+
+ bd1.limited_CC76_extrapolation_assign(bd2, cs2);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.limited_CC76_extrapolation_assign(bd2, cs2) ***");
+
+ return ok;
+}
+
+bool
+test13() {
+ Variable y(1);
+
+ TBD_Shape bd1(1);
+ TBD_Shape bd2(2);
+
+ Constraint_System cs;
+ cs.insert(y <= 9);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::limited_CC76_extrapolation_assign(bd2, cs): it is
+ // illegal to apply this function to two polyhedra that are not
+ // dimension-compatible.
+ bd2.limited_CC76_extrapolation_assign(bd1, cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x - y >= 0);
+ bd1.add_constraint(x >= 0);
+ bd1.add_constraint(x <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x - y >= 0);
+ bd2.add_constraint(x >= 0);
+ bd2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(z <= 5);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
+ // illegal to apply this function to a system of constraints that
+ // is not dimension-compatible with the two polyhedra.
+ bd2.limited_CC76_extrapolation_assign(bd1, cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(2);
+ bd1.add_constraint(x - y >= 0);
+ bd1.add_constraint(x >= 0);
+ bd1.add_constraint(x <= 2);
+
+ TBD_Shape bd2(2);
+ bd2.add_constraint(x - y >= 0);
+ bd2.add_constraint(x >= 0);
+ bd2.add_constraint(x <= 5);
+
+ Constraint_System cs;
+ cs.insert(x < 5);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::limited_CC76_extrapolation_assign(bd, cs): it is
+ // illegal to apply this function to a system of constraints that
+ // in which there is a strict inequality.
+ bd2.limited_CC76_extrapolation_assign(bd1, cs);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/BD_Shape/limitedh79extrapolation1.cc b/tests/BD_Shape/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..3128732
--- /dev/null
+++ b/tests/BD_Shape/limitedh79extrapolation1.cc
@@ -0,0 +1,70 @@
+/* Test BD_Shape::limited_H79_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 bd1(cs1);
+
+ print_constraints(bd1, "*** bd1 ****");
+
+ Constraint_System cs2;
+ cs2.insert(x == 0);
+ cs2.insert(y >= 5);
+
+ TBD_Shape bd2(cs2);
+
+ print_constraints(bd2, "*** bd2 ****");
+
+ Constraint_System cs;
+ cs.insert(x >= 20);
+ cs.insert(y >= 3);
+
+ print_constraints(cs, "*** cs ***");
+
+ bd1.limited_H79_extrapolation_assign(bd2, cs);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 3);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.limited_H79_extrapolation_assign(bd2) ****");
+
+ 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..5c14a34
--- /dev/null
+++ b/tests/BD_Shape/mapspacedims1.cc
@@ -0,0 +1,291 @@
+/* Test BD_Shape::map_space_dimensions().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Partial_Function function;
+
+ TBD_Shape bd1(3);
+
+ print_function(function, "*** function ***");
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result;
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test02() {
+ Partial_Function function;
+
+ TBD_Shape bd1(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(0, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test03() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBD_Shape bd1(3, EMPTY);
+
+ print_function(function, "*** function ***");
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(2, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.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 bd1(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.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 bd1(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(1);
+ known_result.add_constraint(x <= 4);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.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 bd1(cs);
+
+ print_function(function, "*** function ***");
+ print_constraints(bd1, "*** bd1 ***");
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.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 bd(2);
+ bd.add_constraint(x <= 1);
+ bd.add_constraint(y <= -1);
+ bd.add_constraint(y - x <= 3);
+
+ print_constraints(bd, "*** bd ***");
+ print_function(function, "*** function ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.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 bd(cs);
+
+ Partial_Function function;
+ function.insert(0, 2);
+ function.insert(1, 1);
+ function.insert(3, 0);
+
+ print_function(function, "*** function ***");
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.map_space_dimensions(function) ***");
+
+ return ok;
+}
+
+bool
+test09() {
+ Partial_Function function;
+ function.insert(0, 1);
+ function.insert(1, 0);
+
+ TBD_Shape bd(0);
+
+ print_constraints(bd, "*** bd ***");
+ print_function(function, "*** function ***");
+
+ bd.map_space_dimensions(function);
+
+ BD_Shape<mpq_class> known_result(0);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result) ;
+
+ print_constraints(bd, "*** bd.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/maxspacedim.cc b/tests/BD_Shape/maxspacedim.cc
new file mode 100644
index 0000000..010b314
--- /dev/null
+++ b/tests/BD_Shape/maxspacedim.cc
@@ -0,0 +1,92 @@
+/* Test BD_Shape::max_space_dimension().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ BD_Shape<mpq_class> bd1(1);
+ BD_Shape<long> bd2(1);
+ BD_Shape<int> bd3(1);
+ BD_Shape<signed char> bd4(1);
+
+ dimension_type max_spacedim1 = bd1.max_space_dimension();
+ dimension_type max_spacedim2 = bd2.max_space_dimension();
+ dimension_type max_spacedim3 = bd3.max_space_dimension();
+ dimension_type max_spacedim4 = bd4.max_space_dimension();
+
+ nout << endl
+ << "The maximum space-dimension of a system of bounded differences "
+ << endl
+ << "of Rational is: "
+ << endl
+ << max_spacedim1
+ << endl;
+
+ nout << endl
+ << "The maximum space-dimension of a system of bounded differences "
+ << endl
+ << "of long: "
+ << endl
+ << max_spacedim2
+ << endl;
+
+ nout << endl
+ << "The maximum space-dimension of a system of bounded differences "
+ << endl
+ << "of int: "
+ << endl
+ << max_spacedim3
+ << endl;
+
+ nout << endl
+ << "The maximum space-dimension of a system of bounded differences "
+ << endl
+ << "of signed char"
+ << endl
+ << max_spacedim4
+ << endl;
+
+ if (max_spacedim1 < max_spacedim2) {
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ }
+
+ if (max_spacedim3 < max_spacedim4) {
+
+ print_constraints(bd3, "*** bd3 ***");
+ print_constraints(bd4, "*** bd4 ***");
+
+ }
+ // FIXME!!!
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/minconstraints1.cc b/tests/BD_Shape/minconstraints1.cc
new file mode 100644
index 0000000..d3afe13
--- /dev/null
+++ b/tests/BD_Shape/minconstraints1.cc
@@ -0,0 +1,70 @@
+/* Test BD_Shape<T>::minimized_constraints().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 1);
+ bd.add_constraint(B >= 0);
+ bd.add_constraint(A - B >= -2);
+ bd.add_constraint(A >= -3);
+ bd.add_constraint(A <= 1);
+
+ print_constraints(bd, "*** bd ***");
+
+ const Constraint_System cs = bd.minimized_constraints();
+
+ using namespace IO_Operators;
+ nout << "*** bd.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_bd(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_bd) ;
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/relations1.cc b/tests/BD_Shape/relations1.cc
new file mode 100644
index 0000000..8dea47f
--- /dev/null
+++ b/tests/BD_Shape/relations1.cc
@@ -0,0 +1,470 @@
+/* Test BD_Shape::relation_with().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ TBD_Shape bd(2, EMPTY);
+
+ Poly_Con_Relation rel = bd.relation_with(A >= 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(y <= -1);
+
+ Constraint c(y >= 0);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(y <= 1);
+
+ Constraint c(y >= 0);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(z >= 1);
+
+ Constraint c(z >= 0);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(x == 1);
+
+ Constraint c(x >= 1);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(x == 1);
+ bd.add_constraint(y <= 0);
+ bd.add_constraint(z >= 2);
+
+ Constraint c(x == 1);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(x >= 3);
+ bd.add_constraint(y <= 0);
+ bd.add_constraint(z >= 2);
+
+ Constraint c(x == 2);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(x <= 3);
+ bd.add_constraint(y <= 0);
+ bd.add_constraint(z >= 2);
+
+ Constraint c(x == 2);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(x <= 3);
+ bd.add_constraint(y <= 0);
+ bd.add_constraint(z >= 2);
+
+ Constraint c(-x >= 2);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(0);
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(0);
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= 1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd;
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) >= 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(x == 1);
+
+ Constraint c(x > 1);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(x == 1);
+ bd.add_constraint(y <= 0);
+ bd.add_constraint(z >= 2);
+
+ Constraint c(x > 1);
+ Poly_Con_Relation rel = bd.relation_with(c);
+
+ print_constraints(bd, "--- bd ---");
+ print_constraint(c, "--- c ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(x == 0);
+ bd.add_constraint(y >= 1);
+
+ Poly_Con_Relation rel = bd.relation_with(-y >= -1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+
+ bd.add_constraint(x - y <= 2);
+ bd.add_constraint(x - z >= -1);
+ bd.add_constraint(y <= 3);
+
+ Poly_Con_Relation rel = bd.relation_with(y > 3);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+
+ bd.add_constraint(x - y <= 2);
+ bd.add_constraint(x - z >= -1);
+ bd.add_constraint(y <= 3);
+
+ Poly_Con_Relation rel = bd.relation_with(-y >= -4);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(1);
+ bd.add_constraint(A <= 0);
+ bd.add_constraint(A >= -2);
+
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) >= -1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2, EMPTY);
+
+ Generator g = point(x);
+ Poly_Gen_Relation rel = bd.relation_with(g);
+
+ print_constraints(bd, "--- bd ---");
+ print_generator(g, "--- g ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd;
+
+ Generator g = point();
+ Poly_Gen_Relation rel = bd.relation_with(g);
+
+ print_constraints(bd, "--- bd ---");
+ print_generator(g, "--- g ---");
+ using namespace IO_Operators;
+ nout << "bd.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..b519c46
--- /dev/null
+++ b/tests/BD_Shape/relations2.cc
@@ -0,0 +1,449 @@
+/* Test BD_Shape::relation_with().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // The zero-dim universe BDS.
+ TBD_Shape bd(0);
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) > 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(0);
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(0) > 1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(0);
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) > 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(1);
+ bd.add_constraint(Linear_Expression(0) >= 1);
+
+ Variable A(0);
+
+ Poly_Con_Relation rel = bd.relation_with(A > 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(cs);
+
+ Poly_Con_Relation rel = bd.relation_with(A - B > 3);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(cs);
+
+ Poly_Con_Relation rel = bd.relation_with(A - B > 3);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(cs);
+
+ Poly_Con_Relation rel = bd.relation_with(A > 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(cs);
+
+ Poly_Con_Relation rel = bd.relation_with(A - B > 1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(cs);
+
+ Poly_Con_Relation rel = bd.relation_with(A > 0);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(cs);
+
+ Poly_Con_Relation rel = bd.relation_with(B - A > 1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(1);
+ bd.add_constraint(A >= 0);
+
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) >= 1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(A == 1);
+ bd.add_constraint(B >= 2);
+
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) > 1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(A == 1);
+ bd.add_constraint(B >= 2);
+ bd.add_constraint(C <= 1);
+
+ Poly_Con_Relation rel = bd.relation_with(Linear_Expression(1) == 1);
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(A - B >= 0);
+ bd.add_constraint(B >= 0);
+
+ Poly_Gen_Relation rel1 = bd.relation_with(point(B));
+ Poly_Gen_Relation rel2 = bd.relation_with(point(-B));
+
+ print_constraints(bd, "*** bd ***");
+ using namespace IO_Operators;
+ nout << "bd.relation_with(point(B)) == " << rel1 << endl;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = bd.relation_with(ray(-A));
+
+ print_constraints(bd, "*** bd ***");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(A >= 0);
+
+ Poly_Gen_Relation rel = bd.relation_with(line(A));
+
+ print_constraints(bd, "*** bd ***");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(A == 0);
+ bd.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = bd.relation_with(closure_point(A));
+
+ print_constraints(bd, "*** bd ***");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(A >= 2);
+ bd.add_constraint(B == 0);
+
+ Poly_Gen_Relation rel = bd.relation_with(ray(A + B));
+
+ print_constraints(bd, "*** bd ***");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(2);
+ bd.add_constraint(A == 0);
+
+ Poly_Gen_Relation rel = bd.relation_with(point(2*A));
+
+ print_constraints(bd, "--- bd ---");
+ using namespace IO_Operators;
+ nout << "bd.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 bd(3);
+ bd.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::relation_with(c):
+ // it is illegal to use a constraint with three
+ // dimensions.
+ Poly_Con_Relation rel = bd.relation_with(A - C - B <= 2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+ 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..0557ddd
--- /dev/null
+++ b/tests/BD_Shape/relations3.cc
@@ -0,0 +1,108 @@
+/* Test BD_Shape::relation_with().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::relation_with(c):
+ // it is illegal to use a constraint that is
+ // dimensional incompatible with the BDS.
+ Poly_Con_Relation rel = bd.relation_with(C - B <= 2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::relation_with(c):
+ // it is illegal to use a constraint that is
+ // not a bounded difference.
+ Poly_Con_Relation rel = bd.relation_with(A - 2*B <= 2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(A >= 1);
+
+ try {
+ // This is an incorrect use of function
+ // BD_Shape::relation_with(c):
+ // it is illegal to use a generator that is
+ // dimensional incompatible with the BDS.
+ Poly_Gen_Relation rel = bd.relation_with(ray(C));
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/BD_Shape/removespacedims1.cc b/tests/BD_Shape/removespacedims1.cc
new file mode 100644
index 0000000..86ea205
--- /dev/null
+++ b/tests/BD_Shape/removespacedims1.cc
@@ -0,0 +1,311 @@
+/* Remove some variables from the space.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 bd1(6);
+ bd1.add_constraint(x2 - x3 <= 0);
+ bd1.add_constraint(x3 <= 2);
+ bd1.add_constraint(x6 - x5 <= 2);
+ bd1.add_constraint(x5 <= 3);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ // 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);
+
+ bd1.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 = (BD_Shape<mpq_class>(bd1) == known_result) ;
+
+ print_constraints(bd1, "*** bd1.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 bd1(8);
+ bd1.add_constraint(x7 - x3 <= 0);
+ bd1.add_constraint(x1 <= 2);
+ bd1.add_constraint(x4 - x8 <= 2);
+ bd1.add_constraint(x5 <= 7);
+ bd1.add_constraint(x2 <= 10);
+ bd1.add_constraint(x6 - x8 <= 4);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ // 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);
+
+ bd1.remove_space_dimensions(to_be_removed);
+
+ BD_Shape<mpq_class> known_result(0);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1,
+ "*** bd1.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 bd1(4);
+ bd1.add_constraint(x1 - x2 <=1);
+ bd1.add_constraint(x2 - x3 <= -2);
+ bd1.add_constraint(x3 - x1 <= 0);
+ bd1.add_constraint(x2 >= 5);
+ bd1.add_constraint(x4 >= 3);
+
+ print_constraints(bd1, "*** bd1 ***");
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(x1);
+ to_be_removed.insert(x3);
+ to_be_removed.insert(x4);
+
+ bd1.remove_space_dimensions(to_be_removed);
+
+ BD_Shape<mpq_class> known_result(1, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd1) == known_result);
+
+ print_constraints(bd1, "*** bd1.remove_space_dimensions({x1,x3,x4}) ***");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x1(0);
+ Variable x2(1);
+
+ TBD_Shape bd(2);
+ bd.add_constraint(x1 <= 2);
+ bd.add_constraint(x2 <= 10);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.remove_higher_space_dimensions(0);
+
+ BD_Shape<mpq_class> known_result(0, UNIVERSE);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.remove_higher_space_dimensions(0) ***");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+ Variable x4(3);
+
+ TBD_Shape bd(4);
+ bd.add_constraint(x1 - x2 <=1);
+ bd.add_constraint(x2 - x3 <= -2);
+ bd.add_constraint(x3 - x1 <= 0);
+ bd.add_constraint(x2 >= 5);
+ bd.add_constraint(x4 >= 3);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.remove_higher_space_dimensions(1);
+
+ BD_Shape<mpq_class> known_result(1, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.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 bd(5);
+ bd.add_constraint(x1 - x2 <=1);
+ bd.add_constraint(x2 - x3 <= 2);
+ bd.add_constraint(x3 - x1 <= 0);
+ bd.add_constraint(x2 >= 5);
+ bd.add_constraint(x4 >= 3);
+ bd.add_constraint(x5 - x3 == 2);
+
+ print_constraints(bd, "*** bd ***");
+
+ bd.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 = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test07() {
+ Variable x1(0);
+ Variable x2(1);
+ Variable x3(2);
+
+ TBD_Shape bd(3);
+ bd.add_constraint(x1 - x2 <=1);
+ bd.add_constraint(x2 - x3 <= 2);
+ bd.add_constraint(x3 - x1 <= 0);
+ bd.add_constraint(x2 >= 5);
+
+ print_constraints(bd, "*** bd ***");
+
+ BD_Shape<mpq_class> known_result(bd);
+
+ bd.remove_higher_space_dimensions(3);
+
+ bool ok = (BD_Shape<mpq_class>(bd) == known_result);
+
+ print_constraints(bd, "*** bd.remove_higher_space_dimensions(3) ***");
+
+ return ok;
+}
+
+bool
+test08() {
+ TBD_Shape bd(5);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::remove_higher_dimensions(n): it is illegal to erase
+ // a variable that is not in the space of the polyhedron.
+ bd.remove_higher_space_dimensions(7);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+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 bd(cs);
+
+ Variables_Set to_be_removed;
+ to_be_removed.insert(z);
+
+ bd.remove_space_dimensions(to_be_removed);
+
+ try {
+ to_be_removed.insert(x);
+ // This is an incorrect use use of function
+ // 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.
+ bd.remove_space_dimensions(to_be_removed);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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
diff --git a/tests/BD_Shape/run_tests b/tests/BD_Shape/run_tests
new file mode 100755
index 0000000..438d552
--- /dev/null
+++ b/tests/BD_Shape/run_tests
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+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
diff --git a/tests/BD_Shape/timeelapse1.cc b/tests/BD_Shape/timeelapse1.cc
new file mode 100644
index 0000000..7296067
--- /dev/null
+++ b/tests/BD_Shape/timeelapse1.cc
@@ -0,0 +1,209 @@
+/* Test time_elapse_assign() for particular polyhedra.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ TBD_Shape oc1(2, EMPTY);
+ TBD_Shape oc2(2);
+
+ print_constraints(oc1, "**** oc1 ****");
+ print_constraints(oc2, "**** oc2 ****");
+
+ oc1.time_elapse_assign(oc2);
+
+ TBD_Shape oc3(2);
+ TBD_Shape oc4(2, EMPTY);
+
+ print_constraints(oc3, "**** oc3 ****");
+ print_constraints(oc4, "**** oc4 ****");
+
+ oc3.time_elapse_assign(oc4);
+
+ bool ok = (oc1.is_empty()
+ && oc3.is_empty()) ;
+
+ print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+ print_constraints(oc3, "**** oc3_time_elapse_assign(oc4) ****");
+
+ return ok;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape oc1(2);
+ oc1.add_constraint(x >= 0);
+ oc1.add_constraint(y >= 0);
+ oc1.add_constraint(x + y - 2 <= 0);
+
+ TBD_Shape oc2(2);
+ oc2.add_constraint(x >= 2);
+ oc2.add_constraint(x <= 4);
+ oc2.add_constraint(y == 3);
+
+ print_constraints(oc1, "**** oc1 ****");
+ print_constraints(oc2, "**** oc2 ****");
+
+ oc1.time_elapse_assign(oc2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(x >= 0);
+ known_result.add_constraint(y >= 0);
+
+ bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+ print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+
+ return ok;
+}
+
+bool
+test03() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape oc1(2);
+ oc1.add_constraint(x >= 1);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(y >= 1);
+ oc1.add_constraint(y <= 3);
+
+ TBD_Shape oc2(2);
+ oc2.add_constraint(y == 5);
+
+ print_constraints(oc1, "**** oc1 ****");
+ print_constraints(oc2, "**** oc2 ****");
+
+ oc1.time_elapse_assign(oc2);
+
+ BD_Shape<mpq_class> known_result(2);
+ known_result.add_constraint(y >= 1);
+
+ bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+ print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+
+ return ok;
+}
+
+bool
+test04() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape oc1(3);
+ oc1.add_constraint(x <= 3);
+ oc1.add_constraint(y <= 5);
+
+ TBD_Shape oc2(3);
+ oc2.add_constraint(x <= 2);
+ oc2.add_constraint(y <= 3);
+
+ print_constraints(oc1, "**** oc1 ****");
+ print_constraints(oc2, "**** oc2 ****");
+
+ oc1.time_elapse_assign(oc2);
+
+ BD_Shape<mpq_class> known_result(3);
+
+ bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+ print_constraints(oc1, "**** oc1_time_elapse_assign(oc2) ****");
+
+ return ok;
+}
+
+bool
+test05() {
+ Variable x(0);
+ Variable y(1);
+ Variable z(2);
+
+ TBD_Shape oc1(3);
+ oc1.add_constraint(x <= 2);
+ oc1.add_constraint(x >= 1);
+ oc1.add_constraint(y <= 5);
+ oc1.add_constraint(y >= 10);
+ oc1.add_constraint(z >= 1);
+
+ TBD_Shape oc2(3);
+ oc2.add_constraint(x <= 9);
+ oc2.add_constraint(x >= 0);
+ oc2.add_constraint(y <= 3);
+ oc2.add_constraint(y >= -1);
+ oc2.add_constraint(z >= 2);
+
+ print_constraints(oc1, "**** oc1 ****");
+ print_constraints(oc2, "**** oc2 ****");
+
+ oc1.time_elapse_assign(oc2);
+
+ BD_Shape<mpq_class> known_result(3, EMPTY);
+
+ bool ok = (BD_Shape<mpq_class>(oc1) == known_result) ;
+
+ print_constraints(oc1, "**** oc1.time_elapse_assign(oc2) ****");
+
+ return ok;
+}
+
+bool
+test06() {
+ Variable x(0);
+
+ TBD_Shape bd1(1);
+ bd1.add_constraint(x == 1);
+
+ TBD_Shape bd2(2);
+
+ try {
+ // This is an invalid use of the function
+ // BD_Shape::time_elapse_assign(bd2): it is
+ // illegal to apply this function to two polyhedra that are not
+ // dimension-compatible.
+ bd1.time_elapse_assign(bd2);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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/BD_Shape/universe1.cc b/tests/BD_Shape/universe1.cc
new file mode 100644
index 0000000..34d48e3
--- /dev/null
+++ b/tests/BD_Shape/universe1.cc
@@ -0,0 +1,57 @@
+/* Test BD_Shape::is_universe().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+ // Variable z(2);
+
+ TBD_Shape bd1(4);
+ TBD_Shape bd2(4);
+
+ bd1.add_constraint(-x <= 4);
+ bd1.add_constraint(y - x <= 0);
+ bd1.add_constraint(x - y <= -5);
+
+ bool universe1 = bd1.is_universe();
+
+ nout << "*** bd1.is_universe() ***" << endl;
+ nout << (universe1 ? "true" : "false") << endl;
+
+ bool universe2 = bd2.is_universe();
+
+ nout << "*** bd2.is_universe() ***" << endl;
+ nout << (universe2 ? "true" : "false") << endl;
+
+ return universe1 != universe2;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/BD_Shape/writebdshape1.cc b/tests/BD_Shape/writebdshape1.cc
new file mode 100644
index 0000000..0b4009e
--- /dev/null
+++ b/tests/BD_Shape/writebdshape1.cc
@@ -0,0 +1,78 @@
+/* Test operator<<(ostream&, const BD_Shape&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(3);
+ TBD_Shape bd2(3);
+
+ bd1.add_constraint(x <= 3);
+ bd1.add_constraint(x - y <= 4);
+
+ bd2.add_constraint(x - y <= 5);
+ bd2.add_constraint(-y <= -2);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+
+ // FIXME!!!
+ return true;
+}
+
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ TBD_Shape bd1(0, EMPTY);
+ TBD_Shape bd2(3);
+ TBD_Shape bd3(3);
+
+ bd2.add_constraint(x - y <= 5);
+ bd2.add_constraint(-y <= -2);
+
+ bd3.add_constraint(x <= 0);
+ bd3.add_constraint(-x <= -1);
+ bd3.add_constraint(y <= 3);
+
+ print_constraints(bd1, "*** bd1 ***");
+ print_constraints(bd2, "*** bd2 ***");
+ print_constraints(bd3, "*** bd3 ***");
+
+ // FIXME!!!
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
+
diff --git a/tests/Grid/Makefile.am b/tests/Grid/Makefile.am
new file mode 100644
index 0000000..192b06d
--- /dev/null
+++ b/tests/Grid/Makefile.am
@@ -0,0 +1,261 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You 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.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --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@
+
+TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 \
+addgenerator1 \
+addgenerators1 \
+addspacedims1 \
+affinedim1 \
+affineimage1 affineimage2 \
+affinepreimage1 affinepreimage2 \
+asciidumpload1 \
+bhz03widening1 \
+bounded1 \
+boundingbox1 boundingbox2 \
+bounds1 \
+certificate1 \
+concatenate1 \
+congruence1 \
+congruences1 \
+congruencesystem1 \
+contains1 \
+copyconstruct1 \
+coveringbox1 coveringbox2 \
+discrete1 \
+disjoint1 \
+equals1 \
+expandspacedim1 \
+foldspacedims1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generator1 \
+generators1 \
+grid1 grid2 grid3 \
+griddifference1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+join1 join2 \
+limitedextrapolation1 \
+mapspacedims1 \
+maxmin1 \
+membytes1 \
+mingenerators1 \
+mincongruences1 \
+outputoperator1 \
+relations1 relations2 \
+removespacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+widening1 \
+writecongruencesystem
+
+#
+# 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
+
+asciidumpload1_SOURCES = asciidumpload1.cc
+
+bhz03widening1_SOURCES = bhz03widening1.cc
+
+bounded1_SOURCES = bounded1.cc
+
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+
+bounds1_SOURCES = bounds1.cc
+
+certificate1_SOURCES = certificate1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruence1_SOURCES = congruence1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+congruencesystem1_SOURCES = congruencesystem1.cc
+
+contains1_SOURCES = contains1.cc
+
+copyconstruct1_SOURCES = copyconstruct1.cc
+
+discrete1_SOURCES = discrete1.cc
+
+disjoint1_SOURCES = disjoint1.cc
+
+equals1_SOURCES = equals1.cc
+
+expandspacedim1_SOURCES = expandspacedim1.cc
+
+foldspacedims1_SOURCES = foldspacedims1.cc
+
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+
+generator1_SOURCES = generator1.cc
+
+generators1_SOURCES = generators1.cc
+
+coveringbox1_SOURCES = coveringbox1.cc
+coveringbox2_SOURCES = coveringbox2.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
+
+join1_SOURCES = join1.cc
+join2_SOURCES = join2.cc
+
+limitedextrapolation1_SOURCES = limitedextrapolation1.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
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+widening1_SOURCES = widening1.cc
+
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+
+XFAIL_ALWAYS =
+
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS)
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16)
+
+if USE_INT64
+
+XFAIL_SET = $(XFAIL_WITH_INT64)
+
+else !USE_INT64
+if USE_INT32
+
+XFAIL_SET = $(XFAIL_WITH_INT32)
+
+else !USE_INT32
+if USE_INT16
+
+XFAIL_SET = $(XFAIL_WITH_INT16)
+
+else !USE_INT16
+if USE_INT8
+
+XFAIL_SET = $(XFAIL_WITH_INT8)
+
+else !USE_INT8
+
+XFAIL_SET = $(XFAIL_ALWAYS)
+
+endif !USE_INT8
+endif !USE_INT16
+endif !USE_INT32
+endif !USE_INT64
+
+XFAIL_TESTS = $(XFAIL_SET)
+
+check_PROGRAMS = $(TESTS)
+
+MOSTLYCLEANFILES = \
+writecongruencesystem.dat
diff --git a/tests/Grid/Makefile.in b/tests/Grid/Makefile.in
new file mode 100644
index 0000000..229b9e0
--- /dev/null
+++ b/tests/Grid/Makefile.in
@@ -0,0 +1,1494 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You 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.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(am__EXEEXT_1)
+subdir = tests/Grid
+DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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) \
+ asciidumpload1$(EXEEXT) bhz03widening1$(EXEEXT) \
+ bounded1$(EXEEXT) boundingbox1$(EXEEXT) boundingbox2$(EXEEXT) \
+ bounds1$(EXEEXT) certificate1$(EXEEXT) concatenate1$(EXEEXT) \
+ congruence1$(EXEEXT) congruences1$(EXEEXT) \
+ congruencesystem1$(EXEEXT) contains1$(EXEEXT) \
+ copyconstruct1$(EXEEXT) coveringbox1$(EXEEXT) \
+ coveringbox2$(EXEEXT) discrete1$(EXEEXT) disjoint1$(EXEEXT) \
+ equals1$(EXEEXT) expandspacedim1$(EXEEXT) \
+ foldspacedims1$(EXEEXT) generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) generator1$(EXEEXT) \
+ generators1$(EXEEXT) grid1$(EXEEXT) grid2$(EXEEXT) \
+ grid3$(EXEEXT) griddifference1$(EXEEXT) intersection1$(EXEEXT) \
+ isempty1$(EXEEXT) isuniverse1$(EXEEXT) join1$(EXEEXT) \
+ join2$(EXEEXT) limitedextrapolation1$(EXEEXT) \
+ mapspacedims1$(EXEEXT) maxmin1$(EXEEXT) membytes1$(EXEEXT) \
+ mingenerators1$(EXEEXT) mincongruences1$(EXEEXT) \
+ outputoperator1$(EXEEXT) relations1$(EXEEXT) \
+ relations2$(EXEEXT) removespacedims1$(EXEEXT) \
+ timeelapse1$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
+ widening1$(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_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_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_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_boundingbox1_OBJECTS = boundingbox1.$(OBJEXT)
+boundingbox1_OBJECTS = $(am_boundingbox1_OBJECTS)
+boundingbox1_LDADD = $(LDADD)
+boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundingbox2_OBJECTS = boundingbox2.$(OBJEXT)
+boundingbox2_OBJECTS = $(am_boundingbox2_OBJECTS)
+boundingbox2_LDADD = $(LDADD)
+boundingbox2_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_congruencesystem1_OBJECTS = congruencesystem1.$(OBJEXT)
+congruencesystem1_OBJECTS = $(am_congruencesystem1_OBJECTS)
+congruencesystem1_LDADD = $(LDADD)
+congruencesystem1_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_copyconstruct1_OBJECTS = copyconstruct1.$(OBJEXT)
+copyconstruct1_OBJECTS = $(am_copyconstruct1_OBJECTS)
+copyconstruct1_LDADD = $(LDADD)
+copyconstruct1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_coveringbox1_OBJECTS = coveringbox1.$(OBJEXT)
+coveringbox1_OBJECTS = $(am_coveringbox1_OBJECTS)
+coveringbox1_LDADD = $(LDADD)
+coveringbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_coveringbox2_OBJECTS = coveringbox2.$(OBJEXT)
+coveringbox2_OBJECTS = $(am_coveringbox2_OBJECTS)
+coveringbox2_LDADD = $(LDADD)
+coveringbox2_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_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_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_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_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_join1_OBJECTS = join1.$(OBJEXT)
+join1_OBJECTS = $(am_join1_OBJECTS)
+join1_LDADD = $(LDADD)
+join1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_join2_OBJECTS = join2.$(OBJEXT)
+join2_OBJECTS = $(am_join2_OBJECTS)
+join2_LDADD = $(LDADD)
+join2_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_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_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_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_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_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_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
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+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) \
+ $(asciidumpload1_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundingbox1_SOURCES) \
+ $(boundingbox2_SOURCES) $(bounds1_SOURCES) \
+ $(certificate1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruence1_SOURCES) $(congruences1_SOURCES) \
+ $(congruencesystem1_SOURCES) $(contains1_SOURCES) \
+ $(copyconstruct1_SOURCES) $(coveringbox1_SOURCES) \
+ $(coveringbox2_SOURCES) $(discrete1_SOURCES) \
+ $(disjoint1_SOURCES) $(equals1_SOURCES) \
+ $(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(generator1_SOURCES) \
+ $(generators1_SOURCES) $(grid1_SOURCES) $(grid2_SOURCES) \
+ $(grid3_SOURCES) $(griddifference1_SOURCES) \
+ $(intersection1_SOURCES) $(isempty1_SOURCES) \
+ $(isuniverse1_SOURCES) $(join1_SOURCES) $(join2_SOURCES) \
+ $(limitedextrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(maxmin1_SOURCES) $(membytes1_SOURCES) \
+ $(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+ $(outputoperator1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(removespacedims1_SOURCES) \
+ $(timeelapse1_SOURCES) $(topclosed1_SOURCES) \
+ $(topclosure1_SOURCES) $(widening1_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) \
+ $(asciidumpload1_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundingbox1_SOURCES) \
+ $(boundingbox2_SOURCES) $(bounds1_SOURCES) \
+ $(certificate1_SOURCES) $(concatenate1_SOURCES) \
+ $(congruence1_SOURCES) $(congruences1_SOURCES) \
+ $(congruencesystem1_SOURCES) $(contains1_SOURCES) \
+ $(copyconstruct1_SOURCES) $(coveringbox1_SOURCES) \
+ $(coveringbox2_SOURCES) $(discrete1_SOURCES) \
+ $(disjoint1_SOURCES) $(equals1_SOURCES) \
+ $(expandspacedim1_SOURCES) $(foldspacedims1_SOURCES) \
+ $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(generator1_SOURCES) \
+ $(generators1_SOURCES) $(grid1_SOURCES) $(grid2_SOURCES) \
+ $(grid3_SOURCES) $(griddifference1_SOURCES) \
+ $(intersection1_SOURCES) $(isempty1_SOURCES) \
+ $(isuniverse1_SOURCES) $(join1_SOURCES) $(join2_SOURCES) \
+ $(limitedextrapolation1_SOURCES) $(mapspacedims1_SOURCES) \
+ $(maxmin1_SOURCES) $(membytes1_SOURCES) \
+ $(mincongruences1_SOURCES) $(mingenerators1_SOURCES) \
+ $(outputoperator1_SOURCES) $(relations1_SOURCES) \
+ $(relations2_SOURCES) $(removespacedims1_SOURCES) \
+ $(timeelapse1_SOURCES) $(topclosed1_SOURCES) \
+ $(topclosure1_SOURCES) $(widening1_SOURCES) \
+ $(writecongruencesystem_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --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@
+
+TESTS = \
+addcongruence1 \
+addcongruences1 \
+addconstraint1 \
+addconstraints1 \
+addgenerator1 \
+addgenerators1 \
+addspacedims1 \
+affinedim1 \
+affineimage1 affineimage2 \
+affinepreimage1 affinepreimage2 \
+asciidumpload1 \
+bhz03widening1 \
+bounded1 \
+boundingbox1 boundingbox2 \
+bounds1 \
+certificate1 \
+concatenate1 \
+congruence1 \
+congruences1 \
+congruencesystem1 \
+contains1 \
+copyconstruct1 \
+coveringbox1 coveringbox2 \
+discrete1 \
+disjoint1 \
+equals1 \
+expandspacedim1 \
+foldspacedims1 \
+generalizedaffineimage1 generalizedaffineimage2 \
+generalizedaffinepreimage1 generalizedaffinepreimage2 \
+generator1 \
+generators1 \
+grid1 grid2 grid3 \
+griddifference1 \
+intersection1 \
+isempty1 \
+isuniverse1 \
+join1 join2 \
+limitedextrapolation1 \
+mapspacedims1 \
+maxmin1 \
+membytes1 \
+mingenerators1 \
+mincongruences1 \
+outputoperator1 \
+relations1 relations2 \
+removespacedims1 \
+timeelapse1 \
+topclosed1 \
+topclosure1 \
+widening1 \
+writecongruencesystem
+
+
+#
+# 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
+asciidumpload1_SOURCES = asciidumpload1.cc
+bhz03widening1_SOURCES = bhz03widening1.cc
+bounded1_SOURCES = bounded1.cc
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+bounds1_SOURCES = bounds1.cc
+certificate1_SOURCES = certificate1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruence1_SOURCES = congruence1.cc
+congruences1_SOURCES = congruences1.cc
+congruencesystem1_SOURCES = congruencesystem1.cc
+contains1_SOURCES = contains1.cc
+copyconstruct1_SOURCES = copyconstruct1.cc
+discrete1_SOURCES = discrete1.cc
+disjoint1_SOURCES = disjoint1.cc
+equals1_SOURCES = equals1.cc
+expandspacedim1_SOURCES = expandspacedim1.cc
+foldspacedims1_SOURCES = foldspacedims1.cc
+generalizedaffineimage1_SOURCES = generalizedaffineimage1.cc
+generalizedaffineimage2_SOURCES = generalizedaffineimage2.cc
+generalizedaffinepreimage1_SOURCES = generalizedaffinepreimage1.cc
+generalizedaffinepreimage2_SOURCES = generalizedaffinepreimage2.cc
+generator1_SOURCES = generator1.cc
+generators1_SOURCES = generators1.cc
+coveringbox1_SOURCES = coveringbox1.cc
+coveringbox2_SOURCES = coveringbox2.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
+join1_SOURCES = join1.cc
+join2_SOURCES = join2.cc
+limitedextrapolation1_SOURCES = limitedextrapolation1.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
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+removespacedims1_SOURCES = removespacedims1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+widening1_SOURCES = widening1.cc
+writecongruencesystem_SOURCES = writecongruencesystem.cc
+XFAIL_ALWAYS =
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS)
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16)
+
+ at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_FALSE at XFAIL_SET = $(XFAIL_ALWAYS)
+ at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8)
+ at USE_INT16_TRUE@@USE_INT32_FALSE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT16)
+ at USE_INT32_TRUE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT32)
+ at USE_INT64_TRUE@XFAIL_SET = $(XFAIL_WITH_INT64)
+XFAIL_TESTS = $(XFAIL_SET)
+MOSTLYCLEANFILES = \
+writecongruencesystem.dat
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Grid/Makefile'; \
+ 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
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES)
+ @rm -f addcongruence1$(EXEEXT)
+ $(CXXLINK) $(addcongruence1_LDFLAGS) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES)
+ @rm -f addcongruences1$(EXEEXT)
+ $(CXXLINK) $(addcongruences1_LDFLAGS) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES)
+ @rm -f addconstraint1$(EXEEXT)
+ $(CXXLINK) $(addconstraint1_LDFLAGS) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES)
+ @rm -f addgenerator1$(EXEEXT)
+ $(CXXLINK) $(addgenerator1_LDFLAGS) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES)
+ @rm -f addgenerators1$(EXEEXT)
+ $(CXXLINK) $(addgenerators1_LDFLAGS) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+affinedim1$(EXEEXT): $(affinedim1_OBJECTS) $(affinedim1_DEPENDENCIES)
+ @rm -f affinedim1$(EXEEXT)
+ $(CXXLINK) $(affinedim1_LDFLAGS) $(affinedim1_OBJECTS) $(affinedim1_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES)
+ @rm -f affineimage2$(EXEEXT)
+ $(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+affinepreimage2$(EXEEXT): $(affinepreimage2_OBJECTS) $(affinepreimage2_DEPENDENCIES)
+ @rm -f affinepreimage2$(EXEEXT)
+ $(CXXLINK) $(affinepreimage2_LDFLAGS) $(affinepreimage2_OBJECTS) $(affinepreimage2_LDADD) $(LIBS)
+asciidumpload1$(EXEEXT): $(asciidumpload1_OBJECTS) $(asciidumpload1_DEPENDENCIES)
+ @rm -f asciidumpload1$(EXEEXT)
+ $(CXXLINK) $(asciidumpload1_LDFLAGS) $(asciidumpload1_OBJECTS) $(asciidumpload1_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(CXXLINK) $(bounded1_LDFLAGS) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundingbox1$(EXEEXT): $(boundingbox1_OBJECTS) $(boundingbox1_DEPENDENCIES)
+ @rm -f boundingbox1$(EXEEXT)
+ $(CXXLINK) $(boundingbox1_LDFLAGS) $(boundingbox1_OBJECTS) $(boundingbox1_LDADD) $(LIBS)
+boundingbox2$(EXEEXT): $(boundingbox2_OBJECTS) $(boundingbox2_DEPENDENCIES)
+ @rm -f boundingbox2$(EXEEXT)
+ $(CXXLINK) $(boundingbox2_LDFLAGS) $(boundingbox2_OBJECTS) $(boundingbox2_LDADD) $(LIBS)
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(CXXLINK) $(bounds1_LDFLAGS) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+certificate1$(EXEEXT): $(certificate1_OBJECTS) $(certificate1_DEPENDENCIES)
+ @rm -f certificate1$(EXEEXT)
+ $(CXXLINK) $(certificate1_LDFLAGS) $(certificate1_OBJECTS) $(certificate1_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+congruence1$(EXEEXT): $(congruence1_OBJECTS) $(congruence1_DEPENDENCIES)
+ @rm -f congruence1$(EXEEXT)
+ $(CXXLINK) $(congruence1_LDFLAGS) $(congruence1_OBJECTS) $(congruence1_LDADD) $(LIBS)
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(CXXLINK) $(congruences1_LDFLAGS) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+congruencesystem1$(EXEEXT): $(congruencesystem1_OBJECTS) $(congruencesystem1_DEPENDENCIES)
+ @rm -f congruencesystem1$(EXEEXT)
+ $(CXXLINK) $(congruencesystem1_LDFLAGS) $(congruencesystem1_OBJECTS) $(congruencesystem1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+copyconstruct1$(EXEEXT): $(copyconstruct1_OBJECTS) $(copyconstruct1_DEPENDENCIES)
+ @rm -f copyconstruct1$(EXEEXT)
+ $(CXXLINK) $(copyconstruct1_LDFLAGS) $(copyconstruct1_OBJECTS) $(copyconstruct1_LDADD) $(LIBS)
+coveringbox1$(EXEEXT): $(coveringbox1_OBJECTS) $(coveringbox1_DEPENDENCIES)
+ @rm -f coveringbox1$(EXEEXT)
+ $(CXXLINK) $(coveringbox1_LDFLAGS) $(coveringbox1_OBJECTS) $(coveringbox1_LDADD) $(LIBS)
+coveringbox2$(EXEEXT): $(coveringbox2_OBJECTS) $(coveringbox2_DEPENDENCIES)
+ @rm -f coveringbox2$(EXEEXT)
+ $(CXXLINK) $(coveringbox2_LDFLAGS) $(coveringbox2_OBJECTS) $(coveringbox2_LDADD) $(LIBS)
+discrete1$(EXEEXT): $(discrete1_OBJECTS) $(discrete1_DEPENDENCIES)
+ @rm -f discrete1$(EXEEXT)
+ $(CXXLINK) $(discrete1_LDFLAGS) $(discrete1_OBJECTS) $(discrete1_LDADD) $(LIBS)
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(CXXLINK) $(disjoint1_LDFLAGS) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES)
+ @rm -f equals1$(EXEEXT)
+ $(CXXLINK) $(equals1_LDFLAGS) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES)
+ @rm -f expandspacedim1$(EXEEXT)
+ $(CXXLINK) $(expandspacedim1_LDFLAGS) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES)
+ @rm -f foldspacedims1$(EXEEXT)
+ $(CXXLINK) $(foldspacedims1_LDFLAGS) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage2$(EXEEXT)
+ $(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+generator1$(EXEEXT): $(generator1_OBJECTS) $(generator1_DEPENDENCIES)
+ @rm -f generator1$(EXEEXT)
+ $(CXXLINK) $(generator1_LDFLAGS) $(generator1_OBJECTS) $(generator1_LDADD) $(LIBS)
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES)
+ @rm -f generators1$(EXEEXT)
+ $(CXXLINK) $(generators1_LDFLAGS) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+grid1$(EXEEXT): $(grid1_OBJECTS) $(grid1_DEPENDENCIES)
+ @rm -f grid1$(EXEEXT)
+ $(CXXLINK) $(grid1_LDFLAGS) $(grid1_OBJECTS) $(grid1_LDADD) $(LIBS)
+grid2$(EXEEXT): $(grid2_OBJECTS) $(grid2_DEPENDENCIES)
+ @rm -f grid2$(EXEEXT)
+ $(CXXLINK) $(grid2_LDFLAGS) $(grid2_OBJECTS) $(grid2_LDADD) $(LIBS)
+grid3$(EXEEXT): $(grid3_OBJECTS) $(grid3_DEPENDENCIES)
+ @rm -f grid3$(EXEEXT)
+ $(CXXLINK) $(grid3_LDFLAGS) $(grid3_OBJECTS) $(grid3_LDADD) $(LIBS)
+griddifference1$(EXEEXT): $(griddifference1_OBJECTS) $(griddifference1_DEPENDENCIES)
+ @rm -f griddifference1$(EXEEXT)
+ $(CXXLINK) $(griddifference1_LDFLAGS) $(griddifference1_OBJECTS) $(griddifference1_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+isempty1$(EXEEXT): $(isempty1_OBJECTS) $(isempty1_DEPENDENCIES)
+ @rm -f isempty1$(EXEEXT)
+ $(CXXLINK) $(isempty1_LDFLAGS) $(isempty1_OBJECTS) $(isempty1_LDADD) $(LIBS)
+isuniverse1$(EXEEXT): $(isuniverse1_OBJECTS) $(isuniverse1_DEPENDENCIES)
+ @rm -f isuniverse1$(EXEEXT)
+ $(CXXLINK) $(isuniverse1_LDFLAGS) $(isuniverse1_OBJECTS) $(isuniverse1_LDADD) $(LIBS)
+join1$(EXEEXT): $(join1_OBJECTS) $(join1_DEPENDENCIES)
+ @rm -f join1$(EXEEXT)
+ $(CXXLINK) $(join1_LDFLAGS) $(join1_OBJECTS) $(join1_LDADD) $(LIBS)
+join2$(EXEEXT): $(join2_OBJECTS) $(join2_DEPENDENCIES)
+ @rm -f join2$(EXEEXT)
+ $(CXXLINK) $(join2_LDFLAGS) $(join2_OBJECTS) $(join2_LDADD) $(LIBS)
+limitedextrapolation1$(EXEEXT): $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_DEPENDENCIES)
+ @rm -f limitedextrapolation1$(EXEEXT)
+ $(CXXLINK) $(limitedextrapolation1_LDFLAGS) $(limitedextrapolation1_OBJECTS) $(limitedextrapolation1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+maxmin1$(EXEEXT): $(maxmin1_OBJECTS) $(maxmin1_DEPENDENCIES)
+ @rm -f maxmin1$(EXEEXT)
+ $(CXXLINK) $(maxmin1_LDFLAGS) $(maxmin1_OBJECTS) $(maxmin1_LDADD) $(LIBS)
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(CXXLINK) $(membytes1_LDFLAGS) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+mincongruences1$(EXEEXT): $(mincongruences1_OBJECTS) $(mincongruences1_DEPENDENCIES)
+ @rm -f mincongruences1$(EXEEXT)
+ $(CXXLINK) $(mincongruences1_LDFLAGS) $(mincongruences1_OBJECTS) $(mincongruences1_LDADD) $(LIBS)
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES)
+ @rm -f mingenerators1$(EXEEXT)
+ $(CXXLINK) $(mingenerators1_LDFLAGS) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+outputoperator1$(EXEEXT): $(outputoperator1_OBJECTS) $(outputoperator1_DEPENDENCIES)
+ @rm -f outputoperator1$(EXEEXT)
+ $(CXXLINK) $(outputoperator1_LDFLAGS) $(outputoperator1_OBJECTS) $(outputoperator1_LDADD) $(LIBS)
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES)
+ @rm -f relations2$(EXEEXT)
+ $(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES)
+ @rm -f topclosed1$(EXEEXT)
+ $(CXXLINK) $(topclosed1_LDFLAGS) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES)
+ @rm -f topclosure1$(EXEEXT)
+ $(CXXLINK) $(topclosure1_LDFLAGS) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+widening1$(EXEEXT): $(widening1_OBJECTS) $(widening1_DEPENDENCIES)
+ @rm -f widening1$(EXEEXT)
+ $(CXXLINK) $(widening1_LDFLAGS) $(widening1_OBJECTS) $(widening1_LDADD) $(LIBS)
+writecongruencesystem$(EXEEXT): $(writecongruencesystem_OBJECTS) $(writecongruencesystem_DEPENDENCIES)
+ @rm -f writecongruencesystem$(EXEEXT)
+ $(CXXLINK) $(writecongruencesystem_LDFLAGS) $(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)/asciidumpload1.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)/boundingbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox2.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)/congruencesystem1.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)/copyconstruct1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/coveringbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/coveringbox2.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)/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)/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)/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)/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)/join1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/join2.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)/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)/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)/removespacedims1.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)/widening1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/writecongruencesystem.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; \
+ 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; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ 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 \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ 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`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool ctags \
+ 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-exec install-exec-am install-info \
+ install-info-am install-man 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 uninstall uninstall-am uninstall-info-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/Grid/addcongruence1.cc b/tests/Grid/addcongruence1.cc
new file mode 100644
index 0000000..176dbe1
--- /dev/null
+++ b/tests/Grid/addcongruence1.cc
@@ -0,0 +1,135 @@
+/* Test methods which add a single congruence to a grid.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+// Many cases are covered in addgenerator1, in which the known grid is
+// always created with Grid::add_congruence.
+
+namespace {
+
+// Test add_congruence_and_minimize.
+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) ***");
+
+ gr.add_congruence_and_minimize((A + B %= 0) / 3);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A + B %= 0) / 6);
+
+ bool ok = (gr == known_gr) ;
+
+ print_congruences(gr,
+ "*** gr.add_congruence_and_minimize((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_generator(grid_point());
+ known_gr.add_generator(parameter(7*A));
+ known_gr.add_generator(parameter(7*B));
+ known_gr.add_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence((A %= 0) / 7) ***");
+
+ return ok;
+}
+
+// Add a congruence and minimize with less dimensions than the grid.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B %= 0) / 7);
+ gr.add_congruence_and_minimize((A %= 0) / 7);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(parameter(7*A));
+ known_gr.add_generator(parameter(7*B));
+ known_gr.add_generator(grid_line(C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence((A %= 0) / 7) ***");
+
+ return ok;
+}
+
+} // 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..e449d19
--- /dev/null
+++ b/tests/Grid/addcongruences1.cc
@@ -0,0 +1,409 @@
+/* Test methods which can add multiple congruences to a grid.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_congruences_and_minimize
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 2);
+ cgs.insert(A + B == 0);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruences_and_minimize(cgs);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(2*A - 2*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences_and_minimize
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert((B %= 0) / 2);
+ cgs.insert(A - B == 0);
+
+ Grid gr(2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences_and_minimize(cgs);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(2*A + 2*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences(cgs) -- space dimension exception
+bool
+test05() {
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_congruences_and_minimize(cgs) -- space dimension
+// exception
+bool
+test07() {
+ Variable B(1);
+
+ Congruence_System cgs;
+ cgs.insert(B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_congruences_and_minimize(cgs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_congruences, empty grid.
+bool
+test08() {
+ 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_and_minimize, add empty system.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_generator(grid_point(3*A + B));
+
+ Grid known_gr = gr;
+
+ Congruence_System cgs;
+
+ gr.add_recycled_congruences_and_minimize(cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences_and_minimize(cgs ***");
+
+ return ok;
+}
+
+// add_recycled_congruences_and_minimize, add system of single trivial
+// congruence to zero dim grid.
+bool
+test10() {
+
+ Grid gr(0);
+
+ print_congruences(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ Congruence_System cgs;
+ cgs.insert(Congruence::zero_dim_integrality());
+
+ gr.add_recycled_congruences_and_minimize(cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences_and_minimize, add to empty grid.
+bool
+test11() {
+ 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_and_minimize(cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences_and_minimize, add empty system to grid
+// with minimized generators and up to date congruences.
+bool
+test12() {
+ 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_generators();
+
+ print_congruences(gr, "*** gr ***");
+
+ Congruence_System cgs;
+
+ gr.add_recycled_congruences_and_minimize(cgs);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences_and_minimize, add empty system to grid
+// with up to date congruences and generators.
+bool
+test13() {
+ 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_and_minimize(cgs);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences_and_minimize, add congruence in 1D to
+// universe grid in 2D.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+
+ Congruence_System cgs;
+ cgs.insert((A %= 0) / 7);
+
+ gr1.add_recycled_congruences_and_minimize(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, "*** gr2.add_congruence_and_minimize((22*A %= 3) / 7) ***");
+
+ 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/addconstraint1.cc b/tests/Grid/addconstraint1.cc
new file mode 100644
index 0000000..3aa5af0
--- /dev/null
+++ b/tests/Grid/addconstraint1.cc
@@ -0,0 +1,244 @@
+/* Test adding single constraints to grids.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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) ***");
+ gr.add_constraint(B >= 0);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A == 3);
+ 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);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_constraint(*ph.constraints().begin()) ***");
+
+ return ok;
+}
+
+// add_constraint_and_minimize(cs)
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4);
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraint_and_minimize(2*A == C);
+ print_congruences(gr, "*** gr.add_constraint_and_minimize(2*A == C) ***");
+ gr.add_constraint_and_minimize(D == 0);
+ print_congruences(gr, "*** gr.add_constraint_and_minimize(D == 0) ***");
+ gr.add_constraint_and_minimize(B > 2);
+
+ Grid known_gr(4);
+ known_gr.add_congruence(2*A == C);
+ known_gr.add_congruence(D == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraint_and_minimize(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);
+
+ Grid known_gr(4);
+
+ known_gr.add_congruence(D == 4);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence(D == 4) ***");
+
+ return ok;
+}
+
+// add_congruence(c), where grid stays the same
+bool
+test05() {
+ Variable D(3);
+
+ Grid gr(4);
+ print_congruences(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.add_congruence(D > 4);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruence(D > 4) ***");
+
+ return ok;
+}
+
+// add_congruence_and_minimize(c), add equality.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruence_and_minimize(C == 4*A);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(C == 4*A);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** add_congruence_and_minimize(C == 4*A) ***");
+
+ return ok;
+}
+
+// add_congruence_and_minimize(c), where grid stays the same.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((B == 0) / 0);
+
+ Grid known_gr = gr;
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruence_and_minimize(C > 4*A);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_congruence_and_minimize(C > 4*A) ***");
+
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_constraint_and_minimize -- space dimension exception
+bool
+test09() {
+ Variable B(1);
+
+ Grid gr(1);
+
+ try {
+ gr.add_constraint_and_minimize(B == 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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
diff --git a/tests/Grid/addconstraints1.cc b/tests/Grid/addconstraints1.cc
new file mode 100644
index 0000000..65b7ecf
--- /dev/null
+++ b/tests/Grid/addconstraints1.cc
@@ -0,0 +1,516 @@
+/* Test adding constraints to a grid.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_congruences_and_minimize(cs)
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+ cs.insert(A >= 0);
+ cs.insert(C > 0);
+
+ gr.add_congruences_and_minimize(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(B == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences_and_minimize(cs) ***");
+
+ return ok;
+}
+
+// add_constraints
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+ cs.insert(A >= 0);
+ cs.insert(C > 0);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraints(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(B == 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;
+ cs.insert(B < 0);
+ cs.insert(A >= 0);
+ cs.insert(C > 0);
+
+ 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_congruences(cs)
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(B < 0);
+ cs.insert(B > 0);
+ cs.insert(A == 0);
+ cs.insert(C > 0);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_congruences(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(A == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences(cs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences(cs)
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(2*B == 3);
+ cs.insert(A == 0);
+ cs.insert(C > 0);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(A == 0);
+ known_gr.add_congruence(2*B == 3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_congruences(cs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences_and_minimize(cs)
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(2*B >= 3);
+ cs.insert(2*A == 7);
+ cs.insert(C > 0);
+
+ Grid gr(3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_congruences_and_minimize(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(2*A == 7);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_congruences_and_minimize(cs) ***");
+
+ return ok;
+}
+
+// add_constraints_and_minimize(cs)
+
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(2*B >= 3);
+ cs.insert(D == 0);
+ cs.insert(2*A == C);
+
+ Grid gr(4);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_constraints_and_minimize(cs);
+
+ Grid known_gr(4);
+ known_gr.add_congruence(2*A == C);
+ known_gr.add_congruence(D == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_constraints_and_minimize(cs) ***");
+
+ return ok;
+}
+
+// add_recycled_constraints
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(2*B > 2);
+ cs.insert(2*D == 0);
+
+ Grid gr(4);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_constraints(cs);
+
+ Grid known_gr(4);
+ known_gr.add_congruence(D == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_recycled_constraints(cs) ***");
+
+ return ok;
+}
+
+// add_recycled_constraints_and_minimize
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Constraint_System cs;
+ cs.insert(2*B > 6);
+ cs.insert(2*C == 6*D);
+
+ Grid gr(4);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_recycled_constraints_and_minimize(cs);
+
+ Grid known_gr(4);
+ known_gr.add_congruence(C == 3*D);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_constraints_and_minimize(cs) ***");
+
+ return ok;
+}
+
+// add_recycled_congruences(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_congruences(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_congruences(cs) -- space dimension exception
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_congruences(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_congruences_and_minimize(cs) -- space dimension
+// exception
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_congruences_and_minimize(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_congruences_and_minimize(cs) -- space dimension exception
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_congruences_and_minimize(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_constraints(cs) -- space dimension exception
+bool
+test14() {
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_constraints(cs) -- space dimension exception
+bool
+test15() {
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_constraints(cs) -- space dimension exception
+bool
+test16() {
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_constraints_and_minimize(cs) -- space dimension
+// exception
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_constraints_and_minimize(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_constraints_and_minimize(cs) -- space dimension exception
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Constraint_System cs;
+ cs.insert(A + B == 0);
+
+ Grid gr(1);
+
+ try {
+ gr.add_constraints_and_minimize(cs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+ DO_TEST(test17);
+ DO_TEST(test18);
+END_MAIN
diff --git a/tests/Grid/addgenerator1.cc b/tests/Grid/addgenerator1.cc
new file mode 100644
index 0000000..5b6f7e9
--- /dev/null
+++ b/tests/Grid/addgenerator1.cc
@@ -0,0 +1,366 @@
+/* Test Grid::add_generator*().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+// grid1.cc also tests add_generator_and_minimize.
+
+// One dimension.
+bool
+test01() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_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_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_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_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_generator(grid_point());
+ gr.add_generator(grid_point(A + 2*B));
+ gr.add_generator(grid_point(A + B));
+ gr.add_generator(grid_point(2*A + 2*B));
+ gr.add_generator(grid_line(A));
+
+ Grid known_gr(2);
+ known_gr.add_congruence(B %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_generator(...) ***");
+
+ return ok;
+}
+
+// Add NNC generators.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ //gs.insert(closure_point(3*A, 4)); // FIX
+ 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_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_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_generator(grid_point(7*A, 3));
+ print_congruences(gr, "*** gr.add_generator(grid_point(7*A, 3)) ***");
+ gr.add_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_generator(grid_line(A - B)) ***");
+
+ return ok;
+}
+
+// add_generator_and_minimize
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(2*A + 2*B));
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_generator(grid_point(8*A + 8*B));
+
+ gr.add_generator_and_minimize(grid_line(A));
+
+ Grid known_gr(2);
+ known_gr.add_congruence((B %= 0) / 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_generator_and_minimize(grid_line(A)) ***");
+
+ return ok;
+}
+
+// Add a generator to a universe grid.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr(4);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_generator(grid_point(12*A + 7*D));
+
+ Grid known_gr(4);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** ***");
+
+ return ok;
+}
+
+// add_generator_and_minimize, adding a generator with a divisor to a
+// grid of many generators.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+
+ print_congruences(gr, "*** gr ***");
+
+ // Minimize the grid.
+
+ gr.add_generator_and_minimize(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_generator_and_minimize(grid_point(B, 3)) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test09() {
+ Variable A(0);
+ Variable C(2);
+
+ Grid gr(2);
+
+ try {
+ gr.add_generator(grid_point(A + C));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Zero dimensions empty.
+bool
+test10() {
+ Grid gr(0, EMPTY);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_generator(grid_point());
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_generator(grid_point()) ***");
+
+ return ok;
+}
+
+// Zero dimension universe.
+bool
+test11() {
+ Grid gr(0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.add_generator(grid_point());
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_generator(grid_point()) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test12() {
+ Variable A(0);
+
+ Grid gr(2, EMPTY);
+
+ try {
+ gr.add_generator(grid_line(A));
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Try add parameter to empty grid.
+bool
+test13() {
+ Grid gr(2, EMPTY);
+
+ try {
+ gr.add_generator(parameter());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Try add parameter to zero dimension empty grid.
+bool
+test14() {
+ Grid gr(0, EMPTY);
+
+ try {
+ gr.add_generator(parameter());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+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/addgenerators1.cc b/tests/Grid/addgenerators1.cc
new file mode 100644
index 0000000..28374b1
--- /dev/null
+++ b/tests/Grid/addgenerators1.cc
@@ -0,0 +1,281 @@
+/* Test methods which can add multiple generators to a grid.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// grid1*.cc use add_generators_and_minimize often.
+
+// add_recycled_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_generators(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_generators_and_minimize -- space dimension exception.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(B));
+
+ Grid gr(1);
+
+ try {
+ gr.add_recycled_generators_and_minimize(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_generators -- zero dimension universe.
+bool
+test03() {
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+
+ Grid gr(0);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_recycled_generators(gs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_generators(gs) ***");
+
+ return ok;
+}
+
+// add_recycled_generators -- zero dimension empty.
+bool
+test04() {
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+
+ Grid gr(0, EMPTY);
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_recycled_generators(gs);
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_generators(gs) ***");
+
+ return ok;
+}
+
+// add_recycled_generators -- add system with a single parameter
+// generator to the zero dimension empty grid.
+bool
+test05() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(parameter(A));
+
+ Variables_Set vs;
+ vs.insert(A);
+
+ // This may be the only was to create a zero dimension generator
+ // system that contains only parameters and/or lines.
+ gs.remove_space_dimensions(vs);
+
+ Grid gr(0, EMPTY);
+
+ try {
+ gr.add_recycled_generators(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_generators_and_minimize -- add system with a single
+// parameter generator to the zero dimension empty grid.
+bool
+test06() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(parameter(A));
+
+ Variables_Set vs;
+ vs.insert(A);
+
+ // This may be the only was to create a zero dimension generator
+ // system that contains only parameters and/or lines.
+ gs.remove_space_dimensions(vs);
+
+ Grid gr(0, EMPTY);
+
+ try {
+ gr.add_recycled_generators_and_minimize(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_generators -- add system with a single parameter
+// generator to the empty grid.
+bool
+test07() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(parameter(A));
+
+ Grid gr(2, EMPTY);
+
+ try {
+ gr.add_recycled_generators(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_generators_and_minimize -- add to the zero dim grid.
+bool
+test08() {
+ Grid_Generator_System gs;
+ gs.insert(grid_point());
+
+ Grid gr(0, EMPTY);
+ gr.add_recycled_generators_and_minimize(gs);
+
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr(0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.add_recycled_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// add_recycled_generators_and_minimize -- try add system with a
+// single parameter generator to the empty grid.
+bool
+test09() {
+ Variable A(0);
+
+ Grid_Generator_System gs;
+ gs.insert(parameter(A));
+
+ Grid gr(2, EMPTY);
+
+ try {
+ gr.add_recycled_generators_and_minimize(gs);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// add_recycled_generators_and_minimize -- add an empty system.
+bool
+test10() {
+ Grid_Generator_System gs;
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point());
+
+ print_generators(gr, "*** gr ***");
+
+ Grid known_gr = gr;
+
+ gr.add_recycled_generators_and_minimize(gs);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr,
+ "*** gr.add_recycled_generators_and_minimize(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);
+END_MAIN
diff --git a/tests/Grid/addspacedims1.cc b/tests/Grid/addspacedims1.cc
new file mode 100644
index 0000000..92b2580
--- /dev/null
+++ b/tests/Grid/addspacedims1.cc
@@ -0,0 +1,546 @@
+/* Test Grid::add_space_dimensions_and_embed().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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,
+ "*** ***");
+
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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_generator(grid_point());
+ gr.add_generator(grid_line(A));
+
+ gr.minimized_generators();
+
+ print_congruences(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,
+ "*** ***");
+
+ 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 {
+ }
+ catch (const std::length_error& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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_generator(grid_point());
+ known_gr.add_generator(parameter(A));
+ known_gr.add_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_generator(grid_point());
+ gr.add_generator(grid_line(A));
+
+ gr.minimized_generators();
+
+ print_generators(gr, "*** gr ***");
+
+ gr.add_space_dimensions_and_project(2);
+
+ Grid known_gr(4);
+ known_gr.add_congruence(B == 0);
+ known_gr.add_congruence(C == 0);
+ known_gr.add_congruence(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..18f1685
--- /dev/null
+++ b/tests/Grid/affinedim1.cc
@@ -0,0 +1,321 @@
+/* Test Grid::affine_dimension().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator_and_minimize(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_congruence(C == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator(grid_point(3*A + B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator(grid_line(C));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_generator(grid_line(C));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_congruence(A == 0);
+ gr_cgs_needs_min.add_congruence(D == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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..9c96d5c
--- /dev/null
+++ b/tests/Grid/affineimage1.cc
@@ -0,0 +1,402 @@
+/* Test Grid::affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_generator(grid_point(A));
+ known_gr.add_generator(grid_point(7*A + 3*B));
+ known_gr.add_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_generator(grid_point(2*A + 2*B));
+ known_gr.add_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_generator(grid_point(4*A + 6*B, 3));
+ known_gr.add_generator(grid_point(9*A + 6*B, 3));
+ known_gr.add_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_generator(grid_point(3*A + 2*B));
+ gr.add_generator(grid_point(8*A + 2*B));
+ gr.add_generator(grid_line(C));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, A + 1, 3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(4*A + 6*B, 3));
+ known_gr.add_generator(grid_point(9*A + 6*B, 3));
+ known_gr.add_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_generator(grid_point(4*A + 6*B, 3));
+ known_gr.add_generator(grid_point(9*A + 6*B, 3));
+ known_gr.add_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_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_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_generator(grid_point(4*A));
+ known_gr.add_generator(grid_point(7*A));
+ known_gr.add_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_generator(grid_point(4*A));
+ known_gr.add_generator(grid_point(7*A));
+ known_gr.add_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_generator(grid_point());
+ gr.add_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_generator(grid_point());
+ gr.add_generator(grid_point(3*A));
+ gr.add_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_generator(grid_point(A));
+ known_gr.add_generator(grid_point(7*A + 3*B));
+ known_gr.add_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_generator(grid_point());
+ gr.add_generator(grid_point(3*A));
+ gr.add_generator(grid_point(3*B));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, B);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_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_generator(grid_point());
+ known_gr.add_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..cabe44a
--- /dev/null
+++ b/tests/Grid/affineimage2.cc
@@ -0,0 +1,317 @@
+/* Test Grid::affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point());
+ known_gr.add_generator(grid_point(2*A, 15));
+ known_gr.add_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_generator(grid_point(A));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_image(A, B + 2, -3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_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);
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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_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, 18*A + B, 1, 0);
+ gr1.generalized_affine_image(A, 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.join_assign(gr1); // join of gr0 and gr1
+
+ print_congruences(gr,
+ "*** gr.join_assign(gr1) ***");
+
+ gr.join_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.join_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_F16A(test10);
+END_MAIN
diff --git a/tests/Grid/affinepreimage1.cc b/tests/Grid/affinepreimage1.cc
new file mode 100644
index 0000000..f5f441f
--- /dev/null
+++ b/tests/Grid/affinepreimage1.cc
@@ -0,0 +1,443 @@
+/* Test Grid::affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_generator(grid_point(2*A + 2*B));
+ gr.add_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_generator(grid_point(4*A + 6*B, 3));
+ gr.add_generator(grid_point(9*A + 6*B, 3));
+ gr.add_generator(grid_line(C));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, A + 1, 3);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(3*A + 2*B));
+ known_gr.add_generator(grid_point(8*A + 2*B));
+ known_gr.add_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_generator(grid_point(3*A + 2*B));
+ known_gr.add_generator(grid_point(8*A + 2*B));
+ known_gr.add_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_generator(grid_point(4*A));
+ gr.add_generator(grid_point(7*A));
+ gr.add_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_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_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_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_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_generator(grid_point());
+ gr.add_generator(grid_point(2*A));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, 2*A);
+
+ Grid known_gr(1, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_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_generator(grid_point());
+ known_gr.add_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_generator(grid_point(A));
+ gr.add_generator(grid_point(7*A + 3*B));
+ gr.add_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_generator(grid_point());
+ known_gr.add_generator(grid_point(3*A));
+ known_gr.add_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);
+ // FIX Confirm that this should fail when Grid_nonpublic.cc
+ // BE_LAZY=0.
+ //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_generator(grid_point());
+ known_gr.add_generator(grid_point(3*A));
+ known_gr.add_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_generator(grid_point());
+ gr.add_generator(grid_point(3*A + 3*B));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.affine_preimage(A, B);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_line(A));
+ known_gr.add_generator(grid_point(3*B));
+
+ bool ok = (gr == known_gr);
+
+ print_generators(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_generator(grid_point());
+ known_gr.add_generator(grid_line(A));
+ known_gr.add_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..56dda2c
--- /dev/null
+++ b/tests/Grid/affinepreimage2.cc
@@ -0,0 +1,372 @@
+/* Test Grid::affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point());
+ known_gr.add_generator(grid_point(A, 3));
+ known_gr.add_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_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_generator(grid_point());
+ known_gr.add_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_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_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_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);
+ gr.add_congruence(B == 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);
+ gr.add_congruence(B == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.affine_preimage(B, A);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A == 3);
+
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/asciidumpload1.cc b/tests/Grid/asciidumpload1.cc
new file mode 100644
index 0000000..c54c35a
--- /dev/null
+++ b/tests/Grid/asciidumpload1.cc
@@ -0,0 +1,178 @@
+/* Test Grid::ascii_dump() and Grid::ascii_load().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+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_generator(grid_point(3*A + C));
+ gr1.add_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);
+
+ 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_generator(grid_point(3*A + C));
+ gr1.add_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);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ stringstream ss2;
+ gr2.ascii_dump(ss2);
+
+ gr2.ascii_dump(vnout);
+
+ 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/bhz03widening1.cc b/tests/Grid/bhz03widening1.cc
new file mode 100644
index 0000000..58000fb
--- /dev/null
+++ b/tests/Grid/bhz03widening1.cc
@@ -0,0 +1,111 @@
+/* Test Polyhedra_Powerset<Grid>::BHZ03_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+typedef Polyhedra_Powerset<Grid> GSet;
+
+namespace {
+
+// Joins of grids in powersets shows that series is stabilising.
+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..53db200
--- /dev/null
+++ b/tests/Grid/bounded1.cc
@@ -0,0 +1,397 @@
+/* Test Grid::is_bounded().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator_and_minimize(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_congruence(C == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator(grid_point(3*A + B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator(grid_line(C));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_generator(grid_line(C));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_congruence(A == 0);
+ gr_cgs_needs_min.add_congruence(D == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_gs_needs_min(6, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_cgs_needs_min(6);
+ gr_cgs_needs_min.add_congruence(A == 7);
+ gr_cgs_needs_min.add_congruence(B == -11);
+ gr_cgs_needs_min.add_congruence(C == 0);
+ gr_cgs_needs_min.add_congruence(D == 0);
+ gr_cgs_needs_min.add_congruence(E == 0);
+ gr_cgs_needs_min.add_congruence(F == 19);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr.add_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/boundingbox1.cc b/tests/Grid/boundingbox1.cc
new file mode 100644
index 0000000..51875c1
--- /dev/null
+++ b/tests/Grid/boundingbox1.cc
@@ -0,0 +1,295 @@
+/* Test Grid::Grid(Box&, From_Bounding_Box).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+// This constructor is also tested via coveringbox2.cc.
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Universe box.
+bool
+test01() {
+ Bounding_Box box(2);
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_Box() ***");
+
+ return ok;
+}
+
+// A 2D box which is a line parallel to the x axis.
+bool
+test02() {
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.raise_lower_bound(1, true, 2, 3);
+ box.lower_upper_bound(1, true, 2, 3);
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr(2);
+ known_gr.add_congruence(3*B == 2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_Box() ***");
+
+ return ok;
+}
+
+// A 2D box that is a point, with divisors.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, -2, 3);
+ box.lower_upper_bound(0, true, -2, 3);
+ box.raise_lower_bound(1, true, -10, 1);
+ box.lower_upper_bound(1, true, -10, 1);
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(-2*A - 30*B, 3));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_Box() ***");
+
+ return ok;
+}
+
+// A 3D box which is a 2D plane.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box(3);
+ box.raise_lower_bound(2, true, 15, 5);
+ box.lower_upper_bound(2, true, 15, 5);
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(3*C));
+ known_gr.add_generator(grid_line(A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_Box() ***");
+
+ return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+ Bounding_Box box(0);
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr;
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_Box()) ***");
+
+ return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+ Bounding_Box box(2);
+ box.set_empty();
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_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);
+
+ Bounding_Box box(4);
+ box.raise_lower_bound(3, true, 4, 1);
+ box.lower_upper_bound(3, true, 4, 1);
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr(4);
+ known_gr.add_constraint(D == 4);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_Box()) ***");
+
+ return ok;
+}
+
+// Unit square.
+bool
+test08() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.lower_upper_bound(0, true, 1, 1);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(1, true, 1, 1);
+
+ try {
+ Grid gr(box, From_Bounding_Box());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Simple box with divisor and an interval bounded only from below.
+bool
+test09() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(1, true, 1, 2);
+
+ try {
+ Grid gr(box, From_Bounding_Box());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+ Bounding_Box box(2);
+ box.lower_upper_bound(0, true, 3, 7);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(1, true, 1, 2);
+
+ try {
+ Grid gr(box, From_Bounding_Box());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// An otherwise valid box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test11() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 3, 7);
+ box.lower_upper_bound(0, true, 3, 7);
+ box.raise_lower_bound(1, false, 1, 2);
+ box.lower_upper_bound(1, true, 1, 2);
+
+ try {
+ Grid gr(box, From_Bounding_Box());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+ Bounding_Box box(0);
+ box.set_empty();
+
+ Grid gr(box, From_Bounding_Box());
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr(box, From_Bounding_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);
+END_MAIN
diff --git a/tests/Grid/boundingbox2.cc b/tests/Grid/boundingbox2.cc
new file mode 100644
index 0000000..30330ff
--- /dev/null
+++ b/tests/Grid/boundingbox2.cc
@@ -0,0 +1,520 @@
+/* Test Grid::shrink_bounding_box(Box&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+operator==(const Bounding_Box& x, const Bounding_Box& y) {
+ dimension_type dimension = x.space_dimension();
+ if (dimension != y.space_dimension())
+ return false;
+
+ if (x.is_empty() && y.is_empty())
+ return true;
+
+ if (x.is_empty() || y.is_empty())
+ return false;
+
+ TEMP_INTEGER(n_x);
+ TEMP_INTEGER(n_y);
+ TEMP_INTEGER(d_x);
+ TEMP_INTEGER(d_y);
+
+ for (dimension_type i = dimension; i-- > 0; ) {
+ bool tem;
+ bool x_closed = x.get_lower_bound(i, tem, n_x, d_x);
+ bool y_closed = y.get_lower_bound(i, tem, n_y, d_y);
+ if (x_closed == y_closed) {
+ if (x_closed && (n_x != n_y || d_x != d_y))
+ return false;
+ }
+ else
+ return false;
+ x_closed = x.get_upper_bound(i, tem, n_x, d_x);
+ y_closed = y.get_upper_bound(i, tem, n_y, d_y);
+ if (x_closed == y_closed) {
+ if (x_closed && (n_x != n_y || d_x != d_y))
+ return false;
+ }
+ else
+ return false;
+ }
+
+ return true;
+}
+
+// Minimized rectilinear grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.lower_upper_bound(0, true, 3, 1);
+ box.raise_lower_bound(1, true, 1, 1);
+ box.lower_upper_bound(1, true, 3, 1);
+
+ Bounding_Box known_box(box);
+
+ Grid gr(2, EMPTY);
+ gr.add_generator(grid_point(B));
+ gr.add_generator(grid_point(3*A + B));
+ gr.add_generator(grid_point(3*A + 3*B));
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// Skew grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 3, 2);
+ box.lower_upper_bound(0, true, 4, 2);
+ box.raise_lower_bound(1, true, 7, 1);
+ box.lower_upper_bound(1, true, 8, 1);
+
+ Bounding_Box known_box(box);
+
+ Grid gr(2, EMPTY);
+ gr.add_generator(grid_point( A + B));
+ gr.add_generator(grid_point(2*A + 3*B));
+ gr.add_generator(grid_point( A + 4*B));
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// Skew grid, with a divisor.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 2);
+ box.lower_upper_bound(0, true, 1, 2);
+ box.raise_lower_bound(1, true, 0, 2);
+ box.lower_upper_bound(1, true, 2, 2);
+
+ Grid gr(2, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(2*A));
+ gr.add_generator(grid_point( A + 2*B, 2));
+
+ Bounding_Box known_box(box);
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+ return ok;
+}
+
+// Grid containing a line.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box(3);
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_line(A + 2*B));
+ gr.add_generator(grid_point(C, 2));
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ Bounding_Box known_box(3);
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test05() {
+ Bounding_Box box(3);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.lower_upper_bound(0, true, 0, 1);
+
+ Grid gr(3);
+
+ Bounding_Box known_box(box);
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// Grid which is a single point.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(3);
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point(16*A + 6*B - 6*C, 7));
+
+ gr.shrink_bounding_box(box1);
+ nout << "*** box1 ***" << endl << box1 << endl;
+
+ Bounding_Box known_box(3);
+ known_box.raise_lower_bound(0, true, 16, 7);
+ known_box.lower_upper_bound(0, true, 16, 7);
+ known_box.raise_lower_bound(1, true, 6, 7);
+ known_box.lower_upper_bound(1, true, 6, 7);
+ known_box.raise_lower_bound(2, true, -6, 7);
+ known_box.lower_upper_bound(2, true, -6, 7);
+
+ bool ok = (box1 == known_box);
+ if (ok) {
+ Grid tem_gr(box1, From_Bounding_Box());
+ Bounding_Box box2(3);
+
+ tem_gr.shrink_bounding_box(box2);
+ nout << "*** box2 ***" << endl << box2 << endl;
+
+ ok = (box2 == known_box);
+ }
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box2) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test07() {
+ Bounding_Box box1(3);
+
+ Grid gr(3, EMPTY);
+
+ gr.shrink_bounding_box(box1);
+ nout << "*** box1 ***" << endl << box1 << endl;
+
+ Bounding_Box known_box(3);
+ known_box.set_empty();
+
+ bool ok = (box1 == known_box);
+ if (ok) {
+ Grid tem_gr(box1, From_Bounding_Box());
+ Bounding_Box box2(3);
+
+ tem_gr.shrink_bounding_box(box2);
+ nout << "*** box2 ***" << endl << box2 << endl;
+
+ ok = (box2 == known_box);
+ }
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box2) ***");
+
+ return ok;
+}
+
+// A grid with redundant generators.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(3);
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A + B));
+ gr.add_generator(grid_point(A));
+ gr.add_generator(grid_point(2*A));
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ Bounding_Box known_box(3);
+ known_box.lower_upper_bound(2, true, 0, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// A grid defined by congruences.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box(3);
+
+ Grid gr(3);
+ gr.add_congruence((A + 2*C %= 0) / 2);
+ gr.add_congruence((A %= 0) / 5);
+ gr.add_congruence(2*B == 3);
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ Bounding_Box known_box(3);
+ known_box.raise_lower_bound(1, true, 3, 2);
+ known_box.lower_upper_bound(1, true, 3, 2);
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// An otherwise valid box having a dimension with an open bound, where
+// the open bound makes the box empty.
+bool
+test10() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 3, 7);
+ box.lower_upper_bound(0, true, 3, 7);
+ box.raise_lower_bound(1, false, 1, 2);
+ box.lower_upper_bound(1, true, 1, 2);
+
+ Grid gr(3);
+
+ try {
+ gr.shrink_bounding_box(box);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// An empty grid defined by congruences.
+bool
+test11() {
+ Variable A(0);
+
+ Bounding_Box box1(3);
+
+ Grid gr(3);
+ gr.add_congruence((A %= 0) / 2);
+ gr.add_congruence((A %= 1) / 2);
+
+ gr.shrink_bounding_box(box1);
+ nout << "*** box1 ***" << endl << box1 << endl;
+
+ Bounding_Box known_box(3);
+ known_box.set_empty();
+
+ bool ok = (box1 == known_box);
+ if (ok) {
+ Grid tem_gr(box1, From_Bounding_Box());
+ Bounding_Box box2(3);
+
+ tem_gr.shrink_bounding_box(box2);
+ nout << "*** box2 ***" << endl << box2 << endl;
+
+ ok = (box2 == known_box);
+ }
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box2) ***");
+
+ 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);
+
+ Bounding_Box box1(4);
+
+ Grid gr(4, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator(grid_point(C));
+ gr.add_generator(grid_point(D));
+
+ print_generators(gr, "*** gr ***");
+
+ gr.shrink_bounding_box(box1);
+ nout << "*** box1 ***" << endl << box1 << endl;
+
+ Bounding_Box known_box(4);
+ known_box.lower_upper_bound(1, true, 0, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(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);
+
+ Bounding_Box box(4);
+
+ Grid gr(4, EMPTY);
+ gr.add_generator(grid_point( A + 2*B + 4*C, 4));
+ gr.add_generator(grid_point(2*A + 2*B + 4*C, 4));
+ gr.add_generator(grid_point( A + 2*B + 4*C + D, 4));
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ Bounding_Box known_box(4);
+ known_box.lower_upper_bound(1, true, 1, 2);
+ known_box.raise_lower_bound(1, true, 1, 2);
+ known_box.lower_upper_bound(2, true, 1, 1);
+ known_box.raise_lower_bound(2, true, 1, 1);
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// Zero dimension empty grid.
+bool
+test14() {
+ Bounding_Box box(0);
+
+ Grid gr(0, EMPTY);
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ Bounding_Box known_box(0);
+ known_box.set_empty();
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_box(box) ***");
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test15() {
+ Bounding_Box box(0);
+
+ Grid gr(0);
+
+ gr.shrink_bounding_box(box);
+ nout << "*** box ***" << endl << box << endl;
+
+ Bounding_Box known_box(0);
+
+ bool ok = (box == known_box);
+
+ print_congruences(gr,
+ "*** gr.shrink_bounding_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);
+ 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/bounds1.cc b/tests/Grid/bounds1.cc
new file mode 100644
index 0000000..26b15d9
--- /dev/null
+++ b/tests/Grid/bounds1.cc
@@ -0,0 +1,441 @@
+/* Test Grid::bounds_from_above() and Grid::bounds_from_below().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator_and_minimize(grid_point(3*A + 2*B, 3));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B, 3));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(A == 1);
+ gr_cgs_needs_min.add_congruence(3*B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(grid_line(B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(A == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(grid_line(2*A + B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(2*A + B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(A - 2*B == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(grid_line(A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(2*A - B == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(grid_point(A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(2*A - B == 0);
+ gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(A));
+ gr_gs_min.add_generator_and_minimize(grid_line(B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(A));
+ gr_gs_needs_min.add_generator(grid_line(B));
+
+ Grid gr_cgs_needs_min(2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(A));
+ gr_gs_min.add_generator_and_minimize(grid_point(B + C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(A));
+ gr_gs_needs_min.add_generator(grid_point(B + C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(B - C == 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(3*B + C));
+ gr_gs_min.add_generator_and_minimize(grid_line(A - 2*B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(3*B + C));
+ gr_gs_needs_min.add_generator(grid_line(A - 2*B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(2*A + B - 3*C == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator_and_minimize(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_gs_needs_min(6, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(7*A - 11*B + 19*F));
+
+ Grid gr_cgs_needs_min(6);
+ gr_cgs_needs_min.add_congruence(A == 7);
+ gr_cgs_needs_min.add_congruence(B == -11);
+ gr_cgs_needs_min.add_congruence(C == 0);
+ gr_cgs_needs_min.add_congruence(D == 0);
+ gr_cgs_needs_min.add_congruence(E == 0);
+ gr_cgs_needs_min.add_congruence(F == 19);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/certificate1.cc b/tests/Grid/certificate1.cc
new file mode 100644
index 0000000..03acf29
--- /dev/null
+++ b/tests/Grid/certificate1.cc
@@ -0,0 +1,228 @@
+/* Test class Grid_Certificate.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_congruence(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point(3*B + A));
+ gr2.add_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_congruence(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point(3*B + A));
+ gr2.add_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_congruence(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point(3*B));
+ gr2.add_generator(grid_line(A - C));
+ gr2.add_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_generator(grid_point(3*B + A));
+ gr1.add_generator(grid_point(3*B + A + C));
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3);
+ gr2.add_congruence(A + C %= 0);
+ gr2.add_congruence(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_congruence(B == 3);
+
+ Grid_Certificate grc1(gr1);
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point(3*B + A + C));
+ gr2.add_generator_and_minimize(grid_point(3*B + A));
+
+ // Ensure up to date congruences and minimized generators.
+ gr2.affine_image(A, 1*A);
+ gr2.minimized_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..81f432b
--- /dev/null
+++ b/tests/Grid/concatenate1.cc
@@ -0,0 +1,341 @@
+/* Test Grid::concatenate_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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((C %= 0) / 1);
+ known_cgs.insert((B == 0) / 0);
+ 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
+test10() {
+ 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_embed(Grid::max_space_dimension() - 1);
+ print_congruences(gr2, "*** gr2 ***");
+
+ try {
+ gr1.concatenate_assign(gr2);
+ }
+ catch (const std::length_error& e) {
+ nout << "max_space_dimension_exceeded: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/congruence1.cc b/tests/Grid/congruence1.cc
new file mode 100644
index 0000000..be273a7
--- /dev/null
+++ b/tests/Grid/congruence1.cc
@@ -0,0 +1,377 @@
+/* Test class Congruence.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.
+static 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.
+static 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.
+static 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.
+static 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.
+static 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).
+static 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.
+static 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.
+static 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 `/='.
+static 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_trivial_true and is_trivial_false.
+static 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_trivial_true()) && (!a.is_trivial_false());
+
+ 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_trivial_true()
+ && !a.is_trivial_false();
+
+ a = Test_Congruence((0*A + 0*B + 8 %= 0) / 4);
+ ok &= a.is_trivial_true()
+ && !a.is_trivial_false();
+
+ 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_trivial_true()
+ && a.is_trivial_false();
+
+ 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_trivial_true()
+ && a.is_trivial_false();
+
+ 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_trivial_true()
+ && a.is_trivial_false();
+
+ print_congruence(a, "*** a = Test_Congruence((0*A + 0*B + 4 %= 0) / 3) ***");
+
+ return ok;
+}
+
+// Negative moduli.
+static 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.
+
+static bool
+test12() {
+ Variable x0(0);
+ Variable x1(1);
+ Variable x2(2);
+ Variable x3(3);
+ Variable x4(4);
+
+ Test_Congruence a((-x0 + 4*x1 + 3*x2 + 17*x3 + 2*x4 %= -4) / -3);
+ a.strong_normalize();
+
+ Test_Congruence b((-x0 + 4*x1 %= - 3*x2 - 17*x3 - 2*x4 - 4) / -3);
+ b.strong_normalize();
+
+ bool ok (a == b);
+
+ print_congruence(a, "*** a ***");
+ print_congruence(b, "*** b ***");
+
+ return ok;
+}
+
+// Create from empty linear expression.
+static 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;
+}
+
+// Space dimension exception.
+static bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ 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;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/congruences1.cc b/tests/Grid/congruences1.cc
new file mode 100644
index 0000000..b827194
--- /dev/null
+++ b/tests/Grid/congruences1.cc
@@ -0,0 +1,213 @@
+/* Test Grid::congruences().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point(10*B));
+ gr1.add_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_and_minimize(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;
+}
+
+} // 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/congruencesystem1.cc b/tests/Grid/congruencesystem1.cc
new file mode 100644
index 0000000..bef0083
--- /dev/null
+++ b/tests/Grid/congruencesystem1.cc
@@ -0,0 +1,419 @@
+/* Test Congruence_System::satisfies_all_congruences().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 PASS_EXPECTED is true:
+ If the first generator in GS satifies CGS, then return true, else
+ print an error message and return false.
+
+ And, symmetrically, if PASS_EXPECTED is false:
+ If the first generator in GS fails to satify CGS, then return
+ false, else print an error message and return true.
+
+ FIXME: If Generator::ascii_dump was public this could take a
+ Generator.
+*/
+bool
+fulfils(const Grid_Generator_System& gs,
+ const Test_Congruence_System& cgs,
+ bool pass_expected = false) {
+ Grid_Generator_System::const_iterator gi = gs.begin();
+
+ if (cgs.satisfies_all_congruences(*gi) == pass_expected)
+ return pass_expected;
+
+ nout << *gi << " should";
+ pass_expected || nout << "fail to";
+ nout << " satisfy " << cgs << "." << endl
+ << "ASCII dump of system holding " << *gi << ":" << endl;
+ gs.ascii_dump(nout);
+ nout << "ASCII dump of " << cgs << ":" << endl;
+ cgs.ascii_dump(nout);
+
+ return !pass_expected;
+}
+
+#define satisfies fulfils
+
+inline bool
+fails_to_satisfy(const Grid_Generator_System& gs,
+ const Congruence_System& cgs) {
+ if (fulfils(gs, cgs, true))
+ return false;
+ return true;
+}
+
+// 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) ***");
+
+ Grid_Generator_System gs0;
+
+ // Points.
+
+ gs0.insert(grid_point());
+ bool ok = (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0, "*** gs0.insert(grid_point()) ***");
+
+ gs0.clear();
+ gs0.insert(grid_point(A + B));
+ ok &= (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(A + B)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_point(A + 2*B));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(A + 2*B)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_point(5*A + 2*B));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(5*A + 2*B)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_point(5*A - 2*B));
+ ok &= (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(5*A - 2*B)) ***");
+
+ // Parameters.
+
+ gs0.clear();
+ gs0.insert(parameter(3*A + 3*B));
+ ok &= (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(parameter(3*A + 3*B)) ***");
+
+ gs0.clear();
+ gs0.insert(parameter(A + 14*B));
+ ok &= (satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(parameter(A + 14*B)) ***");
+
+ gs0.clear();
+ gs0.insert(parameter(-A + 13*B));
+ ok = (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(parameter(-A + 13*B)) ***");
+
+ // Lines.
+
+ gs0.clear();
+ gs0.insert(grid_line(13*A + 13*B));
+ ok = (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(13*A + 13*B)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_line(18*A + 14*B));
+ ok = (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(18*A + 14*B)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_line(14*A - 21*B));
+ ok = (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(14*A - 21*B)) ***");
+
+ cgs0.clear();
+ cgs0.insert((A %= 0) / 2);
+ gs0.clear();
+ gs0.insert(grid_line(3*A));
+ ok = (!satisfies(gs0, cgs0));
+ print_congruences(cgs0,
+ "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(3*A)) ***");
+
+ 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) ***");
+
+ Grid_Generator_System gs0;
+
+ // Points.
+ gs0.clear();
+ gs0.insert(grid_point(A + B, 3));
+ bool ok = (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(A + B, 3)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_point(A + 2*B, 3));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(A + 2*B, 3)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_point(5*A + 2*B, 5));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(5*A + 2*B, 5)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_point(5*A - 2*B, 7));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_point(5*A - 2*B, 7)) ***");
+
+ // Parameters.
+
+ gs0.clear();
+ gs0.insert(parameter(3*A + 3*B, 4));
+ ok &= (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(parameter(3*A + 3*B, 4)) ***");
+
+ gs0.clear();
+ gs0.insert(parameter(A + 14*B, 5));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(parameter(A + 14*B, 5)) ***");
+
+ gs0.clear();
+ gs0.insert(parameter(-A + 13*B, 2));
+ ok &= (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(parameter(-A + 13*B, 2)) ***");
+
+ // Lines.
+
+ gs0.clear();
+ gs0.insert(grid_line(13*A + 13*B));
+ ok &= (!fails_to_satisfy(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(13*A + 13*B)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_line(18*A + 14*B));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(18*A + 14*B)) ***");
+
+ gs0.clear();
+ gs0.insert(grid_line(14*A - 21*B));
+ ok &= (!satisfies(gs0, cgs0));
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(14*A - 21*B)) ***");
+
+ cgs0.clear();
+ cgs0.insert((A %= 0) / 2);
+ gs0.clear();
+ gs0.insert(grid_line(3*A));
+ ok &= (!satisfies(gs0, cgs0));
+ print_congruences(cgs0,
+ "*** cgs0.clear(); cgs0.insert((A %= 0) / 2) ***");
+ print_generators(gs0,
+ "*** gs0.clear(); gs0.insert(grid_line(3*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);
+END_MAIN
diff --git a/tests/Grid/contains1.cc b/tests/Grid/contains1.cc
new file mode 100644
index 0000000..4791e85
--- /dev/null
+++ b/tests/Grid/contains1.cc
@@ -0,0 +1,213 @@
+/* Test Grid::contains().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point());
+ gr2.add_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_generator(grid_point());
+ gr1.add_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_generator(grid_point());
+
+ Grid gr2(1, EMPTY);
+ gr2.add_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_generator(grid_point());
+
+ Grid gr2(21, EMPTY);
+
+ try {
+ gr1.contains(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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
diff --git a/tests/Grid/copyconstruct1.cc b/tests/Grid/copyconstruct1.cc
new file mode 100644
index 0000000..dd7699b
--- /dev/null
+++ b/tests/Grid/copyconstruct1.cc
@@ -0,0 +1,70 @@
+/* Test copy construction of grids.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// 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 = gr;
+ print_congruences(gr_copy, "*** gr_copy ***");
+
+ Grid known_gr(dim);
+
+ ok &= (gr_copy == known_gr);
+ if (ok) {
+
+ // Empty.
+
+ gr = Grid(dim, EMPTY);
+ print_generators(gr, "*** gr ***");
+
+ Grid gr_copy = gr;
+ print_generators(gr_copy, "*** gr_copy ***");
+
+ Grid known_gr(dim, EMPTY);
+
+ ok &= (gr_copy == known_gr);
+ }
+ };
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Grid/coveringbox1.cc b/tests/Grid/coveringbox1.cc
new file mode 100644
index 0000000..9097e2b
--- /dev/null
+++ b/tests/Grid/coveringbox1.cc
@@ -0,0 +1,305 @@
+/* Test Grid(Box& box, From_Covering_Box()).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+// This constructor is also tested via coveringbox2.cc.
+
+#include "ppl_test.hh"
+
+namespace {
+
+#define SPACE_DIM 2
+
+// Universe box.
+bool
+test01() {
+ Bounding_Box box(SPACE_DIM);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(SPACE_DIM, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// The box is the positive quadrant.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(SPACE_DIM);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.raise_lower_bound(1, true, 0, 1);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(SPACE_DIM);
+ known_gr.add_congruence(A == 0);
+ known_gr.add_congruence(B == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// A bounded box in 2D.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(SPACE_DIM);
+ box.raise_lower_bound(0, true, -2, 3);
+ box.lower_upper_bound(0, true, 4, 1);
+ box.raise_lower_bound(1, true, -10, 1);
+ box.lower_upper_bound(1, true, 12, 3);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(SPACE_DIM);
+ known_gr.add_congruence((3*A %= -2) / 14);
+ known_gr.add_congruence((B %= -10) / 14);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// A 3D box which is bounded in 2D.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box(3);
+ box.raise_lower_bound(0, true, -2, 3);
+ box.lower_upper_bound(0, true, 4, 1);
+ box.raise_lower_bound(1, true, -10, 1);
+ box.lower_upper_bound(1, true, 12, 3);
+ box.raise_lower_bound(2, true, 15, 3);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(-2*A - 30*B + 15*C, 3));
+ known_gr.add_generator(grid_point(4*A - 10*B + 5*C));
+ known_gr.add_generator(grid_point(-2*A + 12*B + 15*C, 3));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// Zero-dimensional box.
+bool
+test05() {
+ Bounding_Box box(0);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr;
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// Empty box in 2D.
+bool
+test06() {
+ Bounding_Box box(2);
+ box.set_empty();
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// A box which is a point.
+bool
+test07() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 2, 1);
+ box.lower_upper_bound(0, true, 2, 1);
+ box.raise_lower_bound(1, true, 4, 1);
+ box.lower_upper_bound(1, true, 4, 1);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// Unit square.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.lower_upper_bound(0, true, 1, 1);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(1, true, 1, 1);
+
+ Grid gr(box, From_Covering_Box());
+
+ Congruence_System known_cgs;
+ known_cgs.insert(A %= 0);
+ known_cgs.insert(B %= 0);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// Simple box with divisor.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(1, true, 1, 2);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A == 0);
+ known_gr.add_congruence(2*B %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// Box with a dimension bounded only from above.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box(2);
+ box.lower_upper_bound(0, true, 3, 7);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(1, true, 1, 2);
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(2);
+ known_gr.add_congruence(7*A == 3);
+ known_gr.add_congruence(2*B %= 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_Box()) ***");
+
+ return ok;
+}
+
+// Box with a dimension having an open bound, where the open bound
+// makes the box empty.
+bool
+test11() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(0, true, 3, 7);
+ box.raise_lower_bound(1, false, 1, 2);
+ box.lower_upper_bound(1, true, 1, 2);
+
+ try {
+ Grid gr(box, From_Covering_Box());
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Zero-dimensional empty box.
+bool
+test12() {
+ Bounding_Box box(0);
+ box.set_empty();
+
+ Grid gr(box, From_Covering_Box());
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(box, From_Covering_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);
+END_MAIN
diff --git a/tests/Grid/coveringbox2.cc b/tests/Grid/coveringbox2.cc
new file mode 100644
index 0000000..68bd1a0
--- /dev/null
+++ b/tests/Grid/coveringbox2.cc
@@ -0,0 +1,879 @@
+ /* Test Grid::get_covering_box().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+#define SPACE_DIM 2
+
+bool
+operator==(const Bounding_Box& x, const Bounding_Box& y) {
+ dimension_type dimension = x.space_dimension();
+ if (dimension != y.space_dimension())
+ return false;
+
+ if (x.is_empty() && y.is_empty())
+ return true;
+
+ if (x.is_empty() || y.is_empty())
+ return false;
+
+ TEMP_INTEGER(n_x);
+ TEMP_INTEGER(n_y);
+ TEMP_INTEGER(d_x);
+ TEMP_INTEGER(d_y);
+
+ for (dimension_type i = dimension; i-- > 0; ) {
+ bool tem;
+ bool x_closed = x.get_lower_bound(i, tem, n_x, d_x);
+ bool y_closed = y.get_lower_bound(i, tem, n_y, d_y);
+ if (x_closed == y_closed) {
+ if (x_closed && (n_x != n_y || d_x != d_y))
+ return false;
+ }
+ else
+ return false;
+ x_closed = x.get_upper_bound(i, tem, n_x, d_x);
+ y_closed = y.get_upper_bound(i, tem, n_y, d_y);
+ if (x_closed == y_closed) {
+ if (x_closed && (n_x != n_y || d_x != d_y))
+ return false;
+ }
+ else
+ return false;
+ }
+
+ return true;
+}
+
+// Rectilinear grid defined by points with the origin
+// not a point of the grid or a point of the covering box..
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point(B));
+ gr.add_generator(grid_point(3*A + B));
+ gr.add_generator(grid_point(3*A + 3*B));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 3, 1);
+ known_box.raise_lower_bound(1, true, 1, 1);
+ known_box.lower_upper_bound(1, true, 3, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Skew grid.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point( A + B));
+ gr.add_generator(grid_point(2*A + 3*B));
+ gr.add_generator(grid_point( A + 4*B));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 1, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 1, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Skew grid, with a divisor.
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(2*A));
+ gr.add_generator(grid_point( A + 2*B, 2));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 2);
+ known_box.lower_upper_bound(0, true, 1, 2);
+ known_box.raise_lower_bound(1, true, 0, 2);
+ known_box.lower_upper_bound(1, true, 2, 2);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 3
+
+// Grid containing a line.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_line(A + 2*B));
+ gr.add_generator(grid_point(C, 2));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 0, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 0, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 1, 2);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Universe grid.
+bool
+test05() {
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM);
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 0, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 0, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 0, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_congruences(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Grid which is a single point.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point(16*A + 6*B - 6*C, 7));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 16, 7);
+ known_box.raise_lower_bound(1, true, 6, 7);
+ known_box.raise_lower_bound(2, true, -6, 7);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test07() {
+ Bounding_Box box1(SPACE_DIM);
+ // Set bounds, to check that get_covering_box clears them.
+ box1.raise_lower_bound(0, true, 16, 7);
+ box1.raise_lower_bound(1, true, 6, 7);
+ box1.raise_lower_bound(2, true, -6, 7);
+
+ Grid gr(SPACE_DIM, EMPTY);
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.set_empty();
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+
+ Bounding_Box box2(SPACE_DIM);
+ // Set bounds, to check that get_covering_box clears them.
+ box2.raise_lower_bound(0, true, 1, 3);
+ box2.raise_lower_bound(1, true, 2, 2);
+ box2.raise_lower_bound(2, true, 3, 1);
+
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// A grid which get_covering_box has to minimize.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A + B));
+ gr.add_generator(grid_point(A));
+ gr.add_generator(grid_point(2*A));
+ gr.add_generator(grid_point(C));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 1, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 1, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 1, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// A grid defined by congruences.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM);
+ gr.add_congruence((A + 2*B %= 0) / 2);
+ gr.add_congruence((A %= 0) / 5);
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 5, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 1, 2);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 0, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Grid where the only line is the final generator.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator(grid_point(B));
+ gr.add_generator(grid_line(C));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 1, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 1, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 0, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 4
+
+// A grid where, for a particular dimension (D), many coefficients
+// between the first and last rows contribute towards the size of the
+// resulting interval.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A + 2*D));
+ gr.add_generator(grid_point(B + 4*D));
+ gr.add_generator(grid_point(C + 8*D));
+ gr.add_generator(grid_point(16*D));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 1, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 1, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 1, 1);
+ known_box.raise_lower_bound(3, true, 0, 1);
+ known_box.lower_upper_bound(3, true, 2, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// A 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);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator(grid_point(C));
+ gr.add_generator(grid_point(D));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 1, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 1, 1);
+ known_box.raise_lower_bound(3, true, 0, 1);
+ known_box.lower_upper_bound(3, true, 1, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// An empty grid defined by congruences.
+bool
+test13() {
+ Variable A(0);
+
+ Bounding_Box box1(SPACE_DIM);
+ // Set bounds, to check that get_covering_box clears them.
+ box1.raise_lower_bound(0, true, 1, 7);
+ box1.raise_lower_bound(1, true, 2, 7);
+ box1.raise_lower_bound(2, true, 3, 7);
+
+ Grid gr(SPACE_DIM);
+ gr.add_congruence((A %= 0) / 2);
+ gr.add_congruence((A %= 1) / 2);
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.set_empty();
+
+ bool ok = (box1 == known_box);
+
+ print_congruences(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+
+ Bounding_Box box2(SPACE_DIM);
+ // Set bounds, to check that get_covering_box clears them.
+ box2.raise_lower_bound(0, true, 3, 7);
+ box2.raise_lower_bound(1, true, 1, 7);
+ box2.raise_lower_bound(2, true, 2, 7);
+
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Grid which is a single point, with a divisor, such that the
+// fractions for some intervals (B and C) will be reduced before being
+// assigned to the intervals.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point(16*A + 14*B - 7*C, 7));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 16, 7);
+ known_box.raise_lower_bound(1, true, 2, 1);
+ known_box.raise_lower_bound(2, true, -1, 1);
+ known_box.raise_lower_bound(3, true, 0, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Many-pointed grid, with a divisor, such that the fractions for some
+// intervals (B and C) will be reduced before being assigned to the
+// intervals.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A, 6));
+ gr.add_generator(grid_point(B, 3));
+ gr.add_generator(grid_point(C, 2));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 1, 6);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 1, 3);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 1, 2);
+ known_box.raise_lower_bound(3, true, 0, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 0
+
+// Zero dimension empty grid.
+bool
+test16() {
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.set_empty();
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+// Zero dimension universe grid.
+bool
+test17() {
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM);
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+
+ bool ok = (box1 == known_box);
+
+ print_congruences(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 2
+
+// Rectilinear grid as in test01 but this time
+// defined by a point and 2 parameters.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point(B));
+ gr.add_generator(parameter(3*A));
+ gr.add_generator(parameter(3*A + 2*B));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 3, 1);
+ known_box.raise_lower_bound(1, true, 1, 1);
+ known_box.lower_upper_bound(1, true, 3, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << box2;
+ }
+
+ return ok;
+}
+
+#undef SPACE_DIM
+#define SPACE_DIM 4
+
+// 4D grid defined with points and parameters.
+bool
+test19() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Bounding_Box box1(SPACE_DIM);
+
+ Grid gr(SPACE_DIM, EMPTY);
+ gr.add_generator(grid_point(A));
+ gr.add_generator(grid_point(7*A));
+ gr.add_generator(parameter(5*B-3*A));
+ gr.add_generator(parameter(3*A));
+ gr.add_generator(grid_point(C+A));
+
+ gr.get_covering_box(box1);
+
+ Bounding_Box known_box(SPACE_DIM);
+ known_box.raise_lower_bound(0, true, 1, 1);
+ known_box.lower_upper_bound(0, true, 4, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 5, 1);
+ known_box.raise_lower_bound(2, true, 0, 1);
+ known_box.lower_upper_bound(2, true, 1, 1);
+ known_box.raise_lower_bound(3, true, 0, 1);
+
+ bool ok = (box1 == known_box);
+
+ print_generators(gr, "*** gr ***");
+ nout << "box1:" << endl << box1;
+
+ if (ok) {
+ Grid tem_gr(box1, From_Covering_Box());
+ Bounding_Box box2(SPACE_DIM);
+ tem_gr.get_covering_box(box2);
+
+ ok = (box2 == known_box);
+
+ nout << "box2:" << endl << 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);
+ DO_TEST(test16);
+ DO_TEST(test17);
+ DO_TEST(test18);
+ DO_TEST(test19);
+END_MAIN
diff --git a/tests/Grid/discrete1.cc b/tests/Grid/discrete1.cc
new file mode 100644
index 0000000..1154679
--- /dev/null
+++ b/tests/Grid/discrete1.cc
@@ -0,0 +1,342 @@
+/* Test Grid::is_pointed().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator_and_minimize(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ Grid gr_cgs_min(3);
+ gr_cgs_min.add_congruence(A == 3);
+ gr_cgs_min.add_congruence(B == 2);
+ // Minimize the congruences.
+ gr_cgs_min.minimized_congruences();
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+ assert(copy_compare(gr_cgs_needs_min, gr_cgs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_congruence(C == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator(grid_point(3*A + B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator(grid_line(C));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_generator(grid_line(C));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_congruence(A == 0);
+ gr_cgs_needs_min.add_congruence(D == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_congruence(A == 1);
+ gr.add_congruence(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..c1eaf1d
--- /dev/null
+++ b/tests/Grid/disjoint1.cc
@@ -0,0 +1,234 @@
+/* Test Grid::is_disjoint_from().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point(C));
+ gr2.add_generator(grid_line(A + B));
+ gr2.add_generator(grid_point(C + B));
+ gr2.add_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_generator(grid_point(A + B + C));
+ gr1.add_generator(grid_point(3*A + 3*B + 3*C));
+
+ Grid gr2(3);
+ gr2.add_congruence(A - B %= 0);
+ gr2.add_congruence(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_generator(grid_point(A + B + C));
+ gr1.add_generator(grid_line(3*A + 3*B + 3*C));
+
+ Grid gr2(3);
+ gr2.add_congruence(A - B %= 0);
+ gr2.add_congruence(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_generator(grid_point());
+ gr1.minimized_generators();
+
+ Grid gr2(1, EMPTY);
+ gr2.add_generator(grid_point(A));
+ gr2.minimized_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_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;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/equals1.cc b/tests/Grid/equals1.cc
new file mode 100644
index 0000000..42862ed
--- /dev/null
+++ b/tests/Grid/equals1.cc
@@ -0,0 +1,253 @@
+/* Test operator==(const Grid&, const Grid&)
+ and operator!=(const Grid&, const Grid&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grids the same, gr defined by generatorss 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_congruence(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_generator(grid_point());
+
+ gr1.minimized_generators();
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point());
+ gr2.add_generator(grid_line(A));
+
+ gr2.minimized_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_generator(grid_point());
+ gr1.add_generator(parameter(B));
+
+ gr1.minimized_generators();
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point());
+ gr2.add_generator(grid_line(A));
+
+ gr2.minimized_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_generator(grid_point());
+ gr1.add_generator(parameter(A));
+ gr1.add_generator(parameter(B));
+ gr1.add_generator(parameter(C));
+
+ gr1.minimized_generators();
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point());
+ gr2.add_generator(parameter(2*A));
+ gr2.add_generator(parameter(2*B));
+ gr2.add_generator(parameter(2*C));
+
+ gr2.minimized_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);
+END_MAIN
diff --git a/tests/Grid/expandspacedim1.cc b/tests/Grid/expandspacedim1.cc
new file mode 100644
index 0000000..fc1f423
--- /dev/null
+++ b/tests/Grid/expandspacedim1.cc
@@ -0,0 +1,238 @@
+/* Test Grid::expand_space_dimension().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point(A));
+ gr.add_generator(grid_point(A + 2*B));
+ gr.add_generator(grid_point());
+ print_generators(gr, "*** ***");
+
+ gr.expand_space_dimension(A, 1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_point(A + 2*B));
+ known_gr.add_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_congruence(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_congruence(2*C == 1);
+ known_gr.add_congruence(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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ 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
diff --git a/tests/Grid/foldspacedims1.cc b/tests/Grid/foldspacedims1.cc
new file mode 100644
index 0000000..a244896
--- /dev/null
+++ b/tests/Grid/foldspacedims1.cc
@@ -0,0 +1,400 @@
+/* Test Grid::fold_space_dimensions().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point(A + 2*B + 2*C));
+ gr.add_generator(grid_point(A + 2*B + 4*C));
+ gr.add_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_generator(grid_point(A + 2*B));
+ known_gr.add_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_congruence(A - B == 0);
+ gr.add_congruence(A %= 0);
+ gr.add_congruence(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 parameer 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/generalizedaffineimage1.cc b/tests/Grid/generalizedaffineimage1.cc
new file mode 100644
index 0000000..292fbb2
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage1.cc
@@ -0,0 +1,555 @@
+/* Test Grid::generalized_affine_image(var, ...).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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, Linear_Expression::zero(), 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, 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, Linear_Expression::zero(), 2);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_point(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, Linear_Expression::zero(), 2) ***");
+
+ 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, A + 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A - B));
+ known_gr.add_generator(grid_point(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(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(B, A + 1, 2);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(B, 2));
+ known_gr.add_generator(grid_point(B + A));
+ known_gr.add_generator(grid_point(3*B, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, A + 1, 2) ***");
+
+ 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, A + 1, 2, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(B, 2));
+ known_gr.add_generator(grid_point(A + B));
+ known_gr.add_generator(grid_point(7*B, 2));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, 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, A + 2, -2);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(-B));
+ known_gr.add_generator(grid_point(-3*B + 2*A, 2));
+ known_gr.add_generator(grid_point(-2*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, A + 2, -2) ***");
+
+ 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, A + 2, 1, -7);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(2*B));
+ known_gr.add_generator(grid_point(A + 3*B));
+ known_gr.add_generator(grid_point(9*B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(B, 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, A - C + 2, 1, 5);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(2*A));
+ known_gr.add_generator(grid_point(2*A + 3*B));
+ known_gr.add_generator(grid_line(A + C));
+ known_gr.add_generator(grid_point(4*A)); // Original modulus.
+ known_gr.add_generator(grid_point(7*A)); // Transformation modulus.
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, 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, 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, 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, A - 2*C + 3, 4, 7);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_generators(gr,
+ "*** gr.generalized_affine_image(A, A - 2*C + 3, 4, 7) ***");
+
+ return ok;
+}
+
+// Empty with congruences.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_congruence(A == 0);
+ gr.add_congruence(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, A + 2);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, A + 2) ***");
+
+ return ok;
+}
+
+// Universe.
+bool
+test12() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A, A + 2);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A, A + 2) ***");
+
+ 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, A + 2, 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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_congruence(A - 2*B == 1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B + C, 2*A - B - C, 5);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B + C, 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_congruence(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B, 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, 2*A - 2*B, 5) ***");
+
+ return ok;
+}
+
+// Expressions having common variables.
+bool
+test18() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(2*A - 2*B, 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, 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, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+ 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..9ec43d3
--- /dev/null
+++ b/tests/Grid/generalizedaffineimage2.cc
@@ -0,0 +1,552 @@
+/* Test Grid::generalized_affine_image(lhs, rhs, modulus).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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, Linear_Expression::zero(), 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_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, Linear_Expression::zero());
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_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, A + 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A - B));
+ known_gr.add_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, A + 1);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_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, A + 1, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(B, 2));
+ known_gr.add_generator(grid_point(A + B));
+ known_gr.add_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, A + 1, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(B, 2));
+ known_gr.add_generator(grid_point(A + B));
+ known_gr.add_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, A + 2);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(-B, 2));
+ known_gr.add_generator(grid_point(2*A + -3*B, 2));
+ known_gr.add_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, A + 2, -7);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(2*B));
+ known_gr.add_generator(grid_point(A + 3*B));
+ known_gr.add_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, A - C + 2, 5);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(2*A));
+ known_gr.add_generator(grid_point(2*A + 3*B));
+ known_gr.add_generator(grid_line(A + C));
+ known_gr.add_generator(grid_point(4*A)); // Original modulus.
+ known_gr.add_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, 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, 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_congruence(A == 0);
+ gr.add_congruence(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(1*A, A + 2);
+
+ 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, A + 2);
+
+ 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(),
+ Linear_Expression(1));
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(Linear_Expression::zero(), Linear_Expression(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(), A - B, 5);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A + B));
+ known_gr.add_generator(grid_point(5*A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(Linear_Expression::zero(), 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_congruence(A - B == 0);
+ gr.add_congruence((C %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B, C);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_line(A + B));
+ known_gr.add_generator(grid_point(B));
+ known_gr.add_generator(grid_point(3*C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B, C) ***");
+
+ return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - B, A, 0);
+
+ Grid known_gr(2);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - B, A, 0) ***");
+
+ 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, A - B, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(B, 2));
+ known_gr.add_generator(grid_line(2*A - B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A + 2*B, 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_congruence(C == 0);
+ gr.add_congruence(A + 3*B == 2);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_image(A - C, B + 3, 0);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(A - C == B + 3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_image(A - C, 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/generalizedaffinepreimage1.cc b/tests/Grid/generalizedaffinepreimage1.cc
new file mode 100644
index 0000000..5da113d
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage1.cc
@@ -0,0 +1,514 @@
+/* Test Grid::generalized_affine_preimage(var, ...).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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, Linear_Expression::zero(), 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1,
+ "*** gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0 ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 2);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2,
+ "*** gr2.generalized_affine_preimage(B, 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, Linear_Expression::zero(), 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1,
+ "*** gr1.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 0) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, Linear_Expression::zero(), 1, 3);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2,
+ "*** gr2.generalized_affine_preimage(B, 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, A + 1, 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(-A));
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1,
+ "*** gr1.generalized_affine_preimage(B, A + 1, 1, 0) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ known_gr.add_generator(grid_point());
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, A + 1, 1, -7);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2,
+ "*** gr2.generalized_affine_preimage(B, 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, A + 1, 2, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(-3*A));
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1,
+ "*** gr1.generalized_affine_preimage(B, A + 1, 2, 0) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ known_gr.add_generator(grid_point(-A));
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, A + 1, 2, 3);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2,
+ "*** gr2.generalized_affine_preimage(B, 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, A + 2, -2, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(-2*A));
+ known_gr.add_generator(grid_point(2*A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1,
+ "*** gr1.generalized_affine_preimage(B, A + 2, -2, 0) ***");
+
+ if (ok) {
+ print_congruences(gr2, "*** gr2 ***");
+
+ known_gr.add_generator(grid_point());
+
+ // Congruence expression.
+ gr2.generalized_affine_preimage(B, A + 2, -2);
+ ok = (gr2 == known_gr);
+ }
+
+ print_congruences(gr2,
+ "*** gr2.generalized_affine_preimage(B, A + 1, 2, 3) ***");
+
+ 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, A - C + 2, 1, 5);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(2*A));
+ known_gr.add_generator(grid_point(2*A + 3*B));
+ known_gr.add_generator(grid_line(3*A + C));
+ known_gr.add_generator(grid_point(4*A)); // Original modulus.
+ known_gr.add_generator(grid_point(7*A)); // Transformation modulus.
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, 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, 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, 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, A - 2*C + 3, 4, 7);
+
+ Grid known_gr(5, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, A - 2*C + 3, 4, 7) ***");
+
+ return ok;
+}
+
+// Empty with congruences.
+bool
+test09() {
+ Variable A(0);
+
+ Grid gr(1);
+ gr.add_congruence(A == 0);
+ gr.add_congruence(A == 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, A + 2);
+
+ Grid known_gr(1, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, A + 2) ***");
+
+ return ok;
+}
+
+// Universe.
+bool
+test10() {
+ Variable A(0);
+
+ Grid gr(1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A, A + 2);
+
+ Grid known_gr(1);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A, A + 2) ***");
+
+ 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, A + 2, 0);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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, A + B, 1, 0);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(parameter(2*B));
+ known_gr.add_generator(parameter(A + B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(B, 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, A + B, 1, -7);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(parameter(2*B));
+ known_gr.add_generator(parameter(A + B));
+ known_gr.add_generator(parameter(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(B, A + B, 1, -7) ***");
+
+ 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/generalizedaffinepreimage2.cc b/tests/Grid/generalizedaffinepreimage2.cc
new file mode 100644
index 0000000..becf9b6
--- /dev/null
+++ b/tests/Grid/generalizedaffinepreimage2.cc
@@ -0,0 +1,359 @@
+/* Test Grid::generalized_affine_preimage(lhs, rhs, modulus).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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(),
+ Linear_Expression(1));
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_line(B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(Linear_Expression::zero(), Linear_Expression(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(), A - B, 5);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A + B));
+ known_gr.add_generator(grid_point(5*A));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(Linear_Expression::zero(), 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_congruence(A - B == 0);
+ gr.add_congruence((C %= 0) / 3);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, C);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_line(A));
+ known_gr.add_generator(grid_line(B));
+ known_gr.add_generator(grid_point(3*C));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** ***");
+
+ return ok;
+}
+
+// Simple expressions having common variables.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, A, 0);
+
+ Grid known_gr(2);
+ known_gr.add_congruence(A == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B, 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, A - B, 3);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_line(A + B));
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** ***");
+
+ return ok;
+}
+
+// Test0 similar to the test in
+// ppl/test0s/Polyhedron/generalizedaffinepreimage4.cc
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(2, EMPTY);
+ gr.add_generator(grid_point(A + B));
+ gr.add_generator(grid_point(2*A));
+ gr.add_generator(grid_point(2*A + 2*B));
+ gr.add_generator(grid_point(3*A + B));
+
+ Grid known_gr(gr);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(B, 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, A - B, 3) ***");
+
+ return ok;
+}
+
+
+// Expressions having common variables.
+bool
+test07() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C %= 0) / 3);
+ gr.add_congruence(A - 2*B == 1);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B + C, 2*A - B - C, 5);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr,
+ "*** gr.generalized_affine_preimage(A - B + C, 2*A - B - C, 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_congruence(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, 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, 2*A - 2*B, 5) ***");
+
+ return ok;
+}
+
+// Expressions having common variables, where
+// generalized_affine_preimage must minimize the grid.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(2*A - 2*B, 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, A - B, 5) ***");
+
+ 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_preimage(B + C, D + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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_preimage(A + D, A + 2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Expressions having common variables, with a negative modulus.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3);
+ gr.add_congruence((C %= 0) / 3);
+ gr.add_congruence(A - B == 0);
+
+ print_congruences(gr, "*** gr ***");
+
+ gr.generalized_affine_preimage(A - B, 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, 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);
+ DO_TEST(test12);
+END_MAIN
diff --git a/tests/Grid/generator1.cc b/tests/Grid/generator1.cc
new file mode 100644
index 0000000..1f98103
--- /dev/null
+++ b/tests/Grid/generator1.cc
@@ -0,0 +1,209 @@
+/* Test class Grid_Generator.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Point.
+static 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.
+static 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.
+static 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.
+static 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.
+static 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.
+static 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.
+static 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.
+static 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.
+static 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;
+}
+
+} // 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/generators1.cc b/tests/Grid/generators1.cc
new file mode 100644
index 0000000..1efe24a
--- /dev/null
+++ b/tests/Grid/generators1.cc
@@ -0,0 +1,309 @@
+/* Test Grid::generators().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Empty grid.
+bool
+test01() {
+ Grid gr1(7, EMPTY);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.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.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.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.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 C(2);
+ Variable B(1);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_generator(grid_point(3*B));
+ gr1.add_generator(grid_point(5*A + 2*B));
+ gr1.add_generator(grid_point(7*B));
+ gr1.add_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.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.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.generators();
+
+ // Add a point. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_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.generators();
+
+ // Empty the grid. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_congruence_and_minimize(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_congruence(A == 1);
+ gr1.add_congruence(A == 0);
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.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_generator(grid_point(3*B, 2));
+ gr1.add_generator(grid_point(5*A + 2*B));
+ gr1.add_generator(parameter(11*B, 2));
+ gr1.add_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.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_generator(grid_point(3*B));
+ gr1.add_generator(grid_point(5*A + 2*B));
+ gr1.add_generator(parameter(11*B, 2));
+ gr1.add_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.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_generator(grid_point(3*B));
+ gr1.add_generator(grid_point(5*A + 2*B));
+ gr1.add_generator(parameter(11*B));
+ gr1.add_generator(grid_line(C));
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.generators();
+
+ Grid gr2(gs);
+
+ bool ok = (gr2 == known_gr);
+
+ print_generators(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);
+END_MAIN
diff --git a/tests/Grid/grid1.cc b/tests/Grid/grid1.cc
new file mode 100644
index 0000000..4bad322
--- /dev/null
+++ b/tests/Grid/grid1.cc
@@ -0,0 +1,586 @@
+/* Test reduction and conversion of grids created from generators.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_generator_and_minimize, 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_generator_and_minimize(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_generator_and_minimize(grid_point(2*A)) ***");
+
+ return ok;
+}
+
+// add_generator_and_minimize, 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_generator_and_minimize(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_generator_and_minimize(g) ***");
+
+ return ok;
+}
+
+// add_generators_and_minimize
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// test from Chiara conversion_test.cc
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// test1 from Chiara conversion_test.cc.
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// test2 from Chiara conversion_test.cc.
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// test3 from Chiara conversion_test.cc.
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// param_test1 from Chiara Convert_Test.cc.
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// param_test2 from Chiara Convert_Test.cc.
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// param_test3 from Chiara Convert_Test.cc.
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// param_test5 from Chiara Convert_Test.cc.
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// param_test6 from Chiara Convert_Test.cc.
+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_generators_and_minimize(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_generators_and_minimize(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;
+}
+
+// Bigger values (param_test7a from Chiara Convert_Test.cc) -- in
+// grid1_64.cc.
+// Test reduce_line_with_line (param_test9 from Chiara Convert_Test.cc).
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// Grids from a water monitor example (from param_test10 from Chiara
+// Convert_test.cc).
+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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// param_test11 from Chiara Convert_Test.cc.
+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_generators_and_minimize(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_generators_and_minimize(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;
+}
+
+} // 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/grid2.cc b/tests/Grid/grid2.cc
new file mode 100644
index 0000000..e816177
--- /dev/null
+++ b/tests/Grid/grid2.cc
@@ -0,0 +1,558 @@
+/* Test reduction and conversion of grids created from congruences.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// add_congruence_and_minimize, 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_and_minimize(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_and_minimize(cg) ***");
+
+ return ok;
+}
+
+// add_congruence_and_minimize, 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_and_minimize(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_and_minimize(cg) ***");
+
+ return ok;
+}
+
+// add_congruences_and_minimize, 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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// add_congruences_and_minimize, 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_and_minimize(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_recycled_congruences(cgs) ***");
+
+ return ok;
+}
+
+// add_congruences_and_minimize, 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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// cong_test0 from Chiara Convert_Test.cc.
+
+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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// cong_test1 from Chiara Convert_Test.cc.
+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_and_minimize(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 (cong_test2 from Chiara Convert_Test.cc).
+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_and_minimize(cgs);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences_and_minimize(cgs) ***");
+
+ return ok;
+ }
+
+// cong_test3 from Chiara Convert_Test.cc.
+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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// cong_test4 from Chiara Convert_Test.cc -- in grid4.cc.
+
+// cong_test5 from Chiara Convert_Test.cc.
+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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// cong_test6 from Chiara Convert_Test.cc.
+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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// cong_test7 from Chiara Convert_Test.cc.
+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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+// cong_test8 from Chiara Convert_Test.cc.
+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_and_minimize(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_and_minimize(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_and_minimize(cgs);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.add_congruences_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(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;
+}
+
+} // 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/grid3.cc b/tests/Grid/grid3.cc
new file mode 100644
index 0000000..f04ca0e
--- /dev/null
+++ b/tests/Grid/grid3.cc
@@ -0,0 +1,488 @@
+/* Test construction of grids from constraints.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Grid(cs)
+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);
+
+ Grid gr(cs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(B == 0);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ return ok;
+}
+
+// Grid(cs), resulting grid empty.
+bool
+test02() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(B < 0);
+ cs.insert(A >= 0);
+ cs.insert(C > 0);
+
+ Grid gr(cs);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(cs) ***");
+
+ return ok;
+}
+
+// Grid(const cs)
+bool
+test03() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(2*B == A);
+ cs.insert(A >= 0);
+ cs.insert(C > 0);
+
+ const Constraint_System ccs = cs;
+
+ Grid gr(ccs);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(2*B == A);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ccs) ***");
+
+ return ok;
+}
+
+// Grid(const cs), resulting grid empty.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Constraint_System cs;
+ cs.insert(2*B >= A);
+ cs.insert(A >= 0);
+ cs.insert(C > 0);
+
+ const Constraint_System ccs = cs;
+
+ Grid gr(ccs);
+
+ Grid known_gr(3);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr(ccs) ***");
+
+ return ok;
+}
+
+// Space dimension exception.
+bool
+test05() {
+ try {
+ Grid gr(Constraint_System::max_space_dimension() + 1);
+ }
+ catch (const std::length_error& e) {
+ nout << "length_error: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Even bigger values (param_test8 from Chiara Convert_Test.cc).
+bool
+test06() {
+ 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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// Bigger values (param_test7a from Chiara Convert_Test.cc).
+bool
+test07() {
+ 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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// test4 from Chiara conversion_test.cc.
+bool
+test08 () {
+ 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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// param_test4 from Chiara Convert_Test.cc.
+bool
+test09() {
+ 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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// add_generators_and_minimize, with more rows than columns.
+bool
+test10() {
+ 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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// Example from Muller-Olm and Seidl SAS 2005 paper
+bool
+test11() {
+ 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_generators_and_minimize(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_generators_and_minimize(gs) ***");
+
+ return ok;
+}
+
+// A generator system with only a line.
+bool
+test12() {
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// A generator system containing a parameter.
+bool
+test13() {
+ 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;
+}
+
+// Assignment of universe grid, zero dimensions.
+bool
+test14() {
+ 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
+test15() {
+ try {
+ Grid gr(Grid::max_space_dimension() + 1);
+ }
+ catch (const std::length_error& e) {
+ nout << "length_error: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// cong_test4 from Chiara Convert_Test.cc.
+bool
+test16() {
+ 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_and_minimize(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_and_minimize(cgs) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST_F64(test06);
+ DO_TEST_F32(test07);
+ DO_TEST_F8(test08);
+ DO_TEST_F8(test09);
+ DO_TEST_F8(test10);
+ DO_TEST_F8(test11);
+ DO_TEST(test12);
+ DO_TEST(test13);
+ DO_TEST(test14);
+ DO_TEST(test15);
+ DO_TEST_F8(test16);
+END_MAIN
diff --git a/tests/Grid/griddifference1.cc b/tests/Grid/griddifference1.cc
new file mode 100644
index 0000000..17d2e8a
--- /dev/null
+++ b/tests/Grid/griddifference1.cc
@@ -0,0 +1,349 @@
+/* Test Grid::grid_difference_assign() (a.k.a. Grid::difference_assign()).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.grid_difference_assign(gr2);
+
+ Grid known_gr(1, EMPTY);
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_generator(grid_point(3*A));
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.grid_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.grid_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.grid_difference_assign(gr2);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.grid_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_congruence(A == 5);
+
+ Grid known_gr(gr1);
+
+ gr1.grid_difference_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.grid_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.grid_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.grid_difference_assign(gr2);
+
+ Grid known_gr(2, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.grid_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_generator(grid_point());
+ gr1.add_generator(grid_point(A - 2*C));
+ gr1.add_generator(grid_point(3*B));
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point(A));
+ gr2.add_generator(grid_point(A + 2*C));
+ gr2.add_generator(grid_point(3*A));
+ gr2.add_generator(grid_point(A + 3*B));
+
+ gr1.grid_difference_assign(gr2);
+
+ Grid known_gr(3);
+ known_gr.add_congruence(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.grid_difference_assign(gr2) ***");
+
+ return ok;
+}
+
+// Zero dimension grids.
+bool
+test08() {
+ Grid gr1(0);
+
+ Grid gr2(0);
+
+ gr1.grid_difference_assign(gr2);
+
+ Grid known_gr(0, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.grid_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_generator(grid_point());
+ gr1.add_generator(grid_line(A));
+ gr1.add_generator(grid_point(B));
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence((B %= 0) / 3);
+
+ Grid known_gr(gr1);
+
+ gr1.grid_difference_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.grid_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_generator(grid_point());
+ gr1.add_generator(grid_point(A));
+ gr1.add_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.grid_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_congruence(B == 0);
+ gr1.add_congruence(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_congruence(B == 0);
+ known_gr.add_congruence(C == 0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.grid_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_congruence(A == 0);
+ gr2.add_congruence(B == 0);
+ gr2.add_congruence(C == 0);
+
+ try {
+ gr1.difference_assign(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/intersection1.cc b/tests/Grid/intersection1.cc
new file mode 100644
index 0000000..fbf90a3
--- /dev/null
+++ b/tests/Grid/intersection1.cc
@@ -0,0 +1,500 @@
+/* Test Grid::intersection_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_generator(grid_point());
+
+ Grid gr2(3);
+
+ try {
+ gr1.intersection_assign(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// intersection_assign_and_minimize: Simple grids, one dimension.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs1;
+ cgs1.insert((A + 0*C %= 0) / 2);
+
+ Congruence_System cgs2;
+ cgs2.insert((2*A + 0*C %= 0) / 2);
+
+ Grid gr1(cgs1);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(cgs2);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign_and_minimize(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((A + 0*C %= 0) / 2);
+ known_cgs.insert((2*A %= 0) / 2);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// intersection_assign_and_minimize: First grid empty.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + B + C %= 0) / 2);
+
+ Grid gr1(3, EMPTY);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(cgs);
+
+ gr1.intersection_assign_and_minimize(gr2);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// intersection_assign_and_minimize: Second grid empty.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + B + C %= 0) / 2);
+
+ Grid gr1(cgs);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(3, EMPTY);
+
+ gr1.intersection_assign_and_minimize(gr2);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// intersection_assign_and_minimize: First grid universe.
+bool
+test13() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert(( A + B + C %= 7) / 9);
+ cgs.insert((5*A + 3*B + C %= 7) / 9);
+
+ Grid gr1(3, UNIVERSE);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(cgs);
+
+ gr1.intersection_assign_and_minimize(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert(( A + B + C %= 7) / 9);
+ 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_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// intersection_assign_and_minimize: Second grid universe.
+bool
+test14() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((2*B + 2*C %= 1) / 3);
+ cgs.insert((2*B %= 1) / 3);
+
+ Grid gr1(cgs);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(3, UNIVERSE);
+
+ gr1.intersection_assign_and_minimize(gr2);
+
+ Congruence_System known_cgs;
+ known_cgs.insert((2*B + 2*C %= 1) / 3);
+ known_cgs.insert((2*B %= 1) / 3);
+
+ Grid known_gr(known_cgs);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// intersection_assign_and_minimize: Zero dimension grids.
+bool
+test15() {
+ Grid gr1(0);
+ print_congruences(gr1, "*** gr1 ***");
+ Grid gr2(0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign_and_minimize(gr2);
+
+ Grid known_gr(0);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.intersection_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// intersection_assign_and_minimize: Many dimension grids from generators.
+bool
+test16() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid_Generator_System gs1;
+ gs1.insert(grid_point(A + C));
+ gs1.insert(grid_point(A + 2*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_generators(gs2);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.intersection_assign_and_minimize(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_generators(gr1, "*** gr1.intersection_assign_and_minimize(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/isempty1.cc b/tests/Grid/isempty1.cc
new file mode 100644
index 0000000..efbde6e
--- /dev/null
+++ b/tests/Grid/isempty1.cc
@@ -0,0 +1,293 @@
+/* Test Grid::is_empty().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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..2171295
--- /dev/null
+++ b/tests/Grid/isuniverse1.cc
@@ -0,0 +1,321 @@
+/* Test Grid::is_universe().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/join1.cc b/tests/Grid/join1.cc
new file mode 100644
index 0000000..48b7263
--- /dev/null
+++ b/tests/Grid/join1.cc
@@ -0,0 +1,376 @@
+/* Test Grid::join_assign() (a.k.a. Grid::upper_bound_assign()).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.join_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.join_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.join_assign(gr2);
+
+ Grid known_gr(3);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_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_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.join_assign(gr2) ***");
+
+ return ok;
+}
+
+// join_assign_and_minimize - Divisor normalization.
+bool
+test05() {
+ 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.join_assign_and_minimize(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.join_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// Out-of-date generators in the first grid.
+bool
+test06() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A == 0);
+ gr1.add_congruence(B == 0);
+ gr1.add_congruence(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.join_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.join_assign(gr2) ***");
+
+ return ok;
+}
+
+// Out-of-date generators in the second grid.
+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);
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence(A == 0);
+ gr2.add_congruence(B == 0);
+ gr2.add_congruence(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
+test08() {
+ 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_congruence(A == 0);
+ gr2.add_congruence(B == 0);
+ gr2.add_congruence(C == 0);
+
+ try {
+ gr1.upper_bound_assign(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Out-of-date generators in the first grid, which is empty.
+bool
+test09() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3);
+ gr1.add_congruence(A == 0);
+ gr1.add_congruence(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.join_assign(gr2);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_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
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+ Variable D(3);
+
+ Grid gr0(4); // initial point
+ gr0.add_congruence(A == 2);
+ gr0.add_congruence(B == 0);
+
+ Grid gr1(4); // a pass through the procedure may do nothing
+ gr1.add_congruence(A == C);
+ gr1.add_congruence(B == D);
+
+ gr1.intersection_assign(gr0); // add the inital point
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(4); // one non-trivial pass through procedure
+ gr2.add_congruence(15 * A == C);
+ gr2.add_congruence(18 * A + B == D);
+
+ gr2.intersection_assign(gr0); // add the inital point
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid gr3(4); // two non-trivial passes through procedure
+ gr3.add_congruence(225 * A == C);
+ gr3.add_congruence(282 * A + B == D);
+
+ gr3.intersection_assign(gr0); // add the inital point
+ print_congruences(gr3, "*** gr3 ***");
+
+ gr1.join_assign(gr2); // combine alternative paths 1 and 2
+ print_generators(gr1, "*** gr1.join_assign(gr2) ***");
+ gr1.join_assign(gr3); // combine alternative paths 1, 2 and 3
+ print_generators(gr1, "*** gr1.join_assign(gr3) ***");
+
+ Variables_Set vars;
+ vars.insert(A);
+ vars.insert(B);
+
+ gr1.remove_space_dimensions(vars);
+
+ Grid known_gr(2); // as in paper
+
+ known_gr.add_congruence((A %= 2) / 28);
+ known_gr.add_congruence((B %= 0) / 12);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.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(test09);
+ DO_TEST_F8(test10);
+END_MAIN
diff --git a/tests/Grid/join2.cc b/tests/Grid/join2.cc
new file mode 100644
index 0000000..ceb4537
--- /dev/null
+++ b/tests/Grid/join2.cc
@@ -0,0 +1,325 @@
+/* Test Grid::join_assign_and_minimize().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// join_assign_and_minimize - two grids in 3D
+// each defined by a single point.
+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.join_assign_and_minimize(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.join_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// join_assign_and_minimize - Two universe grids.
+bool
+test02() {
+ Grid gr1(3);
+ print_generators(gr1, "*** gr1 ***");
+ Grid gr2(3);
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.join_assign_and_minimize(gr2);
+
+ Grid known_gr(3);
+
+ bool ok = (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_and_minimize(gr2) ***");
+
+ return ok;
+}
+
+// join_assign and join_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.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// join_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_generator(grid_point(2*A));
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr2;
+
+ bool ok = (gr1.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// join_assign_if_exact - Second grid empty.
+bool
+test05() {
+ Variable B(1);
+
+ Grid gr1(4, EMPTY);
+ gr1.add_generator(grid_point());
+ gr1.add_generator(grid_line(B));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ print_generators(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr1;
+
+ bool ok = (gr1.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// join_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.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// join_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.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// join_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_congruence(A - B == 0);
+ print_congruences(gr2, "*** gr2 ***");
+
+ Grid known_gr = gr1;
+
+ bool ok = (gr1.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// join_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.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_assign_if_exact(gr2) ***");
+
+ return ok;
+}
+
+// join_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.join_assign_if_exact(gr2));
+
+ if (ok)
+ ok &= (gr1 == known_gr);
+
+ print_congruences(gr1, "*** gr1.join_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_congruence(A == 0);
+ gr2.add_congruence(B == 0);
+ gr2.add_congruence(C == 0);
+
+ try {
+ gr1.upper_bound_assign_if_exact(gr2);
+ }
+ catch (const std::invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl;
+ }
+ catch (...) {
+ 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);
+END_MAIN
diff --git a/tests/Grid/limitedextrapolation1.cc b/tests/Grid/limitedextrapolation1.cc
new file mode 100644
index 0000000..69da938
--- /dev/null
+++ b/tests/Grid/limitedextrapolation1.cc
@@ -0,0 +1,496 @@
+/* Test Grid::limited_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_congruence(A == 0);
+ gr1.add_congruence(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_congruence(A == 0);
+ gr1.add_congruence(B == 1);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(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_generator(grid_point(C, 3));
+ gr1.add_generator(grid_line(A - 2*B));
+ gr1.add_generator(grid_point(C + 3*A + 3*C, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point(C, 3));
+ gr2.add_generator(grid_line(A - 2*B));
+ gr2.add_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_generator(grid_point(C, 3));
+ gr1.add_generator(grid_point(C + A - 2*B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(5, EMPTY);
+ gr2.add_generator(grid_point(C, 3));
+ gr2.add_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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// 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_generator(grid_point(A));
+ gr1.add_generator(parameter(B, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(2, EMPTY);
+ gr2.add_generator(grid_point(A));
+ gr2.add_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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Limit with an empty congruence system.
+bool
+test15() {
+ Variable A(0);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_generator(grid_point());
+ gr1.add_generator(parameter(A, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point());
+ gr2.add_generator(parameter(A, 6));
+ print_generators(gr2, "*** gr2 ***");
+
+ Congruence_System cgs;
+
+ gr2.limited_extrapolation_assign(gr1, cgs);
+
+ Grid known_gr = gr2;
+ known_gr.add_generator(grid_point());
+ known_gr.add_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..4543c3e
--- /dev/null
+++ b/tests/Grid/mapspacedims1.cc
@@ -0,0 +1,313 @@
+/* Test Grid::map_space_dimensions().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator(grid_point());
+ known_gr.add_generator(grid_point(B));
+ known_gr.add_generator(grid_point(2*A));
+ known_gr.add_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_generator(grid_point());
+ known_gr.add_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_generator(grid_point(4*A, 2));
+ gr.add_generator(grid_point(4*A + B, 2));
+
+ // Force minimization.
+ gr.minimized_generators();
+ print_generators(gr, "*** gr ***");
+
+ gr.map_space_dimensions(function);
+
+ Grid known_gr(2, EMPTY);
+ known_gr.add_generator(grid_point(4*B, 2));
+ known_gr.add_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..462027a
--- /dev/null
+++ b/tests/Grid/maxmin1.cc
@@ -0,0 +1,494 @@
+/* Test Grid::maximize(const Linear_Expression&, ...)
+ and Grid::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+check_both(Grid& gr, Linear_Expression& le, string grid_name) {
+ Grid_Generator ext_pnt(grid_point());
+ bool dummy;
+ Coefficient ext_n, ext_d;
+
+ bool ok = (!gr.minimize(le, ext_n, ext_d, dummy, ext_pnt)
+ && !gr.maximize(le, ext_n, ext_d, dummy, ext_pnt));
+
+ if (!ok)
+ nout << grid_name << " bounded expr" << endl;
+
+ return ok;
+}
+
+bool
+check_minimize(Grid& gr, Linear_Expression& le,
+ Coefficient expected_n, Coefficient expected_d,
+ Grid_Generator& expected_pnt, string grid_name) {
+ Grid_Generator inf_pnt(grid_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, Linear_Expression& le,
+ Coefficient expected_n, Coefficient expected_d,
+ Grid_Generator& expected_pnt, string grid_name) {
+ Grid_Generator sup_pnt(grid_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;
+ Grid_Generator pnt(grid_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();
+
+ Grid_Generator exp_pnt(grid_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_generator_and_minimize(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_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_congruence(A == 1);
+ gr_cgs_needs_min.add_congruence(3*B == 2);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ Linear_Expression le = A + B;
+
+ Grid_Generator exp_pnt(grid_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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(grid_line(B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_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_congruence(A == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(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_generator(grid_point());
+ gr_gs_needs_min.add_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_congruence(A - 2*B == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(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_generator(grid_point());
+ gr_gs_needs_min.add_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_congruence(2*A - B == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ Linear_Expression le = 2*A - B;
+
+ Grid_Generator exp_pnt(grid_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_generator(grid_point());
+ gr_gs_min.add_generator_and_minimize(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_generator(grid_point());
+ gr_gs_needs_min.add_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_congruence(2*A - B == 0);
+ gr_cgs_needs_min.add_congruence((B %= 0) / 2);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ Linear_Expression le = 2*A - B;
+
+ Grid_Generator exp_pnt(grid_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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(A));
+ gr_gs_min.add_generator_and_minimize(grid_line(B));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(A));
+ gr_gs_needs_min.add_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 ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(A));
+ gr_gs_min.add_generator_and_minimize(grid_point(B + C));
+ print_generators(gr_gs_min, "*** gr_gs_min ***");
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(A));
+ gr_gs_needs_min.add_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_congruence(B - C == 0);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(A));
+ gr_gs_min.add_generator(grid_line(3*B + C));
+ gr_gs_min.add_generator_and_minimize(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_generator(grid_point(A));
+ gr_gs_needs_min.add_generator(grid_line(3*B + C));
+ gr_gs_needs_min.add_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_congruence(2*A + B - 3*C - 2 == 0);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ Linear_Expression le = 2*A + B - 3*C;
+
+ Grid_Generator exp_pnt1(grid_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");
+
+ Grid_Generator exp_pnt2(grid_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_generator_and_minimize(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_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_congruence(A == 7);
+ gr_cgs_needs_min.add_congruence(B == -11);
+ gr_cgs_needs_min.add_congruence(C == 0);
+ gr_cgs_needs_min.add_congruence(D == 0);
+ gr_cgs_needs_min.add_congruence(E == 0);
+ gr_cgs_needs_min.add_congruence(F == 19);
+ print_congruences(gr_cgs_needs_min, "*** gr_cgs_needs_min ***");
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ Linear_Expression le = A + 2*B + 3*C + 4*D + 6*F;
+
+ Grid_Generator exp_pnt(grid_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;
+}
+
+} // 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/membytes1.cc b/tests/Grid/membytes1.cc
new file mode 100644
index 0000000..9a2d3de
--- /dev/null
+++ b/tests/Grid/membytes1.cc
@@ -0,0 +1,284 @@
+/* Test Grid::total_memory_in_bytes() and
+ Grid::external_memory_in_bytes().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_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_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.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_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.add_constraint(4*x - 2*y - z + 14 >= 0);
+ gr1.add_constraint(4*x + 2*y - z + 2 >= 0);
+ gr1.add_constraint(x + y - 1 >= 0);
+ gr1.add_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;
+
+ Polyhedra_Powerset<Grid> pgr1(gr1);
+
+ Grid gr2(3);
+ gr2.add_constraint(x >= 0);
+ gr2.add_constraint(y >= 0);
+ gr2.add_constraint(z >= 0);
+ gr2.add_constraint(x <= 1);
+ gr2.add_constraint(y <= 1);
+ gr2.add_constraint(z <= 1);
+ Polyhedra_Powerset<Grid> pgr2(gr2);
+
+ // TODO: Include these sections when poly_difference_assign is
+ // defined for Grid.
+#if 0
+ Polyhedra_Powerset<Grid> p2gr2 = pgr2;
+ p2gr2.poly_difference_assign(pgr1);
+#endif
+
+ 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();
+#if 0
+ const memory_size_type p2gr2_total_size = p2gr2.total_memory_in_bytes();
+ const memory_size_type p2gr2_external_size = p2gr2.external_memory_in_bytes();
+#endif
+
+ 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
+#if 0
+ << endl
+ << "p2gr2.total_memory_in_bytes() = " << p2gr2_total_size
+ << endl
+ << "p2gr2.external_memory_in_bytes() = " << p2gr2_external_size
+#endif
+ << 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..aeab564
--- /dev/null
+++ b/tests/Grid/mincongruences1.cc
@@ -0,0 +1,214 @@
+/* Test Grid::minimized_congruences().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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();
+
+ 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();
+
+ 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_congruence(A == 1);
+ gr1.add_congruence(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..55b3b8b
--- /dev/null
+++ b/tests/Grid/mingenerators1.cc
@@ -0,0 +1,240 @@
+/* Test Grid::minimized_generators().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_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_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_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_generator(grid_point(3*B));
+ gr1.add_generator(grid_point(5*A + 2*B));
+ gr1.add_generator(grid_point(10*A + B));
+ gr1.add_generator(grid_point(7*B));
+ gr1.add_generator(grid_point(3*B + 4*C));
+ gr1.add_generator(grid_line(C));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_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_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_generators();
+
+ // Add a point. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_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_generators();
+
+ // Empty the grid. The idea is to check that `gs' still refers to a
+ // generator system that matches the grid.
+ gr1.add_congruence_and_minimize(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_congruence(C == 4);
+ gr1.add_congruence(C == 0);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid known_gr = gr1;
+
+ Grid_Generator_System gs = gr1.minimized_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..726c35c
--- /dev/null
+++ b/tests/Grid/outputoperator1.cc
@@ -0,0 +1,139 @@
+/* Test IO_Operators::operator<<(s, gr).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+// One dimension universe and empty.
+bool
+test01() {
+ Grid gr1(1, EMPTY);
+
+ stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(1);
+
+ stringstream ss2;
+ ss2 << gr2;
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Many dimensioned universe and empty.
+bool
+test02() {
+ Grid gr1(3, EMPTY);
+
+ stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(3);
+
+ stringstream ss2;
+ ss2 << gr2;
+
+ bool ok = (ss2.str().compare(ss1.str()));
+
+ return ok;
+}
+
+// Universe and empty, mixed dimensions.
+bool
+test03() {
+ Grid gr1(4, EMPTY);
+
+ stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(3);
+
+ 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_generator(grid_point(3*A + C));
+ gr1.add_generator(parameter(3*A));
+
+ stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(4);
+ gr2.add_congruence(3*A == 0);
+
+ 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_generator(grid_point(3*A + C));
+ gr1.add_generator(parameter(3*A));
+
+ stringstream ss1;
+ ss1 << gr1;
+
+ Grid gr2(4);
+ gr2.add_congruence(3*A == 0);
+
+ 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/relations1.cc b/tests/Grid/relations1.cc
new file mode 100644
index 0000000..3972058
--- /dev/null
+++ b/tests/Grid/relations1.cc
@@ -0,0 +1,180 @@
+/* Test Grid::relation_with(g).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_congruence((A %= 0) / 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Zero dimension universe grid.
+bool
+test09() {
+ Grid gr(0);
+
+ bool ok = (gr.relation_with(grid_point()) == 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);
+END_MAIN
diff --git a/tests/Grid/relations2.cc b/tests/Grid/relations2.cc
new file mode 100644
index 0000000..42b7d46
--- /dev/null
+++ b/tests/Grid/relations2.cc
@@ -0,0 +1,376 @@
+/* Test Grid::relation_with(cg).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_generator(grid_point());
+ gr.add_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_generator(grid_point());
+ gr.add_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_generator(grid_point());
+ gr.add_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.
+bool
+test05() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_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()));
+
+ 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()
+ // Proper congruence.
+ && gr.relation_with((Linear_Expression(5) %= 1) / 4)
+ == Poly_Con_Relation::is_included()
+ // Equality.
+ && gr.relation_with(Linear_Expression(1) %= 1)
+ == Poly_Con_Relation::is_included()
+ // Integrality congruence.
+ && gr.relation_with(Congruence::zero_dim_integrality())
+ == Poly_Con_Relation::is_included());
+
+ return ok;
+}
+
+// A congruence and a disjoint grid.
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_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_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()
+ && gr.relation_with(2*A %= 1)
+ == Poly_Con_Relation::is_included());
+
+ return ok;
+}
+
+// Grid with a divisor that is greater than zero: seperate spaces.
+bool
+test11() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_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_generator(grid_point());
+ gr.add_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_generator(grid_point());
+ gr.add_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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Empty grid, where updating finds the grid empty.
+bool
+test15() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A == 1);
+ gr.add_congruence(A == 2);
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((B %= 0) / 2)
+ == (Poly_Con_Relation::is_included()
+ && Poly_Con_Relation::is_disjoint()));
+
+ return ok;
+}
+
+// Generators that require the relation_with(cg) GCD calculation.
+bool
+test16() {
+ Variable A(0);
+
+ Grid gr(1, EMPTY);
+ gr.add_generator(grid_point(A));
+ gr.add_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_generator(grid_point(3*A));
+ gr.add_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_generator(grid_point(3*A));
+ gr.add_generator(parameter(3*A));
+ print_generators(gr, "*** gr ***");
+
+ bool ok
+ = (gr.relation_with((A %= 0) / 8)
+ == 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);
+END_MAIN
diff --git a/tests/Grid/removespacedims1.cc b/tests/Grid/removespacedims1.cc
new file mode 100644
index 0000000..44ea452
--- /dev/null
+++ b/tests/Grid/removespacedims1.cc
@@ -0,0 +1,484 @@
+/* Test Grid::remove_space_dimensions().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// Simple grid.
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr(2);
+ gr.add_congruence(A - B == 0);
+ gr.add_congruence(A %= 0);
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ 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.remove_space_dimensions(vars) ***");
+
+ 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 gs;
+ gs.insert(grid_point(0*A));
+ gs.insert(grid_point(2*A));
+ gs.insert(grid_point(3*B));
+
+ Grid gr(gs);
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ 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.remove_space_dimensions(vars) ***");
+
+ gr.remove_space_dimensions(vars);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point());
+ known_gs.insert(grid_line(2*A - B));
+ known_gs.insert(grid_point(3*B, 2));
+ known_gs.insert(grid_line(C));
+
+ Grid known_gr(known_gs);
+
+ 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_congruence(A - B == 0);
+ gr.add_congruence(A %= 0);
+
+ 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 ***");
+
+ 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_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator_and_minimize(grid_point(B));
+ gr.add_generator(grid_line(C));
+ print_congruences(gr, "*** gr.remove_space_dimensions(vars) ***");
+
+ 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 ***");
+
+ return ok;
+}
+
+// Empty variable set.
+
+bool
+test08() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator_and_minimize(grid_point(B));
+ gr.add_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;
+}
+
+// Space dimension exception.
+
+bool
+test09() {
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test10() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator_and_minimize(grid_point(B));
+ gr.add_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;
+}
+
+// From congruences.
+bool
+test11() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Congruence_System cgs;
+ cgs.insert((A + 2*C %= 0) / 3);
+
+ Grid gr(cgs);
+ print_generators(gr, "*** gr ***");
+
+ gr.remove_higher_space_dimensions(2);
+
+ Grid_Generator_System known_gs;
+ known_gs.insert(grid_point(0*B));
+ known_gs.insert(grid_line(A));
+ known_gs.insert(grid_line(B));
+
+ Grid known_gr(known_gs);
+
+ bool ok = (gr == known_gr);
+
+ print_congruences(gr, "*** gr.remove_higher_space_dimensions(2) ***");
+
+ return ok;
+}
+
+// Empty grid.
+bool
+test12() {
+ 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
+test13() {
+ Grid gr(7);
+
+ 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
+test14() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid_Generator_System gs;
+ gs.insert(grid_point(0*A));
+ gs.insert(grid_point(2*A));
+ gs.insert(grid_point(3*B));
+
+ Grid gr(gs);
+ 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
+test15() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator_and_minimize(grid_point(B));
+ gr.add_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;
+}
+
+// Space dimension exception.
+bool
+test16() {
+ 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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Zero dimension universe resulting grid.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr(3, EMPTY);
+ gr.add_generator(grid_point());
+ gr.add_generator(grid_point(A));
+ gr.add_generator_and_minimize(grid_point(B));
+ gr.add_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;
+}
+
+} // 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..8b50902
--- /dev/null
+++ b/tests/Grid/timeelapse1.cc
@@ -0,0 +1,340 @@
+/* Test Grid::time_elapse_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_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_congruence(A == 2);
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ gr2.add_congruence(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_congruence(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_congruence(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_generator(grid_point());
+ gr1.add_generator(grid_point(2*A));
+ gr1.add_generator(grid_point(4*A));
+ gr1.add_generator(grid_point(D));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ gr2.add_generator(grid_point(A));
+ print_generators(gr2, "*** gr2 ***");
+
+ gr1.time_elapse_assign(gr2);
+
+ Grid known_gr(4, EMPTY);
+ known_gr.add_generator(grid_point());
+ known_gr.add_generator(grid_point(A));
+ known_gr.add_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_congruence(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_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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Multi-dimension grids with denominators.
+bool
+test12() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_generator(grid_point());
+ gr1.add_generator(grid_point(A + 2*B - 3*C, 3));
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_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_generator(grid_point());
+ known_gr.add_generator(grid_point(A + 2*B - 3*C, 3));
+ known_gr.add_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..3c73ba1
--- /dev/null
+++ b/tests/Grid/topclosed1.cc
@@ -0,0 +1,336 @@
+/* Test Grid::is_topologically_closed().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_generator_and_minimize(grid_point(3*A + 2*B));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+
+ Grid gr_cgs_needs_min(2);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B == 2);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + B));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+ gr_cgs_needs_min.add_congruence(C == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point(3*A + 2*B));
+ gr_gs_min.add_generator(grid_point(3*A + B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point(3*A + 2*B));
+ gr_gs_needs_min.add_generator(grid_point(3*A + B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(3);
+ gr_cgs_needs_min.add_congruence(A == 3);
+ gr_cgs_needs_min.add_congruence(B %= 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(2, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_point(A));
+ gr_gs_min.add_generator(grid_line(C));
+ gr_gs_min.add_generator_and_minimize(grid_point(3*A + 3*B, 4));
+
+ Grid gr_gs_needs_min(3, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_point(A));
+ gr_gs_needs_min.add_generator(grid_line(C));
+ gr_gs_needs_min.add_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);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_generator(grid_point());
+ gr_gs_min.add_generator(grid_line(B));
+ gr_gs_min.add_generator_and_minimize(grid_line(C));
+
+ Grid gr_gs_needs_min(4, EMPTY);
+ gr_gs_needs_min.add_generator(grid_point());
+ gr_gs_needs_min.add_generator(grid_line(B));
+ gr_gs_needs_min.add_generator(grid_line(C));
+
+ Grid gr_cgs_needs_min(4);
+ gr_cgs_needs_min.add_congruence(A == 0);
+ gr_cgs_needs_min.add_congruence(D == 0);
+
+ assert(copy_compare(gr_gs_min, gr_gs_needs_min));
+ assert(copy_compare(gr_gs_needs_min, gr_cgs_needs_min));
+
+ 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_congruence(A == 1);
+ gr.add_congruence(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..9e92d21
--- /dev/null
+++ b/tests/Grid/topclosure1.cc
@@ -0,0 +1,93 @@
+/* Test Grid::topological_closure_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/widening1.cc b/tests/Grid/widening1.cc
new file mode 100644
index 0000000..db4ba7b
--- /dev/null
+++ b/tests/Grid/widening1.cc
@@ -0,0 +1,616 @@
+/* Test Grid::widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+// Empty after minimization.
+bool
+test02() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_congruence(A == 0);
+ gr1.add_congruence(A == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(1);
+ 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
+test03() {
+ Variable A(0);
+
+ Grid gr1(1);
+ gr1.add_congruence(A == 0);
+ gr1.add_congruence(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;
+}
+
+// An equality that becomes a congruence.
+bool
+test04() {
+ Variable A(0);
+ Variable B(1);
+
+ Grid gr1(2);
+ gr1.add_congruence(A == 0);
+ gr1.add_congruence(B == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(2);
+ gr2.add_congruence(A == 0);
+ gr2.add_congruence(B %= 1);
+
+ 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;
+}
+
+// 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.widening_assign(gr1);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2,
+ "*** gr2.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.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.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.widening_assign(gr1);
+
+ Grid known_gr(3);
+ known_gr.add_congruence((B %= 0) / 2);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2,
+ "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// Both universe.
+bool
+test08() {
+ Grid gr1(5);
+ Grid gr2(5);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.widening_assign(gr1);
+
+ Grid known_gr(5);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2,
+ "*** gr2.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.widening_assign(gr1);
+
+ Grid known_gr(4);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2,
+ "*** gr2.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.widening_assign(gr1, &tokens);
+
+ bool ok = ((gr2 == known_gr) && (tokens == 3));
+
+ nout << "*** `tokens' should be 3 ***" << 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.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.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.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;
+}
+
+// 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.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;
+}
+
+// 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.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;
+}
+
+// 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.widening_assign(gr1);
+
+ Grid known_gr(2);
+ known_gr.add_congruence((A - B == 0) / 3);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2,
+ "*** gr2.widening_assign(gr1) ***");
+
+ return ok;
+}
+
+// From generators.
+bool
+test17() {
+ Variable A(0);
+ Variable B(1);
+ Variable C(2);
+
+ Grid gr1(3, EMPTY);
+ gr1.add_generator(grid_point(C, 3));
+ gr1.add_generator(grid_point(C + A - 2*B, 3));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(3, EMPTY);
+ gr2.add_generator(grid_point(C, 3));
+ gr2.add_generator(grid_point(2*C + A - 2*B, 6));
+
+ print_generators(gr2, "*** gr2 ***");
+
+ gr2.widening_assign(gr1);
+
+ Grid known_gr(3, EMPTY);
+ known_gr.add_generator(grid_point(C, 3));
+ known_gr.add_generator(grid_line(A - 2*B));
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2,
+ "*** gr2.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_generator(grid_point(C, 3));
+ gr1.add_generator(grid_point(C + A - 2*B, 3));
+
+ print_generators(gr1, "*** gr1 ***");
+
+ Grid gr2(4, EMPTY);
+ gr2.add_generator(grid_point(C, 3));
+ gr2.add_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;
+ }
+ catch (...) {
+ return false;
+ }
+ return true;
+}
+
+// Minimizing the first congruence system finds the empty grid.
+bool
+test19() {
+ Variable A(0);
+
+ Grid gr1(3);
+ gr1.add_congruence(A == 0);
+ gr1.add_congruence(A == 1);
+
+ print_congruences(gr1, "*** gr1 ***");
+
+ Grid gr2(3);
+ gr2.add_congruence(A == 0);
+ gr2.add_congruence(A == 1);
+
+ print_congruences(gr2, "*** gr2 ***");
+
+ gr2.widening_assign(gr1);
+
+ Grid known_gr(3, EMPTY);
+
+ bool ok = (gr2 == known_gr);
+
+ print_congruences(gr2,
+ "*** gr2.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/writecongruencesystem.cc b/tests/Grid/writecongruencesystem.cc
new file mode 100644
index 0000000..3ee674b
--- /dev/null
+++ b/tests/Grid/writecongruencesystem.cc
@@ -0,0 +1,61 @@
+/* Test operator<<(std::ostream&, const Congruence_System&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ Congruence_System cgs;
+
+ bool ok = (cgs.OK());
+
+ 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/Makefile.am b/tests/Makefile.am
new file mode 100644
index 0000000..e34e86d
--- /dev/null
+++ b/tests/Makefile.am
@@ -0,0 +1,50 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+SUBDIRS = . BD_Shape Polyhedron Grid
+
+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 \
+print.hh \
+print.cc \
+ppl_test.cc \
+BBox.cc \
+Partial_Function.cc
+
+LDADD = $(top_builddir)/src/libppl.la libppl_tests.a -lppl @extra_libraries@
+
+noinst_HEADERS = \
+ppl_test.hh \
+BBox.hh \
+Partial_Function.defs.hh \
+Partial_Function.inlines.hh \
+Partial_Function.types.hh \
+Random_Number_Generator.defs.hh \
+Random_Number_Generator.inlines.hh \
+Random_Number_Generator.types.hh
+
+MOSTLYCLEANFILES =
diff --git a/tests/Makefile.in b/tests/Makefile.in
new file mode 100644
index 0000000..35de578
--- /dev/null
+++ b/tests/Makefile.in
@@ -0,0 +1,693 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(noinst_HEADERS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+ARFLAGS = cru
+libppl_tests_a_AR = $(AR) $(ARFLAGS)
+libppl_tests_a_LIBADD =
+am_libppl_tests_a_OBJECTS = files.$(OBJEXT) print.$(OBJEXT) \
+ ppl_test.$(OBJEXT) BBox.$(OBJEXT) Partial_Function.$(OBJEXT)
+libppl_tests_a_OBJECTS = $(am_libppl_tests_a_OBJECTS)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_tests_a_SOURCES)
+DIST_SOURCES = $(libppl_tests_a_SOURCES)
+RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
+ html-recursive info-recursive install-data-recursive \
+ install-exec-recursive install-info-recursive \
+ install-recursive installcheck-recursive installdirs-recursive \
+ pdf-recursive ps-recursive uninstall-info-recursive \
+ uninstall-recursive
+HEADERS = $(noinst_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+DIST_SUBDIRS = $(SUBDIRS)
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+SUBDIRS = . BD_Shape Polyhedron Grid
+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 \
+print.hh \
+print.cc \
+ppl_test.cc \
+BBox.cc \
+Partial_Function.cc
+
+LDADD = $(top_builddir)/src/libppl.la libppl_tests.a -lppl @extra_libraries@
+noinst_HEADERS = \
+ppl_test.hh \
+BBox.hh \
+Partial_Function.defs.hh \
+Partial_Function.inlines.hh \
+Partial_Function.types.hh \
+Random_Number_Generator.defs.hh \
+Random_Number_Generator.inlines.hh \
+Random_Number_Generator.types.hh
+
+MOSTLYCLEANFILES =
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Makefile'; \
+ 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
+
+clean-checkLIBRARIES:
+ -test -z "$(check_LIBRARIES)" || rm -f $(check_LIBRARIES)
+libppl_tests.a: $(libppl_tests_a_OBJECTS) $(libppl_tests_a_DEPENDENCIES)
+ -rm -f libppl_tests.a
+ $(libppl_tests_a_AR) libppl_tests.a $(libppl_tests_a_OBJECTS) $(libppl_tests_a_LIBADD)
+ $(RANLIB) libppl_tests.a
+
+mostlyclean-compile:
+ -rm -f *.$(OBJEXT)
+
+distclean-compile:
+ -rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/BBox.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/Partial_Function.Po at am__quote@
+ 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@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/print.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+# 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.
+$(RECURSIVE_TARGETS):
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ target=`echo $@ | sed s/-recursive//`; \
+ list='$(SUBDIRS)'; 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; \
+ (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"
+
+mostlyclean-recursive clean-recursive distclean-recursive \
+maintainer-clean-recursive:
+ @failcom='exit 1'; \
+ for f in x $$MAKEFLAGS; do \
+ case $$f in \
+ *=* | --[!k]*);; \
+ *k*) failcom='fail=yes';; \
+ esac; \
+ done; \
+ dot_seen=no; \
+ case "$@" in \
+ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
+ *) list='$(SUBDIRS)' ;; \
+ esac; \
+ rev=''; for subdir in $$list; do \
+ if test "$$subdir" = "."; then :; else \
+ rev="$$subdir $$rev"; \
+ fi; \
+ done; \
+ rev="$$rev ."; \
+ target=`echo $@ | sed s/-recursive//`; \
+ for subdir in $$rev; do \
+ echo "Making $$target in $$subdir"; \
+ if test "$$subdir" = "."; then \
+ local_target="$$target-am"; \
+ else \
+ local_target="$$target"; \
+ fi; \
+ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
+ || eval $$failcom; \
+ done && test -z "$$fail"
+tags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
+ done
+ctags-recursive:
+ list='$(SUBDIRS)'; for subdir in $$list; do \
+ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
+ done
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ 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 || \
+ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
+ fi; \
+ done; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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 \
+ test -d "$(distdir)/$$subdir" \
+ || $(mkdir_p) "$(distdir)/$$subdir" \
+ || exit 1; \
+ distdir=`$(am__cd) $(distdir) && pwd`; \
+ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
+ (cd $$subdir && \
+ $(MAKE) $(AM_MAKEFLAGS) \
+ top_distdir="$$top_distdir" \
+ distdir="$$distdir/$$subdir" \
+ 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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-recursive
+
+dvi-am:
+
+html: html-recursive
+
+info: info-recursive
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-recursive
+
+install-man:
+
+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-info-am
+
+uninstall-info: uninstall-info-recursive
+
+.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
+ clean clean-checkLIBRARIES clean-generic clean-libtool \
+ clean-recursive ctags ctags-recursive distclean \
+ distclean-compile distclean-generic distclean-libtool \
+ distclean-recursive distclean-tags distdir dvi dvi-am html \
+ html-am info info-am install install-am install-data \
+ install-data-am install-exec install-exec-am install-info \
+ install-info-am install-man install-strip installcheck \
+ installcheck-am installdirs installdirs-am maintainer-clean \
+ maintainer-clean-generic maintainer-clean-recursive \
+ mostlyclean mostlyclean-compile mostlyclean-generic \
+ mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
+ tags tags-recursive uninstall uninstall-am uninstall-info-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/Partial_Function.cc b/tests/Partial_Function.cc
new file mode 100644
index 0000000..ee28c87
--- /dev/null
+++ b/tests/Partial_Function.cc
@@ -0,0 +1,73 @@
+/* Implementation of class Partial_Function (non-inline functions).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "Partial_Function.defs.hh"
+#include <stdexcept>
+#include <iostream>
+
+namespace PPL = Parma_Polyhedra_Library;
+
+void
+PPL::Partial_Function::insert(dim_t x, dim_t y) {
+ std::pair<Map::iterator, bool> stat = map.insert(Map::value_type(x, y));
+ if (!stat.second)
+ throw std::runtime_error("Partial_Function::insert(x, y) called"
+ " with `x' already in domain");
+ if (y > max)
+ max = y;
+}
+
+PPL::Partial_Function::dim_t
+PPL::Partial_Function::max_in_codomain() const {
+ if (has_empty_codomain())
+ throw std::runtime_error("Partial_Function::max_in_codomain() called"
+ " when has_empty_codomain()");
+ return max;
+}
+
+bool
+PPL::Partial_Function::maps(dim_t x, dim_t& y) const {
+ if (has_empty_codomain())
+ throw std::runtime_error("Partial_Function::maps() called"
+ " when has_empty_codomain()");
+ Map::const_iterator i = map.find(x);
+ if (i != map.end()) {
+ y = (*i).second;
+ return true;
+ }
+ else
+ return false;
+}
+
+void
+PPL::Partial_Function::print(std::ostream& s) const {
+ using namespace IO_Operators;
+
+ if (has_empty_codomain())
+ s << "empty" << std::endl;
+ else
+ for (Map::const_iterator i = map.begin(),
+ map_end = map.end(); i != map_end; ++i)
+ s << Variable((*i).first) << " --> "
+ << Variable((*i).second)
+ << std::endl;
+}
diff --git a/tests/Partial_Function.defs.hh b/tests/Partial_Function.defs.hh
new file mode 100644
index 0000000..232706c
--- /dev/null
+++ b/tests/Partial_Function.defs.hh
@@ -0,0 +1,53 @@
+/* Partial_Function class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Partial_Function_defs_hh
+#define PPL_Partial_Function_defs_hh 1
+
+#include "Partial_Function.types.hh"
+#include "ppl.hh"
+#include <map>
+#include <iosfwd>
+
+class Parma_Polyhedra_Library::Partial_Function {
+private:
+ typedef dimension_type dim_t;
+
+public:
+ Partial_Function();
+ bool has_empty_codomain() const;
+ dim_t max_in_codomain() const;
+ bool maps(dim_t i, dim_t& j) const;
+
+ void print(std::ostream& s) const;
+
+ void insert(dim_t x, dim_t y);
+
+private:
+ typedef std::map<unsigned, unsigned, std::less<dim_t> > Map;
+ Map map;
+ dim_t max;
+};
+
+#include "Partial_Function.inlines.hh"
+
+#endif // !defined(PPL_Partial_Function_defs_hh)
diff --git a/tests/Partial_Function.inlines.hh b/tests/Partial_Function.inlines.hh
new file mode 100644
index 0000000..5583408
--- /dev/null
+++ b/tests/Partial_Function.inlines.hh
@@ -0,0 +1,40 @@
+/* Partial_Function class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Partial_Function_inlines_hh
+#define PPL_Partial_Function_inlines_hh 1
+
+namespace Parma_Polyhedra_Library {
+
+inline
+Partial_Function::Partial_Function()
+ : max(0) {
+}
+
+inline bool
+Partial_Function::has_empty_codomain() const {
+ return map.empty();
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_Partial_Function_inlines_hh)
diff --git a/tests/Partial_Function.types.hh b/tests/Partial_Function.types.hh
new file mode 100644
index 0000000..681fa5f
--- /dev/null
+++ b/tests/Partial_Function.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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;
+
+}
+
+#endif // !defined(PPL_Partial_Function_types_hh)
diff --git a/tests/Polyhedron/Makefile.am b/tests/Polyhedron/Makefile.am
new file mode 100644
index 0000000..dc262ea
--- /dev/null
+++ b/tests/Polyhedron/Makefile.am
@@ -0,0 +1,663 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+
+TESTS_ENVIRONMENT = $(CHECKER)
+
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/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 \
+ bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+ bhz03widening1 \
+ bounded1 \
+ boundedaffineimage1 \
+ boundedaffinepreimage1 \
+ boundedbhrz03extrapolation1 \
+ boundedh79extrapolation1 \
+ boundingbox1 boundingbox2 boundingbox3 \
+ bounds1 \
+ cnncconversion1 \
+ concatenate1 \
+ congruences1 \
+ constraints1 \
+ contains1 contains2 \
+ disjoint1 disjoint2 \
+ dualhypercubes \
+ empty1 \
+ equals1 \
+ exceptions1 exceptions2 exceptions3 \
+ expandspacedim1 expandspacedim2 \
+ foldspacedims1 foldspacedims2 \
+ generalizedaffineimage1 generalizedaffineimage2 \
+ generalizedaffinepreimage1 generalizedaffinepreimage2 \
+ generators1 \
+ geomcovers1 \
+ h79widening1 h79widening2 \
+ intersection1 \
+ limitedbhrz03extrapolation1 \
+ limitedh79extrapolation1 \
+ linearpartition1 \
+ linexpression1 \
+ linearsystem1 \
+ lpproblem1 \
+ mapspacedims1 \
+ matrix1 \
+ max_min1 \
+ maxspacedim1 \
+ mc91 \
+ membytes1 membytes2 \
+ memory1 memory2 \
+ minconstraints1 minconstraints2 \
+ mingenerators1 mingenerators2 \
+ nncminimize1 nncminimize2 \
+ numberinput1 \
+ onepoint \
+ permute \
+ polydifference1 polydifference2 \
+ polyhull1 polyhull2 \
+ polypowerset1 \
+ powerset1 \
+ randphull1 randphull2 \
+ relations1 relations2 relations3 \
+ removespacedims1 removespacedims2 \
+ smm1 \
+ timeelapse1 timeelapse2 \
+ topclosed1 \
+ topclosure1 \
+ universe1 universe2 \
+ 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_boundingbox1 nnc_boundingbox2 \
+ nnc_bounds1 \
+ nnc_concatenate1 \
+ nnc_congruences1 \
+ nnc_constraints1 \
+ nnc_contains1 \
+ nnc_disjoint1 \
+ nnc_empty1 \
+ nnc_equals1 \
+ nnc_exceptions1 nnc_exceptions3 \
+ nnc_expandspacedim1 \
+ nnc_foldspacedims1 \
+ nnc_generalizedaffineimage1 \
+ nnc_generalizedaffinepreimage1 \
+ nnc_generators1 \
+ nnc_geomcovers1 \
+ nnc_h79widening1 \
+ nnc_intersection1 \
+ nnc_limitedbhrz03extrapolation1 \
+ nnc_limitedh79extrapolation1 \
+ nnc_linearpartition1 \
+ nnc_mapspacedims1 \
+ nnc_max_min1 \
+ nnc_mc91 \
+ nnc_membytes1 nnc_membytes2 \
+ nnc_minconstraints1 \
+ nnc_mingenerators1 \
+ nnc_onepoint \
+ nnc_permute \
+ nnc_polydifference1 \
+ nnc_polyhull1 \
+ nnc_randphull1 nnc_randphull2 \
+ nnc_relations1 nnc_relations2 \
+ nnc_removespacedims1 \
+ nnc_smm1 \
+ nnc_timeelapse1 \
+ nnc_universe1 \
+ 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
+
+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
+
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+boundingbox3_SOURCES = boundingbox3.cc
+
+bounds1_SOURCES = bounds1.cc
+
+cnncconversion1_SOURCES = cnncconversion1.cc
+
+concatenate1_SOURCES = concatenate1.cc
+
+congruences1_SOURCES = congruences1.cc
+
+constraints1_SOURCES = constraints1.cc
+
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.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
+
+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
+
+intersection1_SOURCES = intersection1.cc
+
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+
+linearpartition1_SOURCES = linearpartition1.cc
+
+linexpression1_SOURCES = linexpression1.cc
+
+linearsystem1_SOURCES = linearsystem1.cc
+
+lpproblem1_SOURCES = lpproblem1.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
+membytes2_SOURCES = membytes2.cc
+
+memory1_SOURCES = memory1.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
+
+onepoint_SOURCES = onepoint.cc
+
+permute_SOURCES = permute.cc
+
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+
+polypowerset1_SOURCES = polypowerset1.cc
+
+powerset1_SOURCES = powerset1.cc
+
+randphull1_SOURCES = randphull1.cc
+randphull2_SOURCES = randphull2.cc
+randphull2_LDADD = $(LDADD) -lm
+
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+
+smm1_SOURCES = smm1.cc
+
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+
+topclosed1_SOURCES = topclosed1.cc
+
+topclosure1_SOURCES = topclosure1.cc
+
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.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_boundingbox1_SOURCES = boundingbox1.cc
+nnc_boundingbox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundingbox2_SOURCES = boundingbox2.cc
+nnc_boundingbox2_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_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_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_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_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_membytes2_SOURCES = membytes2.cc
+nnc_membytes2_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_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_SOURCES = randphull2.cc
+nnc_randphull2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_LDADD = $(LDADD) -lm
+
+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_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+
+watchdog1_SRCS = watchdog1.cc
+
+if BUILD_WATCHDOG_LIBRARY
+WATCHDOG_TESTS = watchdog1
+
+watchdog1_SOURCES = $(watchdog1_SRCS)
+watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+
+endif BUILD_WATCHDOG_LIBRARY
+
+TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
+
+XFAIL_ALWAYS =
+
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS) \
+randphull2 \
+nnc_randphull2
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16) \
+membytes1 \
+randphull1 \
+smm1 \
+nnc_membytes1 \
+nnc_randphull1 \
+nnc_smm1
+
+XFAIL_WITH_INT8_A = \
+$(XFAIL_WITH_INT8) \
+membytes2 \
+nnc_membytes2
+
+if USE_INT64
+
+XFAIL_SET = $(XFAIL_WITH_INT64)
+
+else !USE_INT64
+if USE_INT32
+
+XFAIL_SET = $(XFAIL_WITH_INT32)
+
+else !USE_INT32
+if USE_INT16
+
+XFAIL_SET = $(XFAIL_WITH_INT16)
+
+else !USE_INT16
+if USE_INT8
+
+if ASSERTIONS_ENABLED
+
+XFAIL_SET = $(XFAIL_WITH_INT8_A)
+
+else !ASSERTIONS_ENABLED
+
+XFAIL_SET = $(XFAIL_WITH_INT8)
+
+endif !ASSERTIONS_ENABLED
+
+else !USE_INT8
+
+XFAIL_SET = $(XFAIL_ALWAYS)
+
+endif !USE_INT8
+endif !USE_INT16
+endif !USE_INT32
+endif !USE_INT64
+
+XFAIL_TESTS = $(XFAIL_SET)
+
+check_PROGRAMS = $(TESTS) $(BUGS)
+
+EXTRA_DIST = $(watchdog1_SRCS)
+
+BUGS = bug2
+
+bug2_SOURCES = bug2.cc
+bug2_CXXFLAGS = -DSRCDIR=\"$(srcdir)\"
+
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+matrix1.dat \
+linearsystem1.dat \
+writeconsys1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writerelation1.dat \
+writevariable1.dat
diff --git a/tests/Polyhedron/Makefile.in b/tests/Polyhedron/Makefile.in
new file mode 100644
index 0000000..ac247c5
--- /dev/null
+++ b/tests/Polyhedron/Makefile.in
@@ -0,0 +1,4125 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ../..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(am__EXEEXT_4) $(am__EXEEXT_5)
+subdir = tests/Polyhedron
+DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+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) \
+ bhrz03widening1$(EXEEXT) bhrz03widening2$(EXEEXT) \
+ bhrz03widening3$(EXEEXT) bhz03widening1$(EXEEXT) \
+ bounded1$(EXEEXT) boundedaffineimage1$(EXEEXT) \
+ boundedaffinepreimage1$(EXEEXT) \
+ boundedbhrz03extrapolation1$(EXEEXT) \
+ boundedh79extrapolation1$(EXEEXT) boundingbox1$(EXEEXT) \
+ boundingbox2$(EXEEXT) boundingbox3$(EXEEXT) bounds1$(EXEEXT) \
+ cnncconversion1$(EXEEXT) concatenate1$(EXEEXT) \
+ congruences1$(EXEEXT) constraints1$(EXEEXT) contains1$(EXEEXT) \
+ contains2$(EXEEXT) disjoint1$(EXEEXT) disjoint2$(EXEEXT) \
+ dualhypercubes$(EXEEXT) empty1$(EXEEXT) equals1$(EXEEXT) \
+ exceptions1$(EXEEXT) exceptions2$(EXEEXT) exceptions3$(EXEEXT) \
+ expandspacedim1$(EXEEXT) expandspacedim2$(EXEEXT) \
+ foldspacedims1$(EXEEXT) foldspacedims2$(EXEEXT) \
+ generalizedaffineimage1$(EXEEXT) \
+ generalizedaffineimage2$(EXEEXT) \
+ generalizedaffinepreimage1$(EXEEXT) \
+ generalizedaffinepreimage2$(EXEEXT) generators1$(EXEEXT) \
+ geomcovers1$(EXEEXT) h79widening1$(EXEEXT) \
+ h79widening2$(EXEEXT) intersection1$(EXEEXT) \
+ limitedbhrz03extrapolation1$(EXEEXT) \
+ limitedh79extrapolation1$(EXEEXT) linearpartition1$(EXEEXT) \
+ linexpression1$(EXEEXT) linearsystem1$(EXEEXT) \
+ lpproblem1$(EXEEXT) mapspacedims1$(EXEEXT) matrix1$(EXEEXT) \
+ max_min1$(EXEEXT) maxspacedim1$(EXEEXT) mc91$(EXEEXT) \
+ membytes1$(EXEEXT) membytes2$(EXEEXT) memory1$(EXEEXT) \
+ memory2$(EXEEXT) minconstraints1$(EXEEXT) \
+ minconstraints2$(EXEEXT) mingenerators1$(EXEEXT) \
+ mingenerators2$(EXEEXT) nncminimize1$(EXEEXT) \
+ nncminimize2$(EXEEXT) numberinput1$(EXEEXT) onepoint$(EXEEXT) \
+ permute$(EXEEXT) polydifference1$(EXEEXT) \
+ polydifference2$(EXEEXT) polyhull1$(EXEEXT) polyhull2$(EXEEXT) \
+ polypowerset1$(EXEEXT) powerset1$(EXEEXT) randphull1$(EXEEXT) \
+ randphull2$(EXEEXT) relations1$(EXEEXT) relations2$(EXEEXT) \
+ relations3$(EXEEXT) removespacedims1$(EXEEXT) \
+ removespacedims2$(EXEEXT) smm1$(EXEEXT) timeelapse1$(EXEEXT) \
+ timeelapse2$(EXEEXT) topclosed1$(EXEEXT) topclosure1$(EXEEXT) \
+ universe1$(EXEEXT) universe2$(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_boundingbox1$(EXEEXT) nnc_boundingbox2$(EXEEXT) \
+ nnc_bounds1$(EXEEXT) nnc_concatenate1$(EXEEXT) \
+ nnc_congruences1$(EXEEXT) nnc_constraints1$(EXEEXT) \
+ nnc_contains1$(EXEEXT) nnc_disjoint1$(EXEEXT) \
+ nnc_empty1$(EXEEXT) nnc_equals1$(EXEEXT) \
+ nnc_exceptions1$(EXEEXT) nnc_exceptions3$(EXEEXT) \
+ nnc_expandspacedim1$(EXEEXT) nnc_foldspacedims1$(EXEEXT) \
+ nnc_generalizedaffineimage1$(EXEEXT) \
+ nnc_generalizedaffinepreimage1$(EXEEXT) \
+ nnc_generators1$(EXEEXT) nnc_geomcovers1$(EXEEXT) \
+ nnc_h79widening1$(EXEEXT) nnc_intersection1$(EXEEXT) \
+ nnc_limitedbhrz03extrapolation1$(EXEEXT) \
+ nnc_limitedh79extrapolation1$(EXEEXT) \
+ nnc_linearpartition1$(EXEEXT) nnc_mapspacedims1$(EXEEXT) \
+ nnc_max_min1$(EXEEXT) nnc_mc91$(EXEEXT) nnc_membytes1$(EXEEXT) \
+ nnc_membytes2$(EXEEXT) nnc_minconstraints1$(EXEEXT) \
+ nnc_mingenerators1$(EXEEXT) nnc_onepoint$(EXEEXT) \
+ nnc_permute$(EXEEXT) nnc_polydifference1$(EXEEXT) \
+ nnc_polyhull1$(EXEEXT) nnc_randphull1$(EXEEXT) \
+ nnc_randphull2$(EXEEXT) nnc_relations1$(EXEEXT) \
+ nnc_relations2$(EXEEXT) nnc_removespacedims1$(EXEEXT) \
+ nnc_smm1$(EXEEXT) nnc_timeelapse1$(EXEEXT) \
+ nnc_universe1$(EXEEXT) nnc_writepolyhedron1$(EXEEXT)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am__EXEEXT_3 = watchdog1$(EXEEXT)
+am__EXEEXT_4 = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
+am__EXEEXT_5 = bug2$(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_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_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_boundingbox1_OBJECTS = boundingbox1.$(OBJEXT)
+boundingbox1_OBJECTS = $(am_boundingbox1_OBJECTS)
+boundingbox1_LDADD = $(LDADD)
+boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundingbox2_OBJECTS = boundingbox2.$(OBJEXT)
+boundingbox2_OBJECTS = $(am_boundingbox2_OBJECTS)
+boundingbox2_LDADD = $(LDADD)
+boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_boundingbox3_OBJECTS = boundingbox3.$(OBJEXT)
+boundingbox3_OBJECTS = $(am_boundingbox3_OBJECTS)
+boundingbox3_LDADD = $(LDADD)
+boundingbox3_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_bug2_OBJECTS = bug2-bug2.$(OBJEXT)
+bug2_OBJECTS = $(am_bug2_OBJECTS)
+bug2_LDADD = $(LDADD)
+bug2_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_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_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_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_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_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_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_linexpression1_OBJECTS = linexpression1.$(OBJEXT)
+linexpression1_OBJECTS = $(am_linexpression1_OBJECTS)
+linexpression1_LDADD = $(LDADD)
+linexpression1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_lpproblem1_OBJECTS = lpproblem1.$(OBJEXT)
+lpproblem1_OBJECTS = $(am_lpproblem1_OBJECTS)
+lpproblem1_LDADD = $(LDADD)
+lpproblem1_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_membytes2_OBJECTS = membytes2.$(OBJEXT)
+membytes2_OBJECTS = $(am_membytes2_OBJECTS)
+membytes2_LDADD = $(LDADD)
+membytes2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_memory1_OBJECTS = memory1.$(OBJEXT)
+memory1_OBJECTS = $(am_memory1_OBJECTS)
+memory1_LDADD = $(LDADD)
+memory1_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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+am_nnc_boundingbox1_OBJECTS = nnc_boundingbox1-boundingbox1.$(OBJEXT)
+nnc_boundingbox1_OBJECTS = $(am_nnc_boundingbox1_OBJECTS)
+nnc_boundingbox1_LDADD = $(LDADD)
+nnc_boundingbox1_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+am_nnc_boundingbox2_OBJECTS = nnc_boundingbox2-boundingbox2.$(OBJEXT)
+nnc_boundingbox2_OBJECTS = $(am_nnc_boundingbox2_OBJECTS)
+nnc_boundingbox2_LDADD = $(LDADD)
+nnc_boundingbox2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+am_nnc_membytes2_OBJECTS = nnc_membytes2-membytes2.$(OBJEXT)
+nnc_membytes2_OBJECTS = $(am_nnc_membytes2_OBJECTS)
+nnc_membytes2_LDADD = $(LDADD)
+nnc_membytes2_DEPENDENCIES = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+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
+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
+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
+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
+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
+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
+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
+am_nnc_randphull2_OBJECTS = nnc_randphull2-randphull2.$(OBJEXT)
+nnc_randphull2_OBJECTS = $(am_nnc_randphull2_OBJECTS)
+am__DEPENDENCIES_1 = $(top_builddir)/utils/libppl_utils.a \
+ $(top_builddir)/tests/libppl_tests.a \
+ $(top_builddir)/src/libppl.la
+nnc_randphull2_DEPENDENCIES = $(am__DEPENDENCIES_1)
+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
+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
+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
+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
+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
+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
+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
+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_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_polypowerset1_OBJECTS = polypowerset1.$(OBJEXT)
+polypowerset1_OBJECTS = $(am_polypowerset1_OBJECTS)
+polypowerset1_LDADD = $(LDADD)
+polypowerset1_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_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_randphull2_OBJECTS = randphull2.$(OBJEXT)
+randphull2_OBJECTS = $(am_randphull2_OBJECTS)
+randphull2_DEPENDENCIES = $(am__DEPENDENCIES_1)
+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_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_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_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__watchdog1_SOURCES_DIST = watchdog1.cc
+am__objects_1 = watchdog1.$(OBJEXT)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@am_watchdog1_OBJECTS = $(am__objects_1)
+watchdog1_OBJECTS = $(am_watchdog1_OBJECTS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_DEPENDENCIES = \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ $(am__DEPENDENCIES_1) \
+ at BUILD_WATCHDOG_LIBRARY_TRUE@ $(top_builddir)/Watchdog/src/libpwl.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
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+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) \
+ $(bhrz03widening1_SOURCES) $(bhrz03widening2_SOURCES) \
+ $(bhrz03widening3_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) \
+ $(boundedbhrz03extrapolation1_SOURCES) \
+ $(boundedh79extrapolation1_SOURCES) $(boundingbox1_SOURCES) \
+ $(boundingbox2_SOURCES) $(boundingbox3_SOURCES) \
+ $(bounds1_SOURCES) $(bug2_SOURCES) $(cnncconversion1_SOURCES) \
+ $(concatenate1_SOURCES) $(congruences1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(contains2_SOURCES) $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+ $(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \
+ $(exceptions1_SOURCES) $(exceptions2_SOURCES) \
+ $(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \
+ $(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \
+ $(foldspacedims2_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+ $(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+ $(h79widening2_SOURCES) $(intersection1_SOURCES) \
+ $(limitedbhrz03extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) \
+ $(linearpartition1_SOURCES) $(linearsystem1_SOURCES) \
+ $(linexpression1_SOURCES) $(lpproblem1_SOURCES) \
+ $(mapspacedims1_SOURCES) $(matrix1_SOURCES) \
+ $(max_min1_SOURCES) $(maxspacedim1_SOURCES) $(mc91_SOURCES) \
+ $(membytes1_SOURCES) $(membytes2_SOURCES) $(memory1_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_boundingbox1_SOURCES) $(nnc_boundingbox2_SOURCES) \
+ $(nnc_bounds1_SOURCES) $(nnc_concatenate1_SOURCES) \
+ $(nnc_congruences1_SOURCES) $(nnc_constraints1_SOURCES) \
+ $(nnc_contains1_SOURCES) $(nnc_disjoint1_SOURCES) \
+ $(nnc_empty1_SOURCES) $(nnc_equals1_SOURCES) \
+ $(nnc_exceptions1_SOURCES) $(nnc_exceptions3_SOURCES) \
+ $(nnc_expandspacedim1_SOURCES) $(nnc_foldspacedims1_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_membytes2_SOURCES) \
+ $(nnc_minconstraints1_SOURCES) $(nnc_mingenerators1_SOURCES) \
+ $(nnc_onepoint_SOURCES) $(nnc_permute_SOURCES) \
+ $(nnc_polydifference1_SOURCES) $(nnc_polyhull1_SOURCES) \
+ $(nnc_randphull1_SOURCES) $(nnc_randphull2_SOURCES) \
+ $(nnc_relations1_SOURCES) $(nnc_relations2_SOURCES) \
+ $(nnc_removespacedims1_SOURCES) $(nnc_smm1_SOURCES) \
+ $(nnc_timeelapse1_SOURCES) $(nnc_universe1_SOURCES) \
+ $(nnc_writepolyhedron1_SOURCES) $(nncminimize1_SOURCES) \
+ $(nncminimize2_SOURCES) $(numberinput1_SOURCES) \
+ $(onepoint_SOURCES) $(permute_SOURCES) \
+ $(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+ $(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+ $(polypowerset1_SOURCES) $(powerset1_SOURCES) \
+ $(randphull1_SOURCES) $(randphull2_SOURCES) \
+ $(relations1_SOURCES) $(relations2_SOURCES) \
+ $(relations3_SOURCES) $(removespacedims1_SOURCES) \
+ $(removespacedims2_SOURCES) $(smm1_SOURCES) \
+ $(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \
+ $(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+ $(universe1_SOURCES) $(universe2_SOURCES) $(watchdog1_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) \
+ $(bhrz03widening1_SOURCES) $(bhrz03widening2_SOURCES) \
+ $(bhrz03widening3_SOURCES) $(bhz03widening1_SOURCES) \
+ $(bounded1_SOURCES) $(boundedaffineimage1_SOURCES) \
+ $(boundedaffinepreimage1_SOURCES) \
+ $(boundedbhrz03extrapolation1_SOURCES) \
+ $(boundedh79extrapolation1_SOURCES) $(boundingbox1_SOURCES) \
+ $(boundingbox2_SOURCES) $(boundingbox3_SOURCES) \
+ $(bounds1_SOURCES) $(bug2_SOURCES) $(cnncconversion1_SOURCES) \
+ $(concatenate1_SOURCES) $(congruences1_SOURCES) \
+ $(constraints1_SOURCES) $(contains1_SOURCES) \
+ $(contains2_SOURCES) $(disjoint1_SOURCES) $(disjoint2_SOURCES) \
+ $(dualhypercubes_SOURCES) $(empty1_SOURCES) $(equals1_SOURCES) \
+ $(exceptions1_SOURCES) $(exceptions2_SOURCES) \
+ $(exceptions3_SOURCES) $(expandspacedim1_SOURCES) \
+ $(expandspacedim2_SOURCES) $(foldspacedims1_SOURCES) \
+ $(foldspacedims2_SOURCES) $(generalizedaffineimage1_SOURCES) \
+ $(generalizedaffineimage2_SOURCES) \
+ $(generalizedaffinepreimage1_SOURCES) \
+ $(generalizedaffinepreimage2_SOURCES) $(generators1_SOURCES) \
+ $(geomcovers1_SOURCES) $(h79widening1_SOURCES) \
+ $(h79widening2_SOURCES) $(intersection1_SOURCES) \
+ $(limitedbhrz03extrapolation1_SOURCES) \
+ $(limitedh79extrapolation1_SOURCES) \
+ $(linearpartition1_SOURCES) $(linearsystem1_SOURCES) \
+ $(linexpression1_SOURCES) $(lpproblem1_SOURCES) \
+ $(mapspacedims1_SOURCES) $(matrix1_SOURCES) \
+ $(max_min1_SOURCES) $(maxspacedim1_SOURCES) $(mc91_SOURCES) \
+ $(membytes1_SOURCES) $(membytes2_SOURCES) $(memory1_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_boundingbox1_SOURCES) $(nnc_boundingbox2_SOURCES) \
+ $(nnc_bounds1_SOURCES) $(nnc_concatenate1_SOURCES) \
+ $(nnc_congruences1_SOURCES) $(nnc_constraints1_SOURCES) \
+ $(nnc_contains1_SOURCES) $(nnc_disjoint1_SOURCES) \
+ $(nnc_empty1_SOURCES) $(nnc_equals1_SOURCES) \
+ $(nnc_exceptions1_SOURCES) $(nnc_exceptions3_SOURCES) \
+ $(nnc_expandspacedim1_SOURCES) $(nnc_foldspacedims1_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_membytes2_SOURCES) \
+ $(nnc_minconstraints1_SOURCES) $(nnc_mingenerators1_SOURCES) \
+ $(nnc_onepoint_SOURCES) $(nnc_permute_SOURCES) \
+ $(nnc_polydifference1_SOURCES) $(nnc_polyhull1_SOURCES) \
+ $(nnc_randphull1_SOURCES) $(nnc_randphull2_SOURCES) \
+ $(nnc_relations1_SOURCES) $(nnc_relations2_SOURCES) \
+ $(nnc_removespacedims1_SOURCES) $(nnc_smm1_SOURCES) \
+ $(nnc_timeelapse1_SOURCES) $(nnc_universe1_SOURCES) \
+ $(nnc_writepolyhedron1_SOURCES) $(nncminimize1_SOURCES) \
+ $(nncminimize2_SOURCES) $(numberinput1_SOURCES) \
+ $(onepoint_SOURCES) $(permute_SOURCES) \
+ $(polydifference1_SOURCES) $(polydifference2_SOURCES) \
+ $(polyhull1_SOURCES) $(polyhull2_SOURCES) \
+ $(polypowerset1_SOURCES) $(powerset1_SOURCES) \
+ $(randphull1_SOURCES) $(randphull2_SOURCES) \
+ $(relations1_SOURCES) $(relations2_SOURCES) \
+ $(relations3_SOURCES) $(removespacedims1_SOURCES) \
+ $(removespacedims2_SOURCES) $(smm1_SOURCES) \
+ $(timeelapse1_SOURCES) $(timeelapse2_SOURCES) \
+ $(topclosed1_SOURCES) $(topclosure1_SOURCES) \
+ $(universe1_SOURCES) $(universe2_SOURCES) \
+ $(am__watchdog1_SOURCES_DIST) $(writeconsys1_SOURCES) \
+ $(writegensys1_SOURCES) $(writepolyhedron1_SOURCES) \
+ $(writepolyhedron2_SOURCES) $(writerelation1_SOURCES) \
+ $(writevariable1_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_prolog@
+CHECKER =
+#CHECKER = valgrind --tool=memcheck -q --trace-children=yes --leak-check=yes --num-callers=100 --leak-resolution=high --suppressions=$(top_srcdir)/tests/valgrind_suppressions
+TESTS_ENVIRONMENT = $(CHECKER)
+AM_CPPFLAGS = \
+-I$(top_builddir)/src \
+-I$(top_builddir)/Watchdog \
+-I$(top_builddir)/Watchdog/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 \
+ bhrz03widening1 bhrz03widening2 bhrz03widening3 \
+ bhz03widening1 \
+ bounded1 \
+ boundedaffineimage1 \
+ boundedaffinepreimage1 \
+ boundedbhrz03extrapolation1 \
+ boundedh79extrapolation1 \
+ boundingbox1 boundingbox2 boundingbox3 \
+ bounds1 \
+ cnncconversion1 \
+ concatenate1 \
+ congruences1 \
+ constraints1 \
+ contains1 contains2 \
+ disjoint1 disjoint2 \
+ dualhypercubes \
+ empty1 \
+ equals1 \
+ exceptions1 exceptions2 exceptions3 \
+ expandspacedim1 expandspacedim2 \
+ foldspacedims1 foldspacedims2 \
+ generalizedaffineimage1 generalizedaffineimage2 \
+ generalizedaffinepreimage1 generalizedaffinepreimage2 \
+ generators1 \
+ geomcovers1 \
+ h79widening1 h79widening2 \
+ intersection1 \
+ limitedbhrz03extrapolation1 \
+ limitedh79extrapolation1 \
+ linearpartition1 \
+ linexpression1 \
+ linearsystem1 \
+ lpproblem1 \
+ mapspacedims1 \
+ matrix1 \
+ max_min1 \
+ maxspacedim1 \
+ mc91 \
+ membytes1 membytes2 \
+ memory1 memory2 \
+ minconstraints1 minconstraints2 \
+ mingenerators1 mingenerators2 \
+ nncminimize1 nncminimize2 \
+ numberinput1 \
+ onepoint \
+ permute \
+ polydifference1 polydifference2 \
+ polyhull1 polyhull2 \
+ polypowerset1 \
+ powerset1 \
+ randphull1 randphull2 \
+ relations1 relations2 relations3 \
+ removespacedims1 removespacedims2 \
+ smm1 \
+ timeelapse1 timeelapse2 \
+ topclosed1 \
+ topclosure1 \
+ universe1 universe2 \
+ 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_boundingbox1 nnc_boundingbox2 \
+ nnc_bounds1 \
+ nnc_concatenate1 \
+ nnc_congruences1 \
+ nnc_constraints1 \
+ nnc_contains1 \
+ nnc_disjoint1 \
+ nnc_empty1 \
+ nnc_equals1 \
+ nnc_exceptions1 nnc_exceptions3 \
+ nnc_expandspacedim1 \
+ nnc_foldspacedims1 \
+ nnc_generalizedaffineimage1 \
+ nnc_generalizedaffinepreimage1 \
+ nnc_generators1 \
+ nnc_geomcovers1 \
+ nnc_h79widening1 \
+ nnc_intersection1 \
+ nnc_limitedbhrz03extrapolation1 \
+ nnc_limitedh79extrapolation1 \
+ nnc_linearpartition1 \
+ nnc_mapspacedims1 \
+ nnc_max_min1 \
+ nnc_mc91 \
+ nnc_membytes1 nnc_membytes2 \
+ nnc_minconstraints1 \
+ nnc_mingenerators1 \
+ nnc_onepoint \
+ nnc_permute \
+ nnc_polydifference1 \
+ nnc_polyhull1 \
+ nnc_randphull1 nnc_randphull2 \
+ nnc_relations1 nnc_relations2 \
+ nnc_removespacedims1 \
+ nnc_smm1 \
+ nnc_timeelapse1 \
+ nnc_universe1 \
+ 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
+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
+boundingbox1_SOURCES = boundingbox1.cc
+boundingbox2_SOURCES = boundingbox2.cc
+boundingbox3_SOURCES = boundingbox3.cc
+bounds1_SOURCES = bounds1.cc
+cnncconversion1_SOURCES = cnncconversion1.cc
+concatenate1_SOURCES = concatenate1.cc
+congruences1_SOURCES = congruences1.cc
+constraints1_SOURCES = constraints1.cc
+contains1_SOURCES = contains1.cc
+contains2_SOURCES = contains2.cc
+disjoint1_SOURCES = disjoint1.cc
+disjoint2_SOURCES = disjoint2.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
+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
+intersection1_SOURCES = intersection1.cc
+limitedbhrz03extrapolation1_SOURCES = limitedbhrz03extrapolation1.cc
+limitedh79extrapolation1_SOURCES = limitedh79extrapolation1.cc
+linearpartition1_SOURCES = linearpartition1.cc
+linexpression1_SOURCES = linexpression1.cc
+linearsystem1_SOURCES = linearsystem1.cc
+lpproblem1_SOURCES = lpproblem1.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
+membytes2_SOURCES = membytes2.cc
+memory1_SOURCES = memory1.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
+onepoint_SOURCES = onepoint.cc
+permute_SOURCES = permute.cc
+polydifference1_SOURCES = polydifference1.cc
+polydifference2_SOURCES = polydifference2.cc
+polyhull1_SOURCES = polyhull1.cc
+polyhull2_SOURCES = polyhull2.cc
+polypowerset1_SOURCES = polypowerset1.cc
+powerset1_SOURCES = powerset1.cc
+randphull1_SOURCES = randphull1.cc
+randphull2_SOURCES = randphull2.cc
+randphull2_LDADD = $(LDADD) -lm
+relations1_SOURCES = relations1.cc
+relations2_SOURCES = relations2.cc
+relations3_SOURCES = relations3.cc
+removespacedims1_SOURCES = removespacedims1.cc
+removespacedims2_SOURCES = removespacedims2.cc
+smm1_SOURCES = smm1.cc
+timeelapse1_SOURCES = timeelapse1.cc
+timeelapse2_SOURCES = timeelapse2.cc
+topclosed1_SOURCES = topclosed1.cc
+topclosure1_SOURCES = topclosure1.cc
+universe1_SOURCES = universe1.cc
+universe2_SOURCES = universe2.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_boundingbox1_SOURCES = boundingbox1.cc
+nnc_boundingbox1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_boundingbox2_SOURCES = boundingbox2.cc
+nnc_boundingbox2_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_constraints1_SOURCES = constraints1.cc
+nnc_constraints1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_contains1_SOURCES = contains1.cc
+nnc_contains1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_disjoint1_SOURCES = disjoint1.cc
+nnc_disjoint1_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_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_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_membytes2_SOURCES = membytes2.cc
+nnc_membytes2_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_randphull1_SOURCES = randphull1.cc
+nnc_randphull1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_SOURCES = randphull2.cc
+nnc_randphull2_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_randphull2_LDADD = $(LDADD) -lm
+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_universe1_SOURCES = universe1.cc
+nnc_universe1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+nnc_writepolyhedron1_SOURCES = writepolyhedron1.cc
+nnc_writepolyhedron1_CXXFLAGS = $(DERIVED_CXXFLAGS)
+watchdog1_SRCS = watchdog1.cc
+ at BUILD_WATCHDOG_LIBRARY_TRUE@WATCHDOG_TESTS = watchdog1
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_SOURCES = $(watchdog1_SRCS)
+ at BUILD_WATCHDOG_LIBRARY_TRUE@watchdog1_LDADD = $(LDADD) $(top_builddir)/Watchdog/src/libpwl.la
+TESTS = $(ORIGINAL_TESTS) $(DERIVED_TESTS) $(WATCHDOG_TESTS)
+XFAIL_ALWAYS =
+XFAIL_WITH_INT64 = \
+$(XFAIL_ALWAYS) \
+randphull2 \
+nnc_randphull2
+
+XFAIL_WITH_INT32 = \
+$(XFAIL_WITH_INT64)
+
+XFAIL_WITH_INT16 = \
+$(XFAIL_WITH_INT32)
+
+XFAIL_WITH_INT8 = \
+$(XFAIL_WITH_INT16) \
+membytes1 \
+randphull1 \
+smm1 \
+nnc_membytes1 \
+nnc_randphull1 \
+nnc_smm1
+
+XFAIL_WITH_INT8_A = \
+$(XFAIL_WITH_INT8) \
+membytes2 \
+nnc_membytes2
+
+ at ASSERTIONS_ENABLED_FALSE@@USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8)
+ at ASSERTIONS_ENABLED_TRUE@@USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_TRUE at XFAIL_SET = $(XFAIL_WITH_INT8_A)
+ at USE_INT16_FALSE@@USE_INT32_FALSE@@USE_INT64_FALSE@@USE_INT8_FALSE at XFAIL_SET = $(XFAIL_ALWAYS)
+ at USE_INT16_TRUE@@USE_INT32_FALSE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT16)
+ at USE_INT32_TRUE@@USE_INT64_FALSE at XFAIL_SET = $(XFAIL_WITH_INT32)
+ at USE_INT64_TRUE@XFAIL_SET = $(XFAIL_WITH_INT64)
+XFAIL_TESTS = $(XFAIL_SET)
+EXTRA_DIST = $(watchdog1_SRCS)
+BUGS = bug2
+bug2_SOURCES = bug2.cc
+bug2_CXXFLAGS = -DSRCDIR=\"$(srcdir)\"
+MOSTLYCLEANFILES = \
+ascii_dump_load1.dat \
+ascii_dump_load2.dat \
+ascii_dump_load3.dat \
+matrix1.dat \
+linearsystem1.dat \
+writeconsys1.dat \
+writegensys1.dat \
+writepolyhedron1.dat \
+writepolyhedron2.dat \
+writerelation1.dat \
+writevariable1.dat
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign tests/Polyhedron/Makefile'; \
+ 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
+
+clean-checkPROGRAMS:
+ @list='$(check_PROGRAMS)'; for p in $$list; do \
+ f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f $$p $$f"; \
+ rm -f $$p $$f ; \
+ done
+addcongruence1$(EXEEXT): $(addcongruence1_OBJECTS) $(addcongruence1_DEPENDENCIES)
+ @rm -f addcongruence1$(EXEEXT)
+ $(CXXLINK) $(addcongruence1_LDFLAGS) $(addcongruence1_OBJECTS) $(addcongruence1_LDADD) $(LIBS)
+addcongruences1$(EXEEXT): $(addcongruences1_OBJECTS) $(addcongruences1_DEPENDENCIES)
+ @rm -f addcongruences1$(EXEEXT)
+ $(CXXLINK) $(addcongruences1_LDFLAGS) $(addcongruences1_OBJECTS) $(addcongruences1_LDADD) $(LIBS)
+addconstraint1$(EXEEXT): $(addconstraint1_OBJECTS) $(addconstraint1_DEPENDENCIES)
+ @rm -f addconstraint1$(EXEEXT)
+ $(CXXLINK) $(addconstraint1_LDFLAGS) $(addconstraint1_OBJECTS) $(addconstraint1_LDADD) $(LIBS)
+addconstraints1$(EXEEXT): $(addconstraints1_OBJECTS) $(addconstraints1_DEPENDENCIES)
+ @rm -f addconstraints1$(EXEEXT)
+ $(CXXLINK) $(addconstraints1_LDFLAGS) $(addconstraints1_OBJECTS) $(addconstraints1_LDADD) $(LIBS)
+addconstraints2$(EXEEXT): $(addconstraints2_OBJECTS) $(addconstraints2_DEPENDENCIES)
+ @rm -f addconstraints2$(EXEEXT)
+ $(CXXLINK) $(addconstraints2_LDFLAGS) $(addconstraints2_OBJECTS) $(addconstraints2_LDADD) $(LIBS)
+addgenerator1$(EXEEXT): $(addgenerator1_OBJECTS) $(addgenerator1_DEPENDENCIES)
+ @rm -f addgenerator1$(EXEEXT)
+ $(CXXLINK) $(addgenerator1_LDFLAGS) $(addgenerator1_OBJECTS) $(addgenerator1_LDADD) $(LIBS)
+addgenerator2$(EXEEXT): $(addgenerator2_OBJECTS) $(addgenerator2_DEPENDENCIES)
+ @rm -f addgenerator2$(EXEEXT)
+ $(CXXLINK) $(addgenerator2_LDFLAGS) $(addgenerator2_OBJECTS) $(addgenerator2_LDADD) $(LIBS)
+addgenerators1$(EXEEXT): $(addgenerators1_OBJECTS) $(addgenerators1_DEPENDENCIES)
+ @rm -f addgenerators1$(EXEEXT)
+ $(CXXLINK) $(addgenerators1_LDFLAGS) $(addgenerators1_OBJECTS) $(addgenerators1_LDADD) $(LIBS)
+addgenerators2$(EXEEXT): $(addgenerators2_OBJECTS) $(addgenerators2_DEPENDENCIES)
+ @rm -f addgenerators2$(EXEEXT)
+ $(CXXLINK) $(addgenerators2_LDFLAGS) $(addgenerators2_OBJECTS) $(addgenerators2_LDADD) $(LIBS)
+addspacedims1$(EXEEXT): $(addspacedims1_OBJECTS) $(addspacedims1_DEPENDENCIES)
+ @rm -f addspacedims1$(EXEEXT)
+ $(CXXLINK) $(addspacedims1_LDFLAGS) $(addspacedims1_OBJECTS) $(addspacedims1_LDADD) $(LIBS)
+addspacedims2$(EXEEXT): $(addspacedims2_OBJECTS) $(addspacedims2_DEPENDENCIES)
+ @rm -f addspacedims2$(EXEEXT)
+ $(CXXLINK) $(addspacedims2_LDFLAGS) $(addspacedims2_OBJECTS) $(addspacedims2_LDADD) $(LIBS)
+affineimage1$(EXEEXT): $(affineimage1_OBJECTS) $(affineimage1_DEPENDENCIES)
+ @rm -f affineimage1$(EXEEXT)
+ $(CXXLINK) $(affineimage1_LDFLAGS) $(affineimage1_OBJECTS) $(affineimage1_LDADD) $(LIBS)
+affineimage2$(EXEEXT): $(affineimage2_OBJECTS) $(affineimage2_DEPENDENCIES)
+ @rm -f affineimage2$(EXEEXT)
+ $(CXXLINK) $(affineimage2_LDFLAGS) $(affineimage2_OBJECTS) $(affineimage2_LDADD) $(LIBS)
+affinepreimage1$(EXEEXT): $(affinepreimage1_OBJECTS) $(affinepreimage1_DEPENDENCIES)
+ @rm -f affinepreimage1$(EXEEXT)
+ $(CXXLINK) $(affinepreimage1_LDFLAGS) $(affinepreimage1_OBJECTS) $(affinepreimage1_LDADD) $(LIBS)
+affinetrans$(EXEEXT): $(affinetrans_OBJECTS) $(affinetrans_DEPENDENCIES)
+ @rm -f affinetrans$(EXEEXT)
+ $(CXXLINK) $(affinetrans_LDFLAGS) $(affinetrans_OBJECTS) $(affinetrans_LDADD) $(LIBS)
+append1$(EXEEXT): $(append1_OBJECTS) $(append1_DEPENDENCIES)
+ @rm -f append1$(EXEEXT)
+ $(CXXLINK) $(append1_LDFLAGS) $(append1_OBJECTS) $(append1_LDADD) $(LIBS)
+append2$(EXEEXT): $(append2_OBJECTS) $(append2_DEPENDENCIES)
+ @rm -f append2$(EXEEXT)
+ $(CXXLINK) $(append2_LDFLAGS) $(append2_OBJECTS) $(append2_LDADD) $(LIBS)
+ascii_dump_load1$(EXEEXT): $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_DEPENDENCIES)
+ @rm -f ascii_dump_load1$(EXEEXT)
+ $(CXXLINK) $(ascii_dump_load1_LDFLAGS) $(ascii_dump_load1_OBJECTS) $(ascii_dump_load1_LDADD) $(LIBS)
+ascii_dump_load2$(EXEEXT): $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_DEPENDENCIES)
+ @rm -f ascii_dump_load2$(EXEEXT)
+ $(CXXLINK) $(ascii_dump_load2_LDFLAGS) $(ascii_dump_load2_OBJECTS) $(ascii_dump_load2_LDADD) $(LIBS)
+ascii_dump_load3$(EXEEXT): $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_DEPENDENCIES)
+ @rm -f ascii_dump_load3$(EXEEXT)
+ $(CXXLINK) $(ascii_dump_load3_LDFLAGS) $(ascii_dump_load3_OBJECTS) $(ascii_dump_load3_LDADD) $(LIBS)
+bgp99extrapolation1$(EXEEXT): $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_DEPENDENCIES)
+ @rm -f bgp99extrapolation1$(EXEEXT)
+ $(CXXLINK) $(bgp99extrapolation1_LDFLAGS) $(bgp99extrapolation1_OBJECTS) $(bgp99extrapolation1_LDADD) $(LIBS)
+bhrz03widening1$(EXEEXT): $(bhrz03widening1_OBJECTS) $(bhrz03widening1_DEPENDENCIES)
+ @rm -f bhrz03widening1$(EXEEXT)
+ $(CXXLINK) $(bhrz03widening1_LDFLAGS) $(bhrz03widening1_OBJECTS) $(bhrz03widening1_LDADD) $(LIBS)
+bhrz03widening2$(EXEEXT): $(bhrz03widening2_OBJECTS) $(bhrz03widening2_DEPENDENCIES)
+ @rm -f bhrz03widening2$(EXEEXT)
+ $(CXXLINK) $(bhrz03widening2_LDFLAGS) $(bhrz03widening2_OBJECTS) $(bhrz03widening2_LDADD) $(LIBS)
+bhrz03widening3$(EXEEXT): $(bhrz03widening3_OBJECTS) $(bhrz03widening3_DEPENDENCIES)
+ @rm -f bhrz03widening3$(EXEEXT)
+ $(CXXLINK) $(bhrz03widening3_LDFLAGS) $(bhrz03widening3_OBJECTS) $(bhrz03widening3_LDADD) $(LIBS)
+bhz03widening1$(EXEEXT): $(bhz03widening1_OBJECTS) $(bhz03widening1_DEPENDENCIES)
+ @rm -f bhz03widening1$(EXEEXT)
+ $(CXXLINK) $(bhz03widening1_LDFLAGS) $(bhz03widening1_OBJECTS) $(bhz03widening1_LDADD) $(LIBS)
+bounded1$(EXEEXT): $(bounded1_OBJECTS) $(bounded1_DEPENDENCIES)
+ @rm -f bounded1$(EXEEXT)
+ $(CXXLINK) $(bounded1_LDFLAGS) $(bounded1_OBJECTS) $(bounded1_LDADD) $(LIBS)
+boundedaffineimage1$(EXEEXT): $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_DEPENDENCIES)
+ @rm -f boundedaffineimage1$(EXEEXT)
+ $(CXXLINK) $(boundedaffineimage1_LDFLAGS) $(boundedaffineimage1_OBJECTS) $(boundedaffineimage1_LDADD) $(LIBS)
+boundedaffinepreimage1$(EXEEXT): $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f boundedaffinepreimage1$(EXEEXT)
+ $(CXXLINK) $(boundedaffinepreimage1_LDFLAGS) $(boundedaffinepreimage1_OBJECTS) $(boundedaffinepreimage1_LDADD) $(LIBS)
+boundedbhrz03extrapolation1$(EXEEXT): $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f boundedbhrz03extrapolation1$(EXEEXT)
+ $(CXXLINK) $(boundedbhrz03extrapolation1_LDFLAGS) $(boundedbhrz03extrapolation1_OBJECTS) $(boundedbhrz03extrapolation1_LDADD) $(LIBS)
+boundedh79extrapolation1$(EXEEXT): $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_DEPENDENCIES)
+ @rm -f boundedh79extrapolation1$(EXEEXT)
+ $(CXXLINK) $(boundedh79extrapolation1_LDFLAGS) $(boundedh79extrapolation1_OBJECTS) $(boundedh79extrapolation1_LDADD) $(LIBS)
+boundingbox1$(EXEEXT): $(boundingbox1_OBJECTS) $(boundingbox1_DEPENDENCIES)
+ @rm -f boundingbox1$(EXEEXT)
+ $(CXXLINK) $(boundingbox1_LDFLAGS) $(boundingbox1_OBJECTS) $(boundingbox1_LDADD) $(LIBS)
+boundingbox2$(EXEEXT): $(boundingbox2_OBJECTS) $(boundingbox2_DEPENDENCIES)
+ @rm -f boundingbox2$(EXEEXT)
+ $(CXXLINK) $(boundingbox2_LDFLAGS) $(boundingbox2_OBJECTS) $(boundingbox2_LDADD) $(LIBS)
+boundingbox3$(EXEEXT): $(boundingbox3_OBJECTS) $(boundingbox3_DEPENDENCIES)
+ @rm -f boundingbox3$(EXEEXT)
+ $(CXXLINK) $(boundingbox3_LDFLAGS) $(boundingbox3_OBJECTS) $(boundingbox3_LDADD) $(LIBS)
+bounds1$(EXEEXT): $(bounds1_OBJECTS) $(bounds1_DEPENDENCIES)
+ @rm -f bounds1$(EXEEXT)
+ $(CXXLINK) $(bounds1_LDFLAGS) $(bounds1_OBJECTS) $(bounds1_LDADD) $(LIBS)
+bug2$(EXEEXT): $(bug2_OBJECTS) $(bug2_DEPENDENCIES)
+ @rm -f bug2$(EXEEXT)
+ $(CXXLINK) $(bug2_LDFLAGS) $(bug2_OBJECTS) $(bug2_LDADD) $(LIBS)
+cnncconversion1$(EXEEXT): $(cnncconversion1_OBJECTS) $(cnncconversion1_DEPENDENCIES)
+ @rm -f cnncconversion1$(EXEEXT)
+ $(CXXLINK) $(cnncconversion1_LDFLAGS) $(cnncconversion1_OBJECTS) $(cnncconversion1_LDADD) $(LIBS)
+concatenate1$(EXEEXT): $(concatenate1_OBJECTS) $(concatenate1_DEPENDENCIES)
+ @rm -f concatenate1$(EXEEXT)
+ $(CXXLINK) $(concatenate1_LDFLAGS) $(concatenate1_OBJECTS) $(concatenate1_LDADD) $(LIBS)
+congruences1$(EXEEXT): $(congruences1_OBJECTS) $(congruences1_DEPENDENCIES)
+ @rm -f congruences1$(EXEEXT)
+ $(CXXLINK) $(congruences1_LDFLAGS) $(congruences1_OBJECTS) $(congruences1_LDADD) $(LIBS)
+constraints1$(EXEEXT): $(constraints1_OBJECTS) $(constraints1_DEPENDENCIES)
+ @rm -f constraints1$(EXEEXT)
+ $(CXXLINK) $(constraints1_LDFLAGS) $(constraints1_OBJECTS) $(constraints1_LDADD) $(LIBS)
+contains1$(EXEEXT): $(contains1_OBJECTS) $(contains1_DEPENDENCIES)
+ @rm -f contains1$(EXEEXT)
+ $(CXXLINK) $(contains1_LDFLAGS) $(contains1_OBJECTS) $(contains1_LDADD) $(LIBS)
+contains2$(EXEEXT): $(contains2_OBJECTS) $(contains2_DEPENDENCIES)
+ @rm -f contains2$(EXEEXT)
+ $(CXXLINK) $(contains2_LDFLAGS) $(contains2_OBJECTS) $(contains2_LDADD) $(LIBS)
+disjoint1$(EXEEXT): $(disjoint1_OBJECTS) $(disjoint1_DEPENDENCIES)
+ @rm -f disjoint1$(EXEEXT)
+ $(CXXLINK) $(disjoint1_LDFLAGS) $(disjoint1_OBJECTS) $(disjoint1_LDADD) $(LIBS)
+disjoint2$(EXEEXT): $(disjoint2_OBJECTS) $(disjoint2_DEPENDENCIES)
+ @rm -f disjoint2$(EXEEXT)
+ $(CXXLINK) $(disjoint2_LDFLAGS) $(disjoint2_OBJECTS) $(disjoint2_LDADD) $(LIBS)
+dualhypercubes$(EXEEXT): $(dualhypercubes_OBJECTS) $(dualhypercubes_DEPENDENCIES)
+ @rm -f dualhypercubes$(EXEEXT)
+ $(CXXLINK) $(dualhypercubes_LDFLAGS) $(dualhypercubes_OBJECTS) $(dualhypercubes_LDADD) $(LIBS)
+empty1$(EXEEXT): $(empty1_OBJECTS) $(empty1_DEPENDENCIES)
+ @rm -f empty1$(EXEEXT)
+ $(CXXLINK) $(empty1_LDFLAGS) $(empty1_OBJECTS) $(empty1_LDADD) $(LIBS)
+equals1$(EXEEXT): $(equals1_OBJECTS) $(equals1_DEPENDENCIES)
+ @rm -f equals1$(EXEEXT)
+ $(CXXLINK) $(equals1_LDFLAGS) $(equals1_OBJECTS) $(equals1_LDADD) $(LIBS)
+exceptions1$(EXEEXT): $(exceptions1_OBJECTS) $(exceptions1_DEPENDENCIES)
+ @rm -f exceptions1$(EXEEXT)
+ $(CXXLINK) $(exceptions1_LDFLAGS) $(exceptions1_OBJECTS) $(exceptions1_LDADD) $(LIBS)
+exceptions2$(EXEEXT): $(exceptions2_OBJECTS) $(exceptions2_DEPENDENCIES)
+ @rm -f exceptions2$(EXEEXT)
+ $(CXXLINK) $(exceptions2_LDFLAGS) $(exceptions2_OBJECTS) $(exceptions2_LDADD) $(LIBS)
+exceptions3$(EXEEXT): $(exceptions3_OBJECTS) $(exceptions3_DEPENDENCIES)
+ @rm -f exceptions3$(EXEEXT)
+ $(CXXLINK) $(exceptions3_LDFLAGS) $(exceptions3_OBJECTS) $(exceptions3_LDADD) $(LIBS)
+expandspacedim1$(EXEEXT): $(expandspacedim1_OBJECTS) $(expandspacedim1_DEPENDENCIES)
+ @rm -f expandspacedim1$(EXEEXT)
+ $(CXXLINK) $(expandspacedim1_LDFLAGS) $(expandspacedim1_OBJECTS) $(expandspacedim1_LDADD) $(LIBS)
+expandspacedim2$(EXEEXT): $(expandspacedim2_OBJECTS) $(expandspacedim2_DEPENDENCIES)
+ @rm -f expandspacedim2$(EXEEXT)
+ $(CXXLINK) $(expandspacedim2_LDFLAGS) $(expandspacedim2_OBJECTS) $(expandspacedim2_LDADD) $(LIBS)
+foldspacedims1$(EXEEXT): $(foldspacedims1_OBJECTS) $(foldspacedims1_DEPENDENCIES)
+ @rm -f foldspacedims1$(EXEEXT)
+ $(CXXLINK) $(foldspacedims1_LDFLAGS) $(foldspacedims1_OBJECTS) $(foldspacedims1_LDADD) $(LIBS)
+foldspacedims2$(EXEEXT): $(foldspacedims2_OBJECTS) $(foldspacedims2_DEPENDENCIES)
+ @rm -f foldspacedims2$(EXEEXT)
+ $(CXXLINK) $(foldspacedims2_LDFLAGS) $(foldspacedims2_OBJECTS) $(foldspacedims2_LDADD) $(LIBS)
+generalizedaffineimage1$(EXEEXT): $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_DEPENDENCIES)
+ @rm -f generalizedaffineimage1$(EXEEXT)
+ $(CXXLINK) $(generalizedaffineimage1_LDFLAGS) $(generalizedaffineimage1_OBJECTS) $(generalizedaffineimage1_LDADD) $(LIBS)
+generalizedaffineimage2$(EXEEXT): $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_DEPENDENCIES)
+ @rm -f generalizedaffineimage2$(EXEEXT)
+ $(CXXLINK) $(generalizedaffineimage2_LDFLAGS) $(generalizedaffineimage2_OBJECTS) $(generalizedaffineimage2_LDADD) $(LIBS)
+generalizedaffinepreimage1$(EXEEXT): $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage1$(EXEEXT)
+ $(CXXLINK) $(generalizedaffinepreimage1_LDFLAGS) $(generalizedaffinepreimage1_OBJECTS) $(generalizedaffinepreimage1_LDADD) $(LIBS)
+generalizedaffinepreimage2$(EXEEXT): $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_DEPENDENCIES)
+ @rm -f generalizedaffinepreimage2$(EXEEXT)
+ $(CXXLINK) $(generalizedaffinepreimage2_LDFLAGS) $(generalizedaffinepreimage2_OBJECTS) $(generalizedaffinepreimage2_LDADD) $(LIBS)
+generators1$(EXEEXT): $(generators1_OBJECTS) $(generators1_DEPENDENCIES)
+ @rm -f generators1$(EXEEXT)
+ $(CXXLINK) $(generators1_LDFLAGS) $(generators1_OBJECTS) $(generators1_LDADD) $(LIBS)
+geomcovers1$(EXEEXT): $(geomcovers1_OBJECTS) $(geomcovers1_DEPENDENCIES)
+ @rm -f geomcovers1$(EXEEXT)
+ $(CXXLINK) $(geomcovers1_LDFLAGS) $(geomcovers1_OBJECTS) $(geomcovers1_LDADD) $(LIBS)
+h79widening1$(EXEEXT): $(h79widening1_OBJECTS) $(h79widening1_DEPENDENCIES)
+ @rm -f h79widening1$(EXEEXT)
+ $(CXXLINK) $(h79widening1_LDFLAGS) $(h79widening1_OBJECTS) $(h79widening1_LDADD) $(LIBS)
+h79widening2$(EXEEXT): $(h79widening2_OBJECTS) $(h79widening2_DEPENDENCIES)
+ @rm -f h79widening2$(EXEEXT)
+ $(CXXLINK) $(h79widening2_LDFLAGS) $(h79widening2_OBJECTS) $(h79widening2_LDADD) $(LIBS)
+intersection1$(EXEEXT): $(intersection1_OBJECTS) $(intersection1_DEPENDENCIES)
+ @rm -f intersection1$(EXEEXT)
+ $(CXXLINK) $(intersection1_LDFLAGS) $(intersection1_OBJECTS) $(intersection1_LDADD) $(LIBS)
+limitedbhrz03extrapolation1$(EXEEXT): $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f limitedbhrz03extrapolation1$(EXEEXT)
+ $(CXXLINK) $(limitedbhrz03extrapolation1_LDFLAGS) $(limitedbhrz03extrapolation1_OBJECTS) $(limitedbhrz03extrapolation1_LDADD) $(LIBS)
+limitedh79extrapolation1$(EXEEXT): $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_DEPENDENCIES)
+ @rm -f limitedh79extrapolation1$(EXEEXT)
+ $(CXXLINK) $(limitedh79extrapolation1_LDFLAGS) $(limitedh79extrapolation1_OBJECTS) $(limitedh79extrapolation1_LDADD) $(LIBS)
+linearpartition1$(EXEEXT): $(linearpartition1_OBJECTS) $(linearpartition1_DEPENDENCIES)
+ @rm -f linearpartition1$(EXEEXT)
+ $(CXXLINK) $(linearpartition1_LDFLAGS) $(linearpartition1_OBJECTS) $(linearpartition1_LDADD) $(LIBS)
+linearsystem1$(EXEEXT): $(linearsystem1_OBJECTS) $(linearsystem1_DEPENDENCIES)
+ @rm -f linearsystem1$(EXEEXT)
+ $(CXXLINK) $(linearsystem1_LDFLAGS) $(linearsystem1_OBJECTS) $(linearsystem1_LDADD) $(LIBS)
+linexpression1$(EXEEXT): $(linexpression1_OBJECTS) $(linexpression1_DEPENDENCIES)
+ @rm -f linexpression1$(EXEEXT)
+ $(CXXLINK) $(linexpression1_LDFLAGS) $(linexpression1_OBJECTS) $(linexpression1_LDADD) $(LIBS)
+lpproblem1$(EXEEXT): $(lpproblem1_OBJECTS) $(lpproblem1_DEPENDENCIES)
+ @rm -f lpproblem1$(EXEEXT)
+ $(CXXLINK) $(lpproblem1_LDFLAGS) $(lpproblem1_OBJECTS) $(lpproblem1_LDADD) $(LIBS)
+mapspacedims1$(EXEEXT): $(mapspacedims1_OBJECTS) $(mapspacedims1_DEPENDENCIES)
+ @rm -f mapspacedims1$(EXEEXT)
+ $(CXXLINK) $(mapspacedims1_LDFLAGS) $(mapspacedims1_OBJECTS) $(mapspacedims1_LDADD) $(LIBS)
+matrix1$(EXEEXT): $(matrix1_OBJECTS) $(matrix1_DEPENDENCIES)
+ @rm -f matrix1$(EXEEXT)
+ $(CXXLINK) $(matrix1_LDFLAGS) $(matrix1_OBJECTS) $(matrix1_LDADD) $(LIBS)
+max_min1$(EXEEXT): $(max_min1_OBJECTS) $(max_min1_DEPENDENCIES)
+ @rm -f max_min1$(EXEEXT)
+ $(CXXLINK) $(max_min1_LDFLAGS) $(max_min1_OBJECTS) $(max_min1_LDADD) $(LIBS)
+maxspacedim1$(EXEEXT): $(maxspacedim1_OBJECTS) $(maxspacedim1_DEPENDENCIES)
+ @rm -f maxspacedim1$(EXEEXT)
+ $(CXXLINK) $(maxspacedim1_LDFLAGS) $(maxspacedim1_OBJECTS) $(maxspacedim1_LDADD) $(LIBS)
+mc91$(EXEEXT): $(mc91_OBJECTS) $(mc91_DEPENDENCIES)
+ @rm -f mc91$(EXEEXT)
+ $(CXXLINK) $(mc91_LDFLAGS) $(mc91_OBJECTS) $(mc91_LDADD) $(LIBS)
+membytes1$(EXEEXT): $(membytes1_OBJECTS) $(membytes1_DEPENDENCIES)
+ @rm -f membytes1$(EXEEXT)
+ $(CXXLINK) $(membytes1_LDFLAGS) $(membytes1_OBJECTS) $(membytes1_LDADD) $(LIBS)
+membytes2$(EXEEXT): $(membytes2_OBJECTS) $(membytes2_DEPENDENCIES)
+ @rm -f membytes2$(EXEEXT)
+ $(CXXLINK) $(membytes2_LDFLAGS) $(membytes2_OBJECTS) $(membytes2_LDADD) $(LIBS)
+memory1$(EXEEXT): $(memory1_OBJECTS) $(memory1_DEPENDENCIES)
+ @rm -f memory1$(EXEEXT)
+ $(CXXLINK) $(memory1_LDFLAGS) $(memory1_OBJECTS) $(memory1_LDADD) $(LIBS)
+memory2$(EXEEXT): $(memory2_OBJECTS) $(memory2_DEPENDENCIES)
+ @rm -f memory2$(EXEEXT)
+ $(CXXLINK) $(memory2_LDFLAGS) $(memory2_OBJECTS) $(memory2_LDADD) $(LIBS)
+minconstraints1$(EXEEXT): $(minconstraints1_OBJECTS) $(minconstraints1_DEPENDENCIES)
+ @rm -f minconstraints1$(EXEEXT)
+ $(CXXLINK) $(minconstraints1_LDFLAGS) $(minconstraints1_OBJECTS) $(minconstraints1_LDADD) $(LIBS)
+minconstraints2$(EXEEXT): $(minconstraints2_OBJECTS) $(minconstraints2_DEPENDENCIES)
+ @rm -f minconstraints2$(EXEEXT)
+ $(CXXLINK) $(minconstraints2_LDFLAGS) $(minconstraints2_OBJECTS) $(minconstraints2_LDADD) $(LIBS)
+mingenerators1$(EXEEXT): $(mingenerators1_OBJECTS) $(mingenerators1_DEPENDENCIES)
+ @rm -f mingenerators1$(EXEEXT)
+ $(CXXLINK) $(mingenerators1_LDFLAGS) $(mingenerators1_OBJECTS) $(mingenerators1_LDADD) $(LIBS)
+mingenerators2$(EXEEXT): $(mingenerators2_OBJECTS) $(mingenerators2_DEPENDENCIES)
+ @rm -f mingenerators2$(EXEEXT)
+ $(CXXLINK) $(mingenerators2_LDFLAGS) $(mingenerators2_OBJECTS) $(mingenerators2_LDADD) $(LIBS)
+nnc_addcongruence1$(EXEEXT): $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_DEPENDENCIES)
+ @rm -f nnc_addcongruence1$(EXEEXT)
+ $(CXXLINK) $(nnc_addcongruence1_LDFLAGS) $(nnc_addcongruence1_OBJECTS) $(nnc_addcongruence1_LDADD) $(LIBS)
+nnc_addcongruences1$(EXEEXT): $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_DEPENDENCIES)
+ @rm -f nnc_addcongruences1$(EXEEXT)
+ $(CXXLINK) $(nnc_addcongruences1_LDFLAGS) $(nnc_addcongruences1_OBJECTS) $(nnc_addcongruences1_LDADD) $(LIBS)
+nnc_addconstraint1$(EXEEXT): $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_DEPENDENCIES)
+ @rm -f nnc_addconstraint1$(EXEEXT)
+ $(CXXLINK) $(nnc_addconstraint1_LDFLAGS) $(nnc_addconstraint1_OBJECTS) $(nnc_addconstraint1_LDADD) $(LIBS)
+nnc_addconstraints1$(EXEEXT): $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_DEPENDENCIES)
+ @rm -f nnc_addconstraints1$(EXEEXT)
+ $(CXXLINK) $(nnc_addconstraints1_LDFLAGS) $(nnc_addconstraints1_OBJECTS) $(nnc_addconstraints1_LDADD) $(LIBS)
+nnc_addgenerator1$(EXEEXT): $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_DEPENDENCIES)
+ @rm -f nnc_addgenerator1$(EXEEXT)
+ $(CXXLINK) $(nnc_addgenerator1_LDFLAGS) $(nnc_addgenerator1_OBJECTS) $(nnc_addgenerator1_LDADD) $(LIBS)
+nnc_addgenerators1$(EXEEXT): $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_DEPENDENCIES)
+ @rm -f nnc_addgenerators1$(EXEEXT)
+ $(CXXLINK) $(nnc_addgenerators1_LDFLAGS) $(nnc_addgenerators1_OBJECTS) $(nnc_addgenerators1_LDADD) $(LIBS)
+nnc_addspacedims1$(EXEEXT): $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_DEPENDENCIES)
+ @rm -f nnc_addspacedims1$(EXEEXT)
+ $(CXXLINK) $(nnc_addspacedims1_LDFLAGS) $(nnc_addspacedims1_OBJECTS) $(nnc_addspacedims1_LDADD) $(LIBS)
+nnc_affineimage1$(EXEEXT): $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_DEPENDENCIES)
+ @rm -f nnc_affineimage1$(EXEEXT)
+ $(CXXLINK) $(nnc_affineimage1_LDFLAGS) $(nnc_affineimage1_OBJECTS) $(nnc_affineimage1_LDADD) $(LIBS)
+nnc_affinepreimage1$(EXEEXT): $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_DEPENDENCIES)
+ @rm -f nnc_affinepreimage1$(EXEEXT)
+ $(CXXLINK) $(nnc_affinepreimage1_LDFLAGS) $(nnc_affinepreimage1_OBJECTS) $(nnc_affinepreimage1_LDADD) $(LIBS)
+nnc_affinetrans$(EXEEXT): $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_DEPENDENCIES)
+ @rm -f nnc_affinetrans$(EXEEXT)
+ $(CXXLINK) $(nnc_affinetrans_LDFLAGS) $(nnc_affinetrans_OBJECTS) $(nnc_affinetrans_LDADD) $(LIBS)
+nnc_append1$(EXEEXT): $(nnc_append1_OBJECTS) $(nnc_append1_DEPENDENCIES)
+ @rm -f nnc_append1$(EXEEXT)
+ $(CXXLINK) $(nnc_append1_LDFLAGS) $(nnc_append1_OBJECTS) $(nnc_append1_LDADD) $(LIBS)
+nnc_append2$(EXEEXT): $(nnc_append2_OBJECTS) $(nnc_append2_DEPENDENCIES)
+ @rm -f nnc_append2$(EXEEXT)
+ $(CXXLINK) $(nnc_append2_LDFLAGS) $(nnc_append2_OBJECTS) $(nnc_append2_LDADD) $(LIBS)
+nnc_ascii_dump_load1$(EXEEXT): $(nnc_ascii_dump_load1_OBJECTS) $(nnc_ascii_dump_load1_DEPENDENCIES)
+ @rm -f nnc_ascii_dump_load1$(EXEEXT)
+ $(CXXLINK) $(nnc_ascii_dump_load1_LDFLAGS) $(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)
+ @rm -f nnc_ascii_dump_load2$(EXEEXT)
+ $(CXXLINK) $(nnc_ascii_dump_load2_LDFLAGS) $(nnc_ascii_dump_load2_OBJECTS) $(nnc_ascii_dump_load2_LDADD) $(LIBS)
+nnc_bgp99extrapolation1$(EXEEXT): $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_DEPENDENCIES)
+ @rm -f nnc_bgp99extrapolation1$(EXEEXT)
+ $(CXXLINK) $(nnc_bgp99extrapolation1_LDFLAGS) $(nnc_bgp99extrapolation1_OBJECTS) $(nnc_bgp99extrapolation1_LDADD) $(LIBS)
+nnc_bhrz03widening1$(EXEEXT): $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_DEPENDENCIES)
+ @rm -f nnc_bhrz03widening1$(EXEEXT)
+ $(CXXLINK) $(nnc_bhrz03widening1_LDFLAGS) $(nnc_bhrz03widening1_OBJECTS) $(nnc_bhrz03widening1_LDADD) $(LIBS)
+nnc_bhrz03widening2$(EXEEXT): $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_DEPENDENCIES)
+ @rm -f nnc_bhrz03widening2$(EXEEXT)
+ $(CXXLINK) $(nnc_bhrz03widening2_LDFLAGS) $(nnc_bhrz03widening2_OBJECTS) $(nnc_bhrz03widening2_LDADD) $(LIBS)
+nnc_bounded1$(EXEEXT): $(nnc_bounded1_OBJECTS) $(nnc_bounded1_DEPENDENCIES)
+ @rm -f nnc_bounded1$(EXEEXT)
+ $(CXXLINK) $(nnc_bounded1_LDFLAGS) $(nnc_bounded1_OBJECTS) $(nnc_bounded1_LDADD) $(LIBS)
+nnc_boundedaffineimage1$(EXEEXT): $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_DEPENDENCIES)
+ @rm -f nnc_boundedaffineimage1$(EXEEXT)
+ $(CXXLINK) $(nnc_boundedaffineimage1_LDFLAGS) $(nnc_boundedaffineimage1_OBJECTS) $(nnc_boundedaffineimage1_LDADD) $(LIBS)
+nnc_boundedaffinepreimage1$(EXEEXT): $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_DEPENDENCIES)
+ @rm -f nnc_boundedaffinepreimage1$(EXEEXT)
+ $(CXXLINK) $(nnc_boundedaffinepreimage1_LDFLAGS) $(nnc_boundedaffinepreimage1_OBJECTS) $(nnc_boundedaffinepreimage1_LDADD) $(LIBS)
+nnc_boundedbhrz03extrapolation1$(EXEEXT): $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f nnc_boundedbhrz03extrapolation1$(EXEEXT)
+ $(CXXLINK) $(nnc_boundedbhrz03extrapolation1_LDFLAGS) $(nnc_boundedbhrz03extrapolation1_OBJECTS) $(nnc_boundedbhrz03extrapolation1_LDADD) $(LIBS)
+nnc_boundedh79extrapolation1$(EXEEXT): $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_DEPENDENCIES)
+ @rm -f nnc_boundedh79extrapolation1$(EXEEXT)
+ $(CXXLINK) $(nnc_boundedh79extrapolation1_LDFLAGS) $(nnc_boundedh79extrapolation1_OBJECTS) $(nnc_boundedh79extrapolation1_LDADD) $(LIBS)
+nnc_boundingbox1$(EXEEXT): $(nnc_boundingbox1_OBJECTS) $(nnc_boundingbox1_DEPENDENCIES)
+ @rm -f nnc_boundingbox1$(EXEEXT)
+ $(CXXLINK) $(nnc_boundingbox1_LDFLAGS) $(nnc_boundingbox1_OBJECTS) $(nnc_boundingbox1_LDADD) $(LIBS)
+nnc_boundingbox2$(EXEEXT): $(nnc_boundingbox2_OBJECTS) $(nnc_boundingbox2_DEPENDENCIES)
+ @rm -f nnc_boundingbox2$(EXEEXT)
+ $(CXXLINK) $(nnc_boundingbox2_LDFLAGS) $(nnc_boundingbox2_OBJECTS) $(nnc_boundingbox2_LDADD) $(LIBS)
+nnc_bounds1$(EXEEXT): $(nnc_bounds1_OBJECTS) $(nnc_bounds1_DEPENDENCIES)
+ @rm -f nnc_bounds1$(EXEEXT)
+ $(CXXLINK) $(nnc_bounds1_LDFLAGS) $(nnc_bounds1_OBJECTS) $(nnc_bounds1_LDADD) $(LIBS)
+nnc_concatenate1$(EXEEXT): $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_DEPENDENCIES)
+ @rm -f nnc_concatenate1$(EXEEXT)
+ $(CXXLINK) $(nnc_concatenate1_LDFLAGS) $(nnc_concatenate1_OBJECTS) $(nnc_concatenate1_LDADD) $(LIBS)
+nnc_congruences1$(EXEEXT): $(nnc_congruences1_OBJECTS) $(nnc_congruences1_DEPENDENCIES)
+ @rm -f nnc_congruences1$(EXEEXT)
+ $(CXXLINK) $(nnc_congruences1_LDFLAGS) $(nnc_congruences1_OBJECTS) $(nnc_congruences1_LDADD) $(LIBS)
+nnc_constraints1$(EXEEXT): $(nnc_constraints1_OBJECTS) $(nnc_constraints1_DEPENDENCIES)
+ @rm -f nnc_constraints1$(EXEEXT)
+ $(CXXLINK) $(nnc_constraints1_LDFLAGS) $(nnc_constraints1_OBJECTS) $(nnc_constraints1_LDADD) $(LIBS)
+nnc_contains1$(EXEEXT): $(nnc_contains1_OBJECTS) $(nnc_contains1_DEPENDENCIES)
+ @rm -f nnc_contains1$(EXEEXT)
+ $(CXXLINK) $(nnc_contains1_LDFLAGS) $(nnc_contains1_OBJECTS) $(nnc_contains1_LDADD) $(LIBS)
+nnc_disjoint1$(EXEEXT): $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_DEPENDENCIES)
+ @rm -f nnc_disjoint1$(EXEEXT)
+ $(CXXLINK) $(nnc_disjoint1_LDFLAGS) $(nnc_disjoint1_OBJECTS) $(nnc_disjoint1_LDADD) $(LIBS)
+nnc_empty1$(EXEEXT): $(nnc_empty1_OBJECTS) $(nnc_empty1_DEPENDENCIES)
+ @rm -f nnc_empty1$(EXEEXT)
+ $(CXXLINK) $(nnc_empty1_LDFLAGS) $(nnc_empty1_OBJECTS) $(nnc_empty1_LDADD) $(LIBS)
+nnc_equals1$(EXEEXT): $(nnc_equals1_OBJECTS) $(nnc_equals1_DEPENDENCIES)
+ @rm -f nnc_equals1$(EXEEXT)
+ $(CXXLINK) $(nnc_equals1_LDFLAGS) $(nnc_equals1_OBJECTS) $(nnc_equals1_LDADD) $(LIBS)
+nnc_exceptions1$(EXEEXT): $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_DEPENDENCIES)
+ @rm -f nnc_exceptions1$(EXEEXT)
+ $(CXXLINK) $(nnc_exceptions1_LDFLAGS) $(nnc_exceptions1_OBJECTS) $(nnc_exceptions1_LDADD) $(LIBS)
+nnc_exceptions3$(EXEEXT): $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_DEPENDENCIES)
+ @rm -f nnc_exceptions3$(EXEEXT)
+ $(CXXLINK) $(nnc_exceptions3_LDFLAGS) $(nnc_exceptions3_OBJECTS) $(nnc_exceptions3_LDADD) $(LIBS)
+nnc_expandspacedim1$(EXEEXT): $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_DEPENDENCIES)
+ @rm -f nnc_expandspacedim1$(EXEEXT)
+ $(CXXLINK) $(nnc_expandspacedim1_LDFLAGS) $(nnc_expandspacedim1_OBJECTS) $(nnc_expandspacedim1_LDADD) $(LIBS)
+nnc_foldspacedims1$(EXEEXT): $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_DEPENDENCIES)
+ @rm -f nnc_foldspacedims1$(EXEEXT)
+ $(CXXLINK) $(nnc_foldspacedims1_LDFLAGS) $(nnc_foldspacedims1_OBJECTS) $(nnc_foldspacedims1_LDADD) $(LIBS)
+nnc_generalizedaffineimage1$(EXEEXT): $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_DEPENDENCIES)
+ @rm -f nnc_generalizedaffineimage1$(EXEEXT)
+ $(CXXLINK) $(nnc_generalizedaffineimage1_LDFLAGS) $(nnc_generalizedaffineimage1_OBJECTS) $(nnc_generalizedaffineimage1_LDADD) $(LIBS)
+nnc_generalizedaffinepreimage1$(EXEEXT): $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_DEPENDENCIES)
+ @rm -f nnc_generalizedaffinepreimage1$(EXEEXT)
+ $(CXXLINK) $(nnc_generalizedaffinepreimage1_LDFLAGS) $(nnc_generalizedaffinepreimage1_OBJECTS) $(nnc_generalizedaffinepreimage1_LDADD) $(LIBS)
+nnc_generators1$(EXEEXT): $(nnc_generators1_OBJECTS) $(nnc_generators1_DEPENDENCIES)
+ @rm -f nnc_generators1$(EXEEXT)
+ $(CXXLINK) $(nnc_generators1_LDFLAGS) $(nnc_generators1_OBJECTS) $(nnc_generators1_LDADD) $(LIBS)
+nnc_geomcovers1$(EXEEXT): $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_DEPENDENCIES)
+ @rm -f nnc_geomcovers1$(EXEEXT)
+ $(CXXLINK) $(nnc_geomcovers1_LDFLAGS) $(nnc_geomcovers1_OBJECTS) $(nnc_geomcovers1_LDADD) $(LIBS)
+nnc_h79widening1$(EXEEXT): $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_DEPENDENCIES)
+ @rm -f nnc_h79widening1$(EXEEXT)
+ $(CXXLINK) $(nnc_h79widening1_LDFLAGS) $(nnc_h79widening1_OBJECTS) $(nnc_h79widening1_LDADD) $(LIBS)
+nnc_intersection1$(EXEEXT): $(nnc_intersection1_OBJECTS) $(nnc_intersection1_DEPENDENCIES)
+ @rm -f nnc_intersection1$(EXEEXT)
+ $(CXXLINK) $(nnc_intersection1_LDFLAGS) $(nnc_intersection1_OBJECTS) $(nnc_intersection1_LDADD) $(LIBS)
+nnc_limitedbhrz03extrapolation1$(EXEEXT): $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_DEPENDENCIES)
+ @rm -f nnc_limitedbhrz03extrapolation1$(EXEEXT)
+ $(CXXLINK) $(nnc_limitedbhrz03extrapolation1_LDFLAGS) $(nnc_limitedbhrz03extrapolation1_OBJECTS) $(nnc_limitedbhrz03extrapolation1_LDADD) $(LIBS)
+nnc_limitedh79extrapolation1$(EXEEXT): $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_DEPENDENCIES)
+ @rm -f nnc_limitedh79extrapolation1$(EXEEXT)
+ $(CXXLINK) $(nnc_limitedh79extrapolation1_LDFLAGS) $(nnc_limitedh79extrapolation1_OBJECTS) $(nnc_limitedh79extrapolation1_LDADD) $(LIBS)
+nnc_linearpartition1$(EXEEXT): $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_DEPENDENCIES)
+ @rm -f nnc_linearpartition1$(EXEEXT)
+ $(CXXLINK) $(nnc_linearpartition1_LDFLAGS) $(nnc_linearpartition1_OBJECTS) $(nnc_linearpartition1_LDADD) $(LIBS)
+nnc_mapspacedims1$(EXEEXT): $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_DEPENDENCIES)
+ @rm -f nnc_mapspacedims1$(EXEEXT)
+ $(CXXLINK) $(nnc_mapspacedims1_LDFLAGS) $(nnc_mapspacedims1_OBJECTS) $(nnc_mapspacedims1_LDADD) $(LIBS)
+nnc_max_min1$(EXEEXT): $(nnc_max_min1_OBJECTS) $(nnc_max_min1_DEPENDENCIES)
+ @rm -f nnc_max_min1$(EXEEXT)
+ $(CXXLINK) $(nnc_max_min1_LDFLAGS) $(nnc_max_min1_OBJECTS) $(nnc_max_min1_LDADD) $(LIBS)
+nnc_mc91$(EXEEXT): $(nnc_mc91_OBJECTS) $(nnc_mc91_DEPENDENCIES)
+ @rm -f nnc_mc91$(EXEEXT)
+ $(CXXLINK) $(nnc_mc91_LDFLAGS) $(nnc_mc91_OBJECTS) $(nnc_mc91_LDADD) $(LIBS)
+nnc_membytes1$(EXEEXT): $(nnc_membytes1_OBJECTS) $(nnc_membytes1_DEPENDENCIES)
+ @rm -f nnc_membytes1$(EXEEXT)
+ $(CXXLINK) $(nnc_membytes1_LDFLAGS) $(nnc_membytes1_OBJECTS) $(nnc_membytes1_LDADD) $(LIBS)
+nnc_membytes2$(EXEEXT): $(nnc_membytes2_OBJECTS) $(nnc_membytes2_DEPENDENCIES)
+ @rm -f nnc_membytes2$(EXEEXT)
+ $(CXXLINK) $(nnc_membytes2_LDFLAGS) $(nnc_membytes2_OBJECTS) $(nnc_membytes2_LDADD) $(LIBS)
+nnc_minconstraints1$(EXEEXT): $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_DEPENDENCIES)
+ @rm -f nnc_minconstraints1$(EXEEXT)
+ $(CXXLINK) $(nnc_minconstraints1_LDFLAGS) $(nnc_minconstraints1_OBJECTS) $(nnc_minconstraints1_LDADD) $(LIBS)
+nnc_mingenerators1$(EXEEXT): $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_DEPENDENCIES)
+ @rm -f nnc_mingenerators1$(EXEEXT)
+ $(CXXLINK) $(nnc_mingenerators1_LDFLAGS) $(nnc_mingenerators1_OBJECTS) $(nnc_mingenerators1_LDADD) $(LIBS)
+nnc_onepoint$(EXEEXT): $(nnc_onepoint_OBJECTS) $(nnc_onepoint_DEPENDENCIES)
+ @rm -f nnc_onepoint$(EXEEXT)
+ $(CXXLINK) $(nnc_onepoint_LDFLAGS) $(nnc_onepoint_OBJECTS) $(nnc_onepoint_LDADD) $(LIBS)
+nnc_permute$(EXEEXT): $(nnc_permute_OBJECTS) $(nnc_permute_DEPENDENCIES)
+ @rm -f nnc_permute$(EXEEXT)
+ $(CXXLINK) $(nnc_permute_LDFLAGS) $(nnc_permute_OBJECTS) $(nnc_permute_LDADD) $(LIBS)
+nnc_polydifference1$(EXEEXT): $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_DEPENDENCIES)
+ @rm -f nnc_polydifference1$(EXEEXT)
+ $(CXXLINK) $(nnc_polydifference1_LDFLAGS) $(nnc_polydifference1_OBJECTS) $(nnc_polydifference1_LDADD) $(LIBS)
+nnc_polyhull1$(EXEEXT): $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_DEPENDENCIES)
+ @rm -f nnc_polyhull1$(EXEEXT)
+ $(CXXLINK) $(nnc_polyhull1_LDFLAGS) $(nnc_polyhull1_OBJECTS) $(nnc_polyhull1_LDADD) $(LIBS)
+nnc_randphull1$(EXEEXT): $(nnc_randphull1_OBJECTS) $(nnc_randphull1_DEPENDENCIES)
+ @rm -f nnc_randphull1$(EXEEXT)
+ $(CXXLINK) $(nnc_randphull1_LDFLAGS) $(nnc_randphull1_OBJECTS) $(nnc_randphull1_LDADD) $(LIBS)
+nnc_randphull2$(EXEEXT): $(nnc_randphull2_OBJECTS) $(nnc_randphull2_DEPENDENCIES)
+ @rm -f nnc_randphull2$(EXEEXT)
+ $(CXXLINK) $(nnc_randphull2_LDFLAGS) $(nnc_randphull2_OBJECTS) $(nnc_randphull2_LDADD) $(LIBS)
+nnc_relations1$(EXEEXT): $(nnc_relations1_OBJECTS) $(nnc_relations1_DEPENDENCIES)
+ @rm -f nnc_relations1$(EXEEXT)
+ $(CXXLINK) $(nnc_relations1_LDFLAGS) $(nnc_relations1_OBJECTS) $(nnc_relations1_LDADD) $(LIBS)
+nnc_relations2$(EXEEXT): $(nnc_relations2_OBJECTS) $(nnc_relations2_DEPENDENCIES)
+ @rm -f nnc_relations2$(EXEEXT)
+ $(CXXLINK) $(nnc_relations2_LDFLAGS) $(nnc_relations2_OBJECTS) $(nnc_relations2_LDADD) $(LIBS)
+nnc_removespacedims1$(EXEEXT): $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_DEPENDENCIES)
+ @rm -f nnc_removespacedims1$(EXEEXT)
+ $(CXXLINK) $(nnc_removespacedims1_LDFLAGS) $(nnc_removespacedims1_OBJECTS) $(nnc_removespacedims1_LDADD) $(LIBS)
+nnc_smm1$(EXEEXT): $(nnc_smm1_OBJECTS) $(nnc_smm1_DEPENDENCIES)
+ @rm -f nnc_smm1$(EXEEXT)
+ $(CXXLINK) $(nnc_smm1_LDFLAGS) $(nnc_smm1_OBJECTS) $(nnc_smm1_LDADD) $(LIBS)
+nnc_timeelapse1$(EXEEXT): $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_DEPENDENCIES)
+ @rm -f nnc_timeelapse1$(EXEEXT)
+ $(CXXLINK) $(nnc_timeelapse1_LDFLAGS) $(nnc_timeelapse1_OBJECTS) $(nnc_timeelapse1_LDADD) $(LIBS)
+nnc_universe1$(EXEEXT): $(nnc_universe1_OBJECTS) $(nnc_universe1_DEPENDENCIES)
+ @rm -f nnc_universe1$(EXEEXT)
+ $(CXXLINK) $(nnc_universe1_LDFLAGS) $(nnc_universe1_OBJECTS) $(nnc_universe1_LDADD) $(LIBS)
+nnc_writepolyhedron1$(EXEEXT): $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_DEPENDENCIES)
+ @rm -f nnc_writepolyhedron1$(EXEEXT)
+ $(CXXLINK) $(nnc_writepolyhedron1_LDFLAGS) $(nnc_writepolyhedron1_OBJECTS) $(nnc_writepolyhedron1_LDADD) $(LIBS)
+nncminimize1$(EXEEXT): $(nncminimize1_OBJECTS) $(nncminimize1_DEPENDENCIES)
+ @rm -f nncminimize1$(EXEEXT)
+ $(CXXLINK) $(nncminimize1_LDFLAGS) $(nncminimize1_OBJECTS) $(nncminimize1_LDADD) $(LIBS)
+nncminimize2$(EXEEXT): $(nncminimize2_OBJECTS) $(nncminimize2_DEPENDENCIES)
+ @rm -f nncminimize2$(EXEEXT)
+ $(CXXLINK) $(nncminimize2_LDFLAGS) $(nncminimize2_OBJECTS) $(nncminimize2_LDADD) $(LIBS)
+numberinput1$(EXEEXT): $(numberinput1_OBJECTS) $(numberinput1_DEPENDENCIES)
+ @rm -f numberinput1$(EXEEXT)
+ $(CXXLINK) $(numberinput1_LDFLAGS) $(numberinput1_OBJECTS) $(numberinput1_LDADD) $(LIBS)
+onepoint$(EXEEXT): $(onepoint_OBJECTS) $(onepoint_DEPENDENCIES)
+ @rm -f onepoint$(EXEEXT)
+ $(CXXLINK) $(onepoint_LDFLAGS) $(onepoint_OBJECTS) $(onepoint_LDADD) $(LIBS)
+permute$(EXEEXT): $(permute_OBJECTS) $(permute_DEPENDENCIES)
+ @rm -f permute$(EXEEXT)
+ $(CXXLINK) $(permute_LDFLAGS) $(permute_OBJECTS) $(permute_LDADD) $(LIBS)
+polydifference1$(EXEEXT): $(polydifference1_OBJECTS) $(polydifference1_DEPENDENCIES)
+ @rm -f polydifference1$(EXEEXT)
+ $(CXXLINK) $(polydifference1_LDFLAGS) $(polydifference1_OBJECTS) $(polydifference1_LDADD) $(LIBS)
+polydifference2$(EXEEXT): $(polydifference2_OBJECTS) $(polydifference2_DEPENDENCIES)
+ @rm -f polydifference2$(EXEEXT)
+ $(CXXLINK) $(polydifference2_LDFLAGS) $(polydifference2_OBJECTS) $(polydifference2_LDADD) $(LIBS)
+polyhull1$(EXEEXT): $(polyhull1_OBJECTS) $(polyhull1_DEPENDENCIES)
+ @rm -f polyhull1$(EXEEXT)
+ $(CXXLINK) $(polyhull1_LDFLAGS) $(polyhull1_OBJECTS) $(polyhull1_LDADD) $(LIBS)
+polyhull2$(EXEEXT): $(polyhull2_OBJECTS) $(polyhull2_DEPENDENCIES)
+ @rm -f polyhull2$(EXEEXT)
+ $(CXXLINK) $(polyhull2_LDFLAGS) $(polyhull2_OBJECTS) $(polyhull2_LDADD) $(LIBS)
+polypowerset1$(EXEEXT): $(polypowerset1_OBJECTS) $(polypowerset1_DEPENDENCIES)
+ @rm -f polypowerset1$(EXEEXT)
+ $(CXXLINK) $(polypowerset1_LDFLAGS) $(polypowerset1_OBJECTS) $(polypowerset1_LDADD) $(LIBS)
+powerset1$(EXEEXT): $(powerset1_OBJECTS) $(powerset1_DEPENDENCIES)
+ @rm -f powerset1$(EXEEXT)
+ $(CXXLINK) $(powerset1_LDFLAGS) $(powerset1_OBJECTS) $(powerset1_LDADD) $(LIBS)
+randphull1$(EXEEXT): $(randphull1_OBJECTS) $(randphull1_DEPENDENCIES)
+ @rm -f randphull1$(EXEEXT)
+ $(CXXLINK) $(randphull1_LDFLAGS) $(randphull1_OBJECTS) $(randphull1_LDADD) $(LIBS)
+randphull2$(EXEEXT): $(randphull2_OBJECTS) $(randphull2_DEPENDENCIES)
+ @rm -f randphull2$(EXEEXT)
+ $(CXXLINK) $(randphull2_LDFLAGS) $(randphull2_OBJECTS) $(randphull2_LDADD) $(LIBS)
+relations1$(EXEEXT): $(relations1_OBJECTS) $(relations1_DEPENDENCIES)
+ @rm -f relations1$(EXEEXT)
+ $(CXXLINK) $(relations1_LDFLAGS) $(relations1_OBJECTS) $(relations1_LDADD) $(LIBS)
+relations2$(EXEEXT): $(relations2_OBJECTS) $(relations2_DEPENDENCIES)
+ @rm -f relations2$(EXEEXT)
+ $(CXXLINK) $(relations2_LDFLAGS) $(relations2_OBJECTS) $(relations2_LDADD) $(LIBS)
+relations3$(EXEEXT): $(relations3_OBJECTS) $(relations3_DEPENDENCIES)
+ @rm -f relations3$(EXEEXT)
+ $(CXXLINK) $(relations3_LDFLAGS) $(relations3_OBJECTS) $(relations3_LDADD) $(LIBS)
+removespacedims1$(EXEEXT): $(removespacedims1_OBJECTS) $(removespacedims1_DEPENDENCIES)
+ @rm -f removespacedims1$(EXEEXT)
+ $(CXXLINK) $(removespacedims1_LDFLAGS) $(removespacedims1_OBJECTS) $(removespacedims1_LDADD) $(LIBS)
+removespacedims2$(EXEEXT): $(removespacedims2_OBJECTS) $(removespacedims2_DEPENDENCIES)
+ @rm -f removespacedims2$(EXEEXT)
+ $(CXXLINK) $(removespacedims2_LDFLAGS) $(removespacedims2_OBJECTS) $(removespacedims2_LDADD) $(LIBS)
+smm1$(EXEEXT): $(smm1_OBJECTS) $(smm1_DEPENDENCIES)
+ @rm -f smm1$(EXEEXT)
+ $(CXXLINK) $(smm1_LDFLAGS) $(smm1_OBJECTS) $(smm1_LDADD) $(LIBS)
+timeelapse1$(EXEEXT): $(timeelapse1_OBJECTS) $(timeelapse1_DEPENDENCIES)
+ @rm -f timeelapse1$(EXEEXT)
+ $(CXXLINK) $(timeelapse1_LDFLAGS) $(timeelapse1_OBJECTS) $(timeelapse1_LDADD) $(LIBS)
+timeelapse2$(EXEEXT): $(timeelapse2_OBJECTS) $(timeelapse2_DEPENDENCIES)
+ @rm -f timeelapse2$(EXEEXT)
+ $(CXXLINK) $(timeelapse2_LDFLAGS) $(timeelapse2_OBJECTS) $(timeelapse2_LDADD) $(LIBS)
+topclosed1$(EXEEXT): $(topclosed1_OBJECTS) $(topclosed1_DEPENDENCIES)
+ @rm -f topclosed1$(EXEEXT)
+ $(CXXLINK) $(topclosed1_LDFLAGS) $(topclosed1_OBJECTS) $(topclosed1_LDADD) $(LIBS)
+topclosure1$(EXEEXT): $(topclosure1_OBJECTS) $(topclosure1_DEPENDENCIES)
+ @rm -f topclosure1$(EXEEXT)
+ $(CXXLINK) $(topclosure1_LDFLAGS) $(topclosure1_OBJECTS) $(topclosure1_LDADD) $(LIBS)
+universe1$(EXEEXT): $(universe1_OBJECTS) $(universe1_DEPENDENCIES)
+ @rm -f universe1$(EXEEXT)
+ $(CXXLINK) $(universe1_LDFLAGS) $(universe1_OBJECTS) $(universe1_LDADD) $(LIBS)
+universe2$(EXEEXT): $(universe2_OBJECTS) $(universe2_DEPENDENCIES)
+ @rm -f universe2$(EXEEXT)
+ $(CXXLINK) $(universe2_LDFLAGS) $(universe2_OBJECTS) $(universe2_LDADD) $(LIBS)
+watchdog1$(EXEEXT): $(watchdog1_OBJECTS) $(watchdog1_DEPENDENCIES)
+ @rm -f watchdog1$(EXEEXT)
+ $(CXXLINK) $(watchdog1_LDFLAGS) $(watchdog1_OBJECTS) $(watchdog1_LDADD) $(LIBS)
+writeconsys1$(EXEEXT): $(writeconsys1_OBJECTS) $(writeconsys1_DEPENDENCIES)
+ @rm -f writeconsys1$(EXEEXT)
+ $(CXXLINK) $(writeconsys1_LDFLAGS) $(writeconsys1_OBJECTS) $(writeconsys1_LDADD) $(LIBS)
+writegensys1$(EXEEXT): $(writegensys1_OBJECTS) $(writegensys1_DEPENDENCIES)
+ @rm -f writegensys1$(EXEEXT)
+ $(CXXLINK) $(writegensys1_LDFLAGS) $(writegensys1_OBJECTS) $(writegensys1_LDADD) $(LIBS)
+writepolyhedron1$(EXEEXT): $(writepolyhedron1_OBJECTS) $(writepolyhedron1_DEPENDENCIES)
+ @rm -f writepolyhedron1$(EXEEXT)
+ $(CXXLINK) $(writepolyhedron1_LDFLAGS) $(writepolyhedron1_OBJECTS) $(writepolyhedron1_LDADD) $(LIBS)
+writepolyhedron2$(EXEEXT): $(writepolyhedron2_OBJECTS) $(writepolyhedron2_DEPENDENCIES)
+ @rm -f writepolyhedron2$(EXEEXT)
+ $(CXXLINK) $(writepolyhedron2_LDFLAGS) $(writepolyhedron2_OBJECTS) $(writepolyhedron2_LDADD) $(LIBS)
+writerelation1$(EXEEXT): $(writerelation1_OBJECTS) $(writerelation1_DEPENDENCIES)
+ @rm -f writerelation1$(EXEEXT)
+ $(CXXLINK) $(writerelation1_LDFLAGS) $(writerelation1_OBJECTS) $(writerelation1_LDADD) $(LIBS)
+writevariable1$(EXEEXT): $(writevariable1_OBJECTS) $(writevariable1_DEPENDENCIES)
+ @rm -f writevariable1$(EXEEXT)
+ $(CXXLINK) $(writevariable1_LDFLAGS) $(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)/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)/boundingbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/boundingbox3.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)/bug2-bug2.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)/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)/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)/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)/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)/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)/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)/linexpression1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/lpproblem1.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)/membytes2.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/memory1.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_boundingbox1-boundingbox1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_boundingbox2-boundingbox2.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_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_disjoint1-disjoint1.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_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_membytes2-membytes2.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_randphull1-randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/nnc_randphull2-randphull2.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_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_universe1-universe1.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)/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)/polypowerset1.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)/randphull1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/randphull2.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)/smm1.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)/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)/watchdog1.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@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+bug2-bug2.o: bug2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -MT bug2-bug2.o -MD -MP -MF "$(DEPDIR)/bug2-bug2.Tpo" -c -o bug2-bug2.o `test -f 'bug2.cc' || echo '$(srcdir)/'`bug2.cc; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/bug2-bug2.Tpo" "$(DEPDIR)/bug2-bug2.Po"; else rm -f "$(DEPDIR)/bug2-bug2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bug2.cc' object='bug2-bug2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -c -o bug2-bug2.o `test -f 'bug2.cc' || echo '$(srcdir)/'`bug2.cc
+
+bug2-bug2.obj: bug2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -MT bug2-bug2.obj -MD -MP -MF "$(DEPDIR)/bug2-bug2.Tpo" -c -o bug2-bug2.obj `if test -f 'bug2.cc'; then $(CYGPATH_W) 'bug2.cc'; else $(CYGPATH_W) '$(srcdir)/bug2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/bug2-bug2.Tpo" "$(DEPDIR)/bug2-bug2.Po"; else rm -f "$(DEPDIR)/bug2-bug2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='bug2.cc' object='bug2-bug2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(bug2_CXXFLAGS) $(CXXFLAGS) -c -o bug2-bug2.obj `if test -f 'bug2.cc'; then $(CYGPATH_W) 'bug2.cc'; else $(CYGPATH_W) '$(srcdir)/bug2.cc'; fi`
+
+nnc_addcongruence1-addcongruence1.o: addcongruence1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo" "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruence1-addcongruence1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo" "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Po"; else rm -f "$(DEPDIR)/nnc_addcongruences1-addcongruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo" "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraint1-addconstraint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo" "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_addconstraints1-addconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo" "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerator1-addgenerator1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo" "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Po"; else rm -f "$(DEPDIR)/nnc_addgenerators1-addgenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo" "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_addspacedims1-addspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" "$(DEPDIR)/nnc_affineimage1-affineimage1.Po"; else rm -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo" "$(DEPDIR)/nnc_affineimage1-affineimage1.Po"; else rm -f "$(DEPDIR)/nnc_affineimage1-affineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo" "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_affinepreimage1-affinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" "$(DEPDIR)/nnc_affinetrans-affinetrans.Po"; else rm -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo" "$(DEPDIR)/nnc_affinetrans-affinetrans.Po"; else rm -f "$(DEPDIR)/nnc_affinetrans-affinetrans.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_append1-append1.Tpo" "$(DEPDIR)/nnc_append1-append1.Po"; else rm -f "$(DEPDIR)/nnc_append1-append1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_append1-append1.Tpo" "$(DEPDIR)/nnc_append1-append1.Po"; else rm -f "$(DEPDIR)/nnc_append1-append1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_append2-append2.Tpo" "$(DEPDIR)/nnc_append2-append2.Po"; else rm -f "$(DEPDIR)/nnc_append2-append2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_append2-append2.Tpo" "$(DEPDIR)/nnc_append2-append2.Po"; else rm -f "$(DEPDIR)/nnc_append2-append2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo" "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load1-ascii_dump_load1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo" "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Po"; else rm -f "$(DEPDIR)/nnc_ascii_dump_load2-ascii_dump_load2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo" "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_bgp99extrapolation1-bgp99extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo" "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening1-bhrz03widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo" "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Po"; else rm -f "$(DEPDIR)/nnc_bhrz03widening2-bhrz03widening2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" "$(DEPDIR)/nnc_bounded1-bounded1.Po"; else rm -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo" "$(DEPDIR)/nnc_bounded1-bounded1.Po"; else rm -f "$(DEPDIR)/nnc_bounded1-bounded1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo" "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffineimage1-boundedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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.cc'; fi`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_boundedaffinepreimage1-boundedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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)/boundedh79e [...]
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_boundedh79extrapolation1-boundedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_boundingbox1-boundingbox1.o: boundingbox1.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox1-boundingbox1.o -MD -MP -MF "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" -c -o nnc_boundingbox1-boundingbox1.o `test -f 'boundingbox1.cc' || echo '$(srcdir)/'`boundingbox1.cc; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundingbox1.cc' object='nnc_boundingbox1-boundingbox1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox1-boundingbox1.o `test -f 'boundingbox1.cc' || echo '$(srcdir)/'`boundingbox1.cc
+
+nnc_boundingbox1-boundingbox1.obj: boundingbox1.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox1-boundingbox1.obj -MD -MP -MF "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" -c -o nnc_boundingbox1-boundingbox1.obj `if test -f 'boundingbox1.cc'; then $(CYGPATH_W) 'boundingbox1.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox1.cc'; fi`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo" "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox1-boundingbox1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundingbox1.cc' object='nnc_boundingbox1-boundingbox1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox1_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox1-boundingbox1.obj `if test -f 'boundingbox1.cc'; then $(CYGPATH_W) 'boundingbox1.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox1.cc'; fi`
+
+nnc_boundingbox2-boundingbox2.o: boundingbox2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox2-boundingbox2.o -MD -MP -MF "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" -c -o nnc_boundingbox2-boundingbox2.o `test -f 'boundingbox2.cc' || echo '$(srcdir)/'`boundingbox2.cc; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundingbox2.cc' object='nnc_boundingbox2-boundingbox2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox2-boundingbox2.o `test -f 'boundingbox2.cc' || echo '$(srcdir)/'`boundingbox2.cc
+
+nnc_boundingbox2-boundingbox2.obj: boundingbox2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -MT nnc_boundingbox2-boundingbox2.obj -MD -MP -MF "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" -c -o nnc_boundingbox2-boundingbox2.obj `if test -f 'boundingbox2.cc'; then $(CYGPATH_W) 'boundingbox2.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo" "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Po"; else rm -f "$(DEPDIR)/nnc_boundingbox2-boundingbox2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='boundingbox2.cc' object='nnc_boundingbox2-boundingbox2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_boundingbox2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_boundingbox2-boundingbox2.obj `if test -f 'boundingbox2.cc'; then $(CYGPATH_W) 'boundingbox2.cc'; else $(CYGPATH_W) '$(srcdir)/boundingbox2.cc'; fi`
+
+nnc_bounds1-bounds1.o: bounds1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" "$(DEPDIR)/nnc_bounds1-bounds1.Po"; else rm -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo" "$(DEPDIR)/nnc_bounds1-bounds1.Po"; else rm -f "$(DEPDIR)/nnc_bounds1-bounds1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" "$(DEPDIR)/nnc_concatenate1-concatenate1.Po"; else rm -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo" "$(DEPDIR)/nnc_concatenate1-concatenate1.Po"; else rm -f "$(DEPDIR)/nnc_concatenate1-concatenate1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" "$(DEPDIR)/nnc_congruences1-congruences1.Po"; else rm -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo" "$(DEPDIR)/nnc_congruences1-congruences1.Po"; else rm -f "$(DEPDIR)/nnc_congruences1-congruences1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_constraints1-constraints1.o: constraints1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" "$(DEPDIR)/nnc_constraints1-constraints1.Po"; else rm -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo" "$(DEPDIR)/nnc_constraints1-constraints1.Po"; else rm -f "$(DEPDIR)/nnc_constraints1-constraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_contains1-contains1.Tpo" "$(DEPDIR)/nnc_contains1-contains1.Po"; else rm -f "$(DEPDIR)/nnc_contains1-contains1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_contains1-contains1.Tpo" "$(DEPDIR)/nnc_contains1-contains1.Po"; else rm -f "$(DEPDIR)/nnc_contains1-contains1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_disjoint1-disjoint1.o: disjoint1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" "$(DEPDIR)/nnc_disjoint1-disjoint1.Po"; else rm -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo" "$(DEPDIR)/nnc_disjoint1-disjoint1.Po"; else rm -f "$(DEPDIR)/nnc_disjoint1-disjoint1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_empty1-empty1.o: empty1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_empty1-empty1.Tpo" "$(DEPDIR)/nnc_empty1-empty1.Po"; else rm -f "$(DEPDIR)/nnc_empty1-empty1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_empty1-empty1.Tpo" "$(DEPDIR)/nnc_empty1-empty1.Po"; else rm -f "$(DEPDIR)/nnc_empty1-empty1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_equals1-equals1.Tpo" "$(DEPDIR)/nnc_equals1-equals1.Po"; else rm -f "$(DEPDIR)/nnc_equals1-equals1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_equals1-equals1.Tpo" "$(DEPDIR)/nnc_equals1-equals1.Po"; else rm -f "$(DEPDIR)/nnc_equals1-equals1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" "$(DEPDIR)/nnc_exceptions1-exceptions1.Po"; else rm -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo" "$(DEPDIR)/nnc_exceptions1-exceptions1.Po"; else rm -f "$(DEPDIR)/nnc_exceptions1-exceptions1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" "$(DEPDIR)/nnc_exceptions3-exceptions3.Po"; else rm -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo" "$(DEPDIR)/nnc_exceptions3-exceptions3.Po"; else rm -f "$(DEPDIR)/nnc_exceptions3-exceptions3.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po"; else rm -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo" "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Po"; else rm -f "$(DEPDIR)/nnc_expandspacedim1-expandspacedim1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo" "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_foldspacedims1-foldspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_generalizedaffineimage1-generalizedaffineimage1.o: generalizedaffineimage1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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)/generalizedaffineima [...]
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffineimage1-generalizedaffineimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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) '$(s [...]
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo" "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Po"; else rm -f "$(DEPDIR)/nnc_generalizedaffinepreimage1-generalizedaffinepreimage1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_generators1-generators1.Tpo" "$(DEPDIR)/nnc_generators1-generators1.Po"; else rm -f "$(DEPDIR)/nnc_generators1-generators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_generators1-generators1.Tpo" "$(DEPDIR)/nnc_generators1-generators1.Po"; else rm -f "$(DEPDIR)/nnc_generators1-generators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po"; else rm -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo" "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Po"; else rm -f "$(DEPDIR)/nnc_geomcovers1-geomcovers1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" "$(DEPDIR)/nnc_h79widening1-h79widening1.Po"; else rm -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo" "$(DEPDIR)/nnc_h79widening1-h79widening1.Po"; else rm -f "$(DEPDIR)/nnc_h79widening1-h79widening1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" "$(DEPDIR)/nnc_intersection1-intersection1.Po"; else rm -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo" "$(DEPDIR)/nnc_intersection1-intersection1.Po"; else rm -f "$(DEPDIR)/nnc_intersection1-intersection1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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 $(CYGPAT [...]
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedbhrz03extrapolation1-limitedbhrz03extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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)/limitedh79e [...]
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo" "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Po"; else rm -f "$(DEPDIR)/nnc_limitedh79extrapolation1-limitedh79extrapolation1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po"; else rm -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo" "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Po"; else rm -f "$(DEPDIR)/nnc_linearpartition1-linearpartition1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo" "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Po"; else rm -f "$(DEPDIR)/nnc_mapspacedims1-mapspacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" "$(DEPDIR)/nnc_max_min1-max_min1.Po"; else rm -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo" "$(DEPDIR)/nnc_max_min1-max_min1.Po"; else rm -f "$(DEPDIR)/nnc_max_min1-max_min1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_mc91-mc91.Tpo" "$(DEPDIR)/nnc_mc91-mc91.Po"; else rm -f "$(DEPDIR)/nnc_mc91-mc91.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_mc91-mc91.Tpo" "$(DEPDIR)/nnc_mc91-mc91.Po"; else rm -f "$(DEPDIR)/nnc_mc91-mc91.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" "$(DEPDIR)/nnc_membytes1-membytes1.Po"; else rm -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo" "$(DEPDIR)/nnc_membytes1-membytes1.Po"; else rm -f "$(DEPDIR)/nnc_membytes1-membytes1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_membytes2-membytes2.o: membytes2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes2-membytes2.o -MD -MP -MF "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" -c -o nnc_membytes2-membytes2.o `test -f 'membytes2.cc' || echo '$(srcdir)/'`membytes2.cc; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" "$(DEPDIR)/nnc_membytes2-membytes2.Po"; else rm -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='membytes2.cc' object='nnc_membytes2-membytes2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes2-membytes2.o `test -f 'membytes2.cc' || echo '$(srcdir)/'`membytes2.cc
+
+nnc_membytes2-membytes2.obj: membytes2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -MT nnc_membytes2-membytes2.obj -MD -MP -MF "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" -c -o nnc_membytes2-membytes2.obj `if test -f 'membytes2.cc'; then $(CYGPATH_W) 'membytes2.cc'; else $(CYGPATH_W) '$(srcdir)/membytes2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo" "$(DEPDIR)/nnc_membytes2-membytes2.Po"; else rm -f "$(DEPDIR)/nnc_membytes2-membytes2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='membytes2.cc' object='nnc_membytes2-membytes2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_membytes2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_membytes2-membytes2.obj `if test -f 'membytes2.cc'; then $(CYGPATH_W) 'membytes2.cc'; else $(CYGPATH_W) '$(srcdir)/membytes2.cc'; fi`
+
+nnc_minconstraints1-minconstraints1.o: minconstraints1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo" "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Po"; else rm -f "$(DEPDIR)/nnc_minconstraints1-minconstraints1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po"; else rm -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo" "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Po"; else rm -f "$(DEPDIR)/nnc_mingenerators1-mingenerators1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" "$(DEPDIR)/nnc_onepoint-onepoint.Po"; else rm -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo" "$(DEPDIR)/nnc_onepoint-onepoint.Po"; else rm -f "$(DEPDIR)/nnc_onepoint-onepoint.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_permute-permute.Tpo" "$(DEPDIR)/nnc_permute-permute.Po"; else rm -f "$(DEPDIR)/nnc_permute-permute.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_permute-permute.Tpo" "$(DEPDIR)/nnc_permute-permute.Po"; else rm -f "$(DEPDIR)/nnc_permute-permute.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" "$(DEPDIR)/nnc_polydifference1-polydifference1.Po"; else rm -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo" "$(DEPDIR)/nnc_polydifference1-polydifference1.Po"; else rm -f "$(DEPDIR)/nnc_polydifference1-polydifference1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" "$(DEPDIR)/nnc_polyhull1-polyhull1.Po"; else rm -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo" "$(DEPDIR)/nnc_polyhull1-polyhull1.Po"; else rm -f "$(DEPDIR)/nnc_polyhull1-polyhull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_randphull1-randphull1.o: randphull1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" "$(DEPDIR)/nnc_randphull1-randphull1.Po"; else rm -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo" "$(DEPDIR)/nnc_randphull1-randphull1.Po"; else rm -f "$(DEPDIR)/nnc_randphull1-randphull1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_randphull2-randphull2.o: randphull2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull2-randphull2.o -MD -MP -MF "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" -c -o nnc_randphull2-randphull2.o `test -f 'randphull2.cc' || echo '$(srcdir)/'`randphull2.cc; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" "$(DEPDIR)/nnc_randphull2-randphull2.Po"; else rm -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='randphull2.cc' object='nnc_randphull2-randphull2.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull2-randphull2.o `test -f 'randphull2.cc' || echo '$(srcdir)/'`randphull2.cc
+
+nnc_randphull2-randphull2.obj: randphull2.cc
+ at am__fastdepCXX_TRUE@ if $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -MT nnc_randphull2-randphull2.obj -MD -MP -MF "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" -c -o nnc_randphull2-randphull2.obj `if test -f 'randphull2.cc'; then $(CYGPATH_W) 'randphull2.cc'; else $(CYGPATH_W) '$(srcdir)/randphull2.cc'; fi`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo" "$(DEPDIR)/nnc_randphull2-randphull2.Po"; else rm -f "$(DEPDIR)/nnc_randphull2-randphull2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='randphull2.cc' object='nnc_randphull2-randphull2.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(nnc_randphull2_CXXFLAGS) $(CXXFLAGS) -c -o nnc_randphull2-randphull2.obj `if test -f 'randphull2.cc'; then $(CYGPATH_W) 'randphull2.cc'; else $(CYGPATH_W) '$(srcdir)/randphull2.cc'; fi`
+
+nnc_relations1-relations1.o: relations1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_relations1-relations1.Tpo" "$(DEPDIR)/nnc_relations1-relations1.Po"; else rm -f "$(DEPDIR)/nnc_relations1-relations1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_relations1-relations1.Tpo" "$(DEPDIR)/nnc_relations1-relations1.Po"; else rm -f "$(DEPDIR)/nnc_relations1-relations1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_relations2-relations2.Tpo" "$(DEPDIR)/nnc_relations2-relations2.Po"; else rm -f "$(DEPDIR)/nnc_relations2-relations2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_relations2-relations2.Tpo" "$(DEPDIR)/nnc_relations2-relations2.Po"; else rm -f "$(DEPDIR)/nnc_relations2-relations2.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po"; else rm -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo" "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Po"; else rm -f "$(DEPDIR)/nnc_removespacedims1-removespacedims1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_smm1-smm1.o: smm1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_smm1-smm1.Tpo" "$(DEPDIR)/nnc_smm1-smm1.Po"; else rm -f "$(DEPDIR)/nnc_smm1-smm1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_smm1-smm1.Tpo" "$(DEPDIR)/nnc_smm1-smm1.Po"; else rm -f "$(DEPDIR)/nnc_smm1-smm1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po"; else rm -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo" "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Po"; else rm -f "$(DEPDIR)/nnc_timeelapse1-timeelapse1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_universe1-universe1.o: universe1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_universe1-universe1.Tpo" "$(DEPDIR)/nnc_universe1-universe1.Po"; else rm -f "$(DEPDIR)/nnc_universe1-universe1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_universe1-universe1.Tpo" "$(DEPDIR)/nnc_universe1-universe1.Po"; else rm -f "$(DEPDIR)/nnc_universe1-universe1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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_writepolyhedron1-writepolyhedron1.o: writepolyhedron1.cc
+ at am__fastdepCXX_TRUE@ if $(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@ then mv -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po"; else rm -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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@ if $(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@ then mv -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo" "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Po"; else rm -f "$(DEPDIR)/nnc_writepolyhedron1-writepolyhedron1.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ 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@ $(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
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; \
+ 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; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xpass=`expr $$xpass + 1`; \
+ failed=`expr $$failed + 1`; \
+ echo "XPASS: $$tst"; \
+ ;; \
+ *) \
+ echo "PASS: $$tst"; \
+ ;; \
+ esac; \
+ elif test $$? -ne 77; then \
+ all=`expr $$all + 1`; \
+ case " $(XFAIL_TESTS) " in \
+ *" $$tst "*) \
+ xfail=`expr $$xfail + 1`; \
+ echo "XFAIL: $$tst"; \
+ ;; \
+ *) \
+ failed=`expr $$failed + 1`; \
+ echo "FAIL: $$tst"; \
+ ;; \
+ esac; \
+ else \
+ skip=`expr $$skip + 1`; \
+ echo "SKIP: $$tst"; \
+ fi; \
+ done; \
+ if test "$$failed" -eq 0; then \
+ if test "$$xfail" -eq 0; then \
+ banner="All $$all tests passed"; \
+ else \
+ 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 \
+ banner="$$failed of $$all tests did not behave as expected ($$xpass unexpected passes)"; \
+ fi; \
+ fi; \
+ dashes="$$banner"; \
+ skipped=""; \
+ if test "$$skip" -ne 0; then \
+ skipped="($$skip tests were not run)"; \
+ 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`; \
+ echo "$$dashes"; \
+ echo "$$banner"; \
+ test -z "$$skipped" || echo "$$skipped"; \
+ test -z "$$report" || echo "$$report"; \
+ echo "$$dashes"; \
+ test "$$failed" -eq 0; \
+ else :; fi
+
+distdir: $(DISTFILES)
+ @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
+ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
+ list='$(DISTFILES)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+ -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES)
+
+clean-generic:
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-TESTS check-am clean \
+ clean-checkPROGRAMS clean-generic clean-libtool ctags \
+ 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-exec install-exec-am install-info \
+ install-info-am install-man 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 uninstall uninstall-am uninstall-info-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/Polyhedron/README b/tests/Polyhedron/README
new file mode 100644
index 0000000..9568d6c
--- /dev/null
+++ b/tests/Polyhedron/README
@@ -0,0 +1,115 @@
+Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+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 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of 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 called `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 2 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 are called `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://www.cs.unipr.it/ppl/ .
diff --git a/tests/Polyhedron/addcongruence1.cc b/tests/Polyhedron/addcongruence1.cc
new file mode 100644
index 0000000..027a9f4
--- /dev/null
+++ b/tests/Polyhedron/addcongruence1.cc
@@ -0,0 +1,129 @@
+/* Test Polyhedron::add_congruence().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+ Variable B(1);
+
+ C_Polyhedron ph(2);
+ ph.add_congruence(A %= 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((A + B %= 3) / 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((A + B %= 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;
+}
+
+} // 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/addcongruences1.cc b/tests/Polyhedron/addcongruences1.cc
new file mode 100644
index 0000000..677a9fc
--- /dev/null
+++ b/tests/Polyhedron/addcongruences1.cc
@@ -0,0 +1,166 @@
+/* Test Polyhedron::add_congruences().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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(x %= 3);
+ 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(A - B %= 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);
+
+ 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
+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;
+}
+
+} // 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/addconstraint1.cc b/tests/Polyhedron/addconstraint1.cc
new file mode 100644
index 0000000..2d3c83c
--- /dev/null
+++ b/tests/Polyhedron/addconstraint1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::add_constraint().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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_and_minimize(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..7354187
--- /dev/null
+++ b/tests/Polyhedron/addconstraints1.cc
@@ -0,0 +1,363 @@
+/* Test Polyhedron::add_constrains().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(cs1);
+
+ Constraint_System cs2;
+ cs2.insert(Linear_Expression::zero() >= 7);
+ C_Polyhedron ph2;
+ ph2.add_constraints_and_minimize(cs2);
+
+ Constraint_System cs3;
+ cs3.insert(Linear_Expression::zero() >= -3);
+ C_Polyhedron ph3;
+ ph3.add_constraints_and_minimize(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_and_minimize(cs);
+
+ bool ok = (computed_result == ph);
+
+ print_constraints(computed_result,
+ "*** After add_constraints_and_minimize ***");
+
+ 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_and_minimize(cs);
+
+ C_Polyhedron computed_result(3, EMPTY);
+
+ bool ok = (ph == computed_result);
+
+ print_constraints(ph, "*** After add_constraints_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize(cs);
+
+ C_Polyhedron known_result(3, EMPTY);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** After add_constraints_and_minimize(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_and_minimize(cs2);
+
+ bool ok = (ph == copy_ph);
+
+ print_constraints(ph, "*** After ph.add_constraints(cs1) ***");
+ print_constraints(ph,
+ "*** After copy_ph.add_constraints_and_minimize(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_and_minimize(cs2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_constraints(ph1, "*** After add_constraints_assign ***");
+ print_constraints(copy_ph1,
+ "*** After add_constraints_and_minimize ***");
+
+ 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..1203f93
--- /dev/null
+++ b/tests/Polyhedron/addconstraints2.cc
@@ -0,0 +1,93 @@
+/* Test Polyhedron::add_constrains().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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_and_minimize(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_and_minimize(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..66193f5
--- /dev/null
+++ b/tests/Polyhedron/addgenerator1.cc
@@ -0,0 +1,101 @@
+/* Test Polyhedron::add_generator().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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_and_minimize(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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+END_MAIN
diff --git a/tests/Polyhedron/addgenerator2.cc b/tests/Polyhedron/addgenerator2.cc
new file mode 100644
index 0000000..54ff899
--- /dev/null
+++ b/tests/Polyhedron/addgenerator2.cc
@@ -0,0 +1,129 @@
+/* Test Polyhedron::add_generator().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..2c6e813
--- /dev/null
+++ b/tests/Polyhedron/addgenerators1.cc
@@ -0,0 +1,336 @@
+/* Test Polyhedron::add_generators().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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_and_minimize ***");
+
+ 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_and_minimize(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_and_minimize(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_and_minimize ***");
+
+ 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_and_minimize(gs);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "*** After ph .add_generators_and_minimize(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_and_minimize(gs2);
+
+ bool ok = (ph == copy_ph);
+
+ print_generators(ph, "*** After ph.add_generators(gs1) ***");
+ print_generators(ph,
+ "*** After copy_ph.add_generators_and_minimize(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_and_minimize(gs2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_generators(ph1, "*** After add_generators_assign ***");
+ print_generators(copy_ph1,
+ "*** After add_generators_and_minimize ***");
+
+ 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_and_minimize ***");
+
+ 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/addgenerators2.cc b/tests/Polyhedron/addgenerators2.cc
new file mode 100644
index 0000000..cdc521d
--- /dev/null
+++ b/tests/Polyhedron/addgenerators2.cc
@@ -0,0 +1,137 @@
+/* Test Polyhedron::add_generators().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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_and_minimize(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_and_minimize(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..1baf500
--- /dev/null
+++ b/tests/Polyhedron/addspacedims1.cc
@@ -0,0 +1,201 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+ and Polyhedron::add_space_dimensions_and_embed().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..1dc5cf6
--- /dev/null
+++ b/tests/Polyhedron/addspacedims2.cc
@@ -0,0 +1,248 @@
+/* Test Polyhedron::add_space_dimensions_and_project()
+ and Polyhedron::add_space_dimensions_and_embed().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..8184a4a
--- /dev/null
+++ b/tests/Polyhedron/affineimage1.cc
@@ -0,0 +1,265 @@
+/* Test Polyhedron::affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..ffe4069
--- /dev/null
+++ b/tests/Polyhedron/affineimage2.cc
@@ -0,0 +1,74 @@
+/* Test Polyhedron::affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_hull_assign_and_minimize(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.poly_hull_assign_and_minimize(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..91e6e23
--- /dev/null
+++ b/tests/Polyhedron/affinepreimage1.cc
@@ -0,0 +1,437 @@
+/* Test Polyhedron::affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..ac4b425
--- /dev/null
+++ b/tests/Polyhedron/affinetrans.cc
@@ -0,0 +1,81 @@
+/* Use of the functions affine_image and affine_preimage.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..bb8af7f
--- /dev/null
+++ b/tests/Polyhedron/append1.cc
@@ -0,0 +1,108 @@
+/* An example of iteration to a post-fixpoint.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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
+
+int
+main() TRY {
+ set_handlers();
+
+ 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.poly_hull_assign_and_minimize(previous);
+
+ print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+
+ } 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 ? 0 : 1;
+}
+CATCH
diff --git a/tests/Polyhedron/append2.cc b/tests/Polyhedron/append2.cc
new file mode 100644
index 0000000..342264a
--- /dev/null
+++ b/tests/Polyhedron/append2.cc
@@ -0,0 +1,129 @@
+/* An example of iteration to a post-fixpoint.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_hull_assign_and_minimize(previous);
+
+ print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+
+ } while (current != previous);
+ finish = current;
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ 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 ? 0 : 1;
+}
+CATCH
diff --git a/tests/Polyhedron/ascii_dump_load1.cc b/tests/Polyhedron/ascii_dump_load1.cc
new file mode 100644
index 0000000..bfe6d23
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load1.cc
@@ -0,0 +1,601 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..848528f
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load2.cc
@@ -0,0 +1,138 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..aee0efd
--- /dev/null
+++ b/tests/Polyhedron/ascii_dump_load3.cc
@@ -0,0 +1,433 @@
+/* Test Polyhedron::ascii_dump() and Polyhedron::ascii_load().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..3eb79a5
--- /dev/null
+++ b/tests/Polyhedron/bgp99extrapolation1.cc
@@ -0,0 +1,269 @@
+/* Test Polyhedra_Powerset<PH>::BGP99_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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];
+}
+
+Polyhedra_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+ Polyhedra_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);
+
+ Polyhedra_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) {
+ Polyhedra_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
+ std::swap(Sn, T);
+ }
+
+ return !converged;
+}
+
+bool
+test02() {
+ 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);
+
+ Polyhedra_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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F16(test01);
+ DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/Polyhedron/bhrz03widening1.cc b/tests/Polyhedron/bhrz03widening1.cc
new file mode 100644
index 0000000..e8cf0fb
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening1.cc
@@ -0,0 +1,754 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_hull_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..17b1895
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening2.cc
@@ -0,0 +1,261 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..c27e09b
--- /dev/null
+++ b/tests/Polyhedron/bhrz03widening3.cc
@@ -0,0 +1,607 @@
+/* Test Polyhedron::BHRZ03_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_hull_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.
+ const Coefficient& d1 = p1.divisor();
+ const Coefficient& d2 = p2.divisor();
+ Linear_Expression expr = d2 * Linear_Expression(p1);
+ expr += d1 * Linear_Expression(p2);
+ // 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)*expr, 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.poly_hull_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 expr;
+ expr += Linear_Expression(r1);
+ expr += Linear_Expression(r2);
+ // NOTE: I am not *sure* this dirty kludge of using such
+ // a magic number will always succeed.
+ expr *= magic_number + 1;
+ expr -= C;
+ return ray(expr);
+}
+
+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.poly_hull_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;
+}
+
+} // 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);
+END_MAIN
diff --git a/tests/Polyhedron/bhz03widening1.cc b/tests/Polyhedron/bhz03widening1.cc
new file mode 100644
index 0000000..1c9d2c9
--- /dev/null
+++ b/tests/Polyhedron/bhz03widening1.cc
@@ -0,0 +1,723 @@
+/* Test Polyhedra_Powerset<PH>::BHZ03_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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];
+}
+
+Polyhedra_Powerset<C_Polyhedron>
+aux2_test01(unsigned n) {
+ Polyhedra_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);
+
+ Polyhedra_Powerset<C_Polyhedron> T = aux2_test01(0);
+
+ nout << "T0 = " << T << endl;
+
+ bool converged = false;
+ for (unsigned n = 1; !converged && n <= 20; ++n) {
+ Polyhedra_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
+ std::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);
+ Polyhedra_Powerset<C_Polyhedron> P(2, EMPTY);
+ P.add_disjunct(p);
+ P.add_disjunct(q);
+ P.add_disjunct(r);
+ P.add_disjunct(s);
+ Polyhedra_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;
+
+ Polyhedra_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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+
+ Polyhedra_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);
+
+ Polyhedra_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];
+}
+
+Polyhedra_Powerset<C_Polyhedron>
+aux2_test04(unsigned n) {
+ Polyhedra_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);
+
+ Polyhedra_Powerset<C_Polyhedron> T = aux2_test04(0);
+
+ nout << "T0 = " << T << endl;
+
+ bool converged = false;
+ for (unsigned n = 1; !converged && n <= 20; ++n) {
+ Polyhedra_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
+ std::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);
+ Polyhedra_Powerset<C_Polyhedron> P(2, EMPTY);
+ P.add_disjunct(p);
+ P.add_disjunct(q);
+ P.add_disjunct(r);
+ P.add_disjunct(s);
+ Polyhedra_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;
+
+ Polyhedra_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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+
+ Polyhedra_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);
+
+ Polyhedra_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 polyhull 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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+
+ Polyhedra_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 polyhull 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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+
+ Polyhedra_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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+
+ Polyhedra_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);
+
+ Polyhedra_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..96d0cf9
--- /dev/null
+++ b/tests/Polyhedron/bounded1.cc
@@ -0,0 +1,106 @@
+/* Test Polyhedron::is_bounded().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..aaae9a5
--- /dev/null
+++ b/tests/Polyhedron/boundedaffineimage1.cc
@@ -0,0 +1,120 @@
+/* Test Polyhedron::bounded_affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_THAN_OR_EQUAL, 7-B);
+ kr2.generalized_affine_image(A, LESS_THAN_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_THAN_OR_EQUAL, 7-3*A+2*B);
+ kr2.generalized_affine_image(A, LESS_THAN_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) ---");
+
+ 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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/boundedaffinepreimage1.cc b/tests/Polyhedron/boundedaffinepreimage1.cc
new file mode 100644
index 0000000..d438f02
--- /dev/null
+++ b/tests/Polyhedron/boundedaffinepreimage1.cc
@@ -0,0 +1,124 @@
+/* Test Polyhedron::bounded_affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..909744c
--- /dev/null
+++ b/tests/Polyhedron/boundedbhrz03extrapolation1.cc
@@ -0,0 +1,111 @@
+/* Test Polyhedron::bounded_BHRZ03_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 i(0);
+ Variable j(1);
+ Variable k(2);
+ Variable::set_output_function(aux_test01);
+
+ 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.poly_hull_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.poly_hull_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");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8(test01);
+END_MAIN
diff --git a/tests/Polyhedron/boundedh79extrapolation1.cc b/tests/Polyhedron/boundedh79extrapolation1.cc
new file mode 100644
index 0000000..3595dd8
--- /dev/null
+++ b/tests/Polyhedron/boundedh79extrapolation1.cc
@@ -0,0 +1,74 @@
+/* Test Polyhedron::bounded_H79_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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
+ DO_TEST_F8A(test01);
+END_MAIN
diff --git a/tests/Polyhedron/boundingbox1.cc b/tests/Polyhedron/boundingbox1.cc
new file mode 100644
index 0000000..9750a9b
--- /dev/null
+++ b/tests/Polyhedron/boundingbox1.cc
@@ -0,0 +1,594 @@
+/* Test Polyhedron::shrink_bounding_box().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "BBox.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);
+
+ BBox pbox(2);
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(2);
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test01 ph ***");
+ nbox.print(nout, "*** test01 nbox ***");
+ pbox.print(nout, "*** test01 pbox ***");
+
+ BBox known_box(2);
+
+ known_box.print(nout, "*** test01 known_box ***");
+
+ return nbox == known_box && pbox == known_box;
+}
+
+// A non-bounded closed polyhedron in 2D consisting of a wedge bounded
+// by y >= 0 and x >= y.
+// The resulting bounding box depends on the complexity class.
+bool
+test02() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(x >= y);
+ ph.add_constraint(y >= 0);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test02 ph ***");
+ nbox.print(nout, "*** test02 nbox ***");
+ pbox.print(nout, "*** test02 pbox ***");
+
+ BBox known_nbox(2);
+ known_nbox.raise_lower_bound(0, true, 0, 1);
+ known_nbox.raise_lower_bound(1, true, 0, 1);
+
+ BBox known_pbox(2);
+ known_pbox.raise_lower_bound(1, true, 0, 1);
+
+ known_nbox.print(nout, "*** test02 known_nbox ***");
+ known_pbox.print(nout, "*** test02 known_pbox ***");
+
+ return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// 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);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test03 ph ***");
+ nbox.print(nout, "*** test03 nbox ***");
+ pbox.print(nout, "*** test03 pbox ***");
+
+ BBox known_nbox(2);
+ known_nbox.raise_lower_bound(0, true, -2, 3);
+ known_nbox.lower_upper_bound(0, true, 4, 1);
+ known_nbox.raise_lower_bound(1, true, -10, 1);
+ known_nbox.lower_upper_bound(1, true, 12, 3);
+
+ BBox known_pbox(2);
+ known_pbox.lower_upper_bound(0, true, 4, 1);
+ known_pbox.lower_upper_bound(1, true, 4, 1);
+
+ known_nbox.print(nout, "*** test03 known_nbox ***");
+ known_pbox.print(nout, "*** test03 known_pbox ***");
+
+ return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// 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);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test04 ph ***");
+ nbox.print(nout, "*** test04 nbox ***");
+ pbox.print(nout, "*** test04 pbox ***");
+
+ BBox known_nbox(4);
+ known_nbox.raise_lower_bound(1, true, -2, 3);
+ known_nbox.lower_upper_bound(1, true, 4, 1);
+ known_nbox.raise_lower_bound(2, true, -10, 1);
+ known_nbox.lower_upper_bound(2, true, 12, 3);
+ known_nbox.raise_lower_bound(3, true, 15, 3);
+
+ BBox known_pbox(4);
+ known_pbox.lower_upper_bound(1, true, 4, 1);
+ known_pbox.lower_upper_bound(2, true, 4, 1);
+ known_pbox.raise_lower_bound(3, true, 5, 1);
+
+ known_nbox.print(nout, "*** test04 known_nbox ***");
+ known_pbox.print(nout, "*** test04 known_pbox ***");
+
+ return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// This is the universal, 2-dimensional closed polyhedron.
+bool
+test05() {
+ C_Polyhedron ph(2);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test05 ph ***");
+ nbox.print(nout, "*** test05 nbox ***");
+ pbox.print(nout, "*** test05 pbox ***");
+
+ BBox known_box(2);
+
+ known_box.print(nout, "*** test05 known_box ***");
+
+ return nbox == known_box && pbox == known_box;
+}
+
+// A zero-dimensional closed polyhedron.
+bool
+test06() {
+ C_Polyhedron ph;
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test06 ph ***");
+ nbox.print(nout, "*** test06 nbox ***");
+ pbox.print(nout, "*** test06 pbox ***");
+
+ BBox known_box(0);
+
+ known_box.print(nout, "*** test06 known_box ***");
+
+ return nbox == known_box && pbox == known_box;
+}
+
+// An empty closed polyhedron in 2D.
+bool
+test07() {
+ C_Polyhedron ph(2, EMPTY);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test07 ph ***");
+ nbox.print(nout, "*** test07 nbox ***");
+ pbox.print(nout, "*** test07 pbox ***");
+
+ BBox known_box(ph.space_dimension());
+ known_box.set_empty();
+
+ known_box.print(nout, "*** test07 known_box ***");
+
+ return nbox == known_box && pbox == known_box;
+}
+
+// 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);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test08 ph ***");
+ nbox.print(nout, "*** test08 nbox ***");
+ pbox.print(nout, "*** test08 pbox ***");
+
+ BBox known_box(2);
+ known_box.raise_lower_bound(0, true, 2, 1);
+ known_box.lower_upper_bound(0, true, 2, 1);
+ known_box.raise_lower_bound(1, true, 4, 1);
+ known_box.lower_upper_bound(1, true, 4, 1);
+
+ known_box.print(nout, "*** test08 known_box ***");
+
+ return nbox == known_box && pbox == known_box;
+}
+
+// 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);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test09 ph ***");
+ nbox.print(nout, "*** test09 nbox ***");
+ pbox.print(nout, "*** test09 pbox ***");
+
+ BBox known_box(2);
+ known_box.raise_lower_bound(0, true, 0, 1);
+ known_box.lower_upper_bound(0, true, 1, 1);
+ known_box.raise_lower_bound(1, true, 0, 1);
+ known_box.lower_upper_bound(1, true, 1, 1);
+
+ known_box.print(nout, "*** test09 known_box ***");
+
+ return nbox == known_box && pbox == known_box;
+}
+
+// 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);
+
+ print_constraints(ph, "*** test10 ph ***");
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ nbox.print(nout, "*** test10 nbox ***");
+ pbox.print(nout, "*** test10 pbox ***");
+
+ BBox known_box(2);
+ known_box.raise_lower_bound(0, true, 1, 1);
+ known_box.lower_upper_bound(0, true, 3, 1);
+ known_box.raise_lower_bound(1, true, 1, 1);
+ known_box.lower_upper_bound(1, true, 3, 1);
+
+ known_box.print(nout, "*** test10 known_box ***");
+
+ return nbox == known_box && pbox == known_box;
+}
+
+// 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);
+
+ print_constraints(ph, "*** test11 ph ***");
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ pbox.print(nout, "*** test11 pbox ***");
+
+ BBox known_box(2);
+ known_box.raise_lower_bound(0, true, 3, 1);
+ known_box.lower_upper_bound(0, true, 3, 1);
+ known_box.raise_lower_bound(1, true, 1, 1);
+ known_box.lower_upper_bound(1, true, 1, 1);
+
+ known_box.print(nout, "*** test11 known_box ***");
+
+ return pbox == known_box;
+}
+
+// The box is the xy plane.
+bool
+test12() {
+ Bounding_Box box(2);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ C_Polyhedron known_ph(box.space_dimension());
+
+ print_generators(ph, "*** test12 ph ***");
+ print_generators(known_ph, "*** test12 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// This box is the closed +ve quadrant.
+bool
+test13() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.raise_lower_bound(1, true, 0, 1);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(x >= 0);
+ known_ph.add_constraint(y >= 0);
+
+ print_generators(ph, "*** test13 ph ***");
+ print_generators(known_ph, "*** test13 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// A bounded box in 2D.
+bool
+test14() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, -2, 3);
+ box.lower_upper_bound(0, true, 4, 1);
+ box.raise_lower_bound(1, true, -10, 1);
+ box.lower_upper_bound(1, true, 12, 3);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ Variable x(0);
+ Variable y(1);
+
+ 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);
+
+ print_generators(ph, "*** test14 ph ***");
+ print_generators(known_ph, "*** test14 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// An unbounded closed box in 4D but bounded in 2D.
+bool
+test15() {
+ Bounding_Box box(4);
+ box.raise_lower_bound(1, true, -2, 3);
+ box.lower_upper_bound(1, true, 4, 1);
+ box.raise_lower_bound(2, true, -10, 1);
+ box.lower_upper_bound(2, true, 12, 3);
+ box.raise_lower_bound(3, true, 15, 3);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ Variable x(1);
+ Variable y(2);
+ Variable z(3);
+
+ 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);
+
+ print_generators(ph, "*** test15 ph ***");
+ print_generators(known_ph, "*** test15 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// A zero-dimensional box.
+bool
+test16() {
+ Bounding_Box box(0);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ C_Polyhedron known_ph;
+
+ print_generators(ph, "*** test16 ph ***");
+ print_generators(known_ph, "*** test16 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// An empty closed box in 2D.
+bool
+test17() {
+ Bounding_Box box(2);
+ box.set_empty();
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ print_constraints(ph, "*** test17 ph ***");
+
+ C_Polyhedron known_ph(2, EMPTY);
+
+ print_constraints(known_ph, "*** test17 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// A single point.
+bool
+test18() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 2, 1);
+ box.lower_upper_bound(0, true, 2, 1);
+ box.raise_lower_bound(1, true, 4, 1);
+ box.lower_upper_bound(1, true, 4, 1);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron known_ph(box.space_dimension());
+ known_ph.add_constraint(x == 2);
+ known_ph.add_constraint(y == 4);
+
+ print_generators(ph, "*** test18 ph ***");
+ print_generators(known_ph, "*** test18 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// A closed unit square.
+bool
+test19() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.lower_upper_bound(0, true, 1, 1);
+ box.raise_lower_bound(1, true, 0, 1);
+ box.lower_upper_bound(1, true, 1, 1);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ Variable x(0);
+ Variable y(1);
+
+ 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);
+
+ print_generators(ph, "*** test19 ph generators ***");
+ print_generators(known_ph, "*** test19 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// Constructs the polyhedron { x >= 0, x <= 1/2, y >= 0 }
+// from the corresponding box.
+bool
+test20() {
+ Bounding_Box box(2);
+ box.raise_lower_bound(0, true, 0, 1);
+ box.lower_upper_bound(0, true, 1, 2);
+ box.raise_lower_bound(1, true, 0, 1);
+
+ C_Polyhedron ph(box, From_Bounding_Box());
+
+ print_generators(ph, "*** test20 ph ***");
+
+ Variable x(0);
+ Variable y(1);
+
+ 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);
+
+ print_generators(known_ph, "*** test20 known_ph ***");
+
+ return ph == known_ph;
+}
+
+} // 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/boundingbox2.cc b/tests/Polyhedron/boundingbox2.cc
new file mode 100644
index 0000000..2fe0ded
--- /dev/null
+++ b/tests/Polyhedron/boundingbox2.cc
@@ -0,0 +1,50 @@
+/* Test Polyhedron::shrink_bounding_box().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "BBox.hh"
+
+namespace {
+
+bool
+test01() {
+ C_Polyhedron ph(1, EMPTY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** ph ***");
+ nbox.print(nout, "*** nbox ***");
+
+ BBox known_box(ph.space_dimension());
+ known_box.set_empty();
+
+ known_box.print(nout, "*** known_box ***");
+
+ return nbox == known_box;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/boundingbox3.cc b/tests/Polyhedron/boundingbox3.cc
new file mode 100644
index 0000000..a43bcf3
--- /dev/null
+++ b/tests/Polyhedron/boundingbox3.cc
@@ -0,0 +1,218 @@
+/* Test NNC_Polyhedron::shrink_bounding_box().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "BBox.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);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test01 ph ***");
+ nbox.print(nout, "*** test01 nbox ***");
+ pbox.print(nout, "*** test01 pbox ***");
+
+ BBox known_nbox(4);
+ known_nbox.raise_lower_bound(1, false, -2, 3);
+ known_nbox.lower_upper_bound(1, true, 4, 1);
+ known_nbox.raise_lower_bound(2, false, -10, 1);
+ known_nbox.lower_upper_bound(2, true, 4, 1);
+ known_nbox.raise_lower_bound(3, true, 5, 1);
+
+ BBox known_pbox(4);
+ known_pbox.lower_upper_bound(1, true, 4, 1);
+ known_pbox.lower_upper_bound(2, true, 4, 1);
+ known_pbox.raise_lower_bound(3, true, 5, 1);
+
+ known_nbox.print(nout, "*** test9 known_nbox ***");
+ known_pbox.print(nout, "*** test9 known_pbox ***");
+
+ return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// 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);
+
+ BBox pbox(ph.space_dimension());
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ BBox nbox(ph.space_dimension());
+ ph.shrink_bounding_box(nbox);
+
+ print_constraints(ph, "*** test02 ph ***");
+ nbox.print(nout, "*** test02 nbox ***");
+ pbox.print(nout, "*** test02 pbox ***");
+
+ BBox known_nbox(2);
+ known_nbox.raise_lower_bound(0, true, -2, 3);
+ known_nbox.lower_upper_bound(0, false, 4, 1);
+ known_nbox.raise_lower_bound(1, false, -10, 1);
+ known_nbox.lower_upper_bound(1, true, 4, 1);
+
+ BBox known_pbox(2);
+ known_pbox.lower_upper_bound(0, false, 4, 1);
+ known_pbox.lower_upper_bound(1, true, 4, 1);
+
+ known_nbox.print(nout, "*** test02 known_nbox ***");
+ known_pbox.print(nout, "*** test02 known_pbox ***");
+
+ return nbox == known_nbox && pbox == known_pbox && nbox <= pbox;
+}
+
+// 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);
+
+ Bounding_Box pbox(2);
+ ph.shrink_bounding_box(pbox, POLYNOMIAL_COMPLEXITY);
+
+ Bounding_Box nbox(2);
+ ph.shrink_bounding_box(nbox);
+
+ NNC_Polyhedron known_ph(2, EMPTY);
+ NNC_Polyhedron known_pph(pbox, From_Bounding_Box());
+ NNC_Polyhedron known_nph(nbox, From_Bounding_Box());
+
+ print_generators(ph, "*** test03 ph ***");
+ print_generators(known_pph, "*** test03 known_pph ***");
+ print_generators(known_nph, "*** test03 known_nph ***");
+
+ return ph == known_ph && ph == known_nph && ph == known_ph;
+}
+
+// An unbounded box in 4D but bounded in 2D with strict inequalities.
+bool
+test04() {
+ Bounding_Box box(4);
+ box.raise_lower_bound(1, false, -2, 3);
+ box.lower_upper_bound(1, true, 4, 1);
+ box.raise_lower_bound(2, false, -10, 1);
+ box.lower_upper_bound(2, true, 12, 3);
+ box.raise_lower_bound(3, true, 15, 3);
+
+ NNC_Polyhedron ph(box, From_Bounding_Box());
+
+ Variable x(1);
+ Variable y(2);
+ Variable z(3);
+
+ 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);
+
+ print_generators(ph, "*** test04 ph ***");
+ print_generators(known_ph, "*** test04 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// A bounded NNC polyhedron with strict inequalities
+// causing upper and lower bounds of the box to be open.
+bool
+test05() {
+ Bounding_Box box(4);
+ box.raise_lower_bound(1, true, -2, 3);
+ box.lower_upper_bound(1, false, 4, 1);
+ box.raise_lower_bound(2, false, -10, 1);
+ box.lower_upper_bound(2, true, 12, 3);
+
+ NNC_Polyhedron ph(box, From_Bounding_Box());
+
+ Variable x(1);
+ Variable y(2);
+
+ 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);
+
+ print_generators(ph, "*** test05 ph ***");
+ print_generators(known_ph, "*** test05 known_ph ***");
+
+ return ph == known_ph;
+}
+
+// An empty box in 2D.
+bool
+test06() {
+ Bounding_Box box(2);
+ box.set_empty();
+
+ NNC_Polyhedron ph(box, From_Bounding_Box());
+
+ print_constraints(ph, "*** test06 ph ***");
+
+ NNC_Polyhedron known_ph(2, EMPTY);
+
+ print_constraints(known_ph, "*** test06 known_ph ***");
+
+ return ph == known_ph;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+ DO_TEST_F8A(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/bounds1.cc b/tests/Polyhedron/bounds1.cc
new file mode 100644
index 0000000..bf82834
--- /dev/null
+++ b/tests/Polyhedron/bounds1.cc
@@ -0,0 +1,64 @@
+/* Test Polyhedron::bounds_from_below() and Polyhedron::bounds_from_above().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/bug2.cc b/tests/Polyhedron/bug2.cc
new file mode 100644
index 0000000..f80e9eb
--- /dev/null
+++ b/tests/Polyhedron/bug2.cc
@@ -0,0 +1,62 @@
+/* Try to reproduce a strange behavior observed on MacOs X.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <fstream>
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+int
+main() TRY {
+ std::ifstream s(SRCDIR "/bug2.dat");
+ if (!s) {
+ std::cerr << "Cannot open data file!!!" << endl;
+ exit(1);
+ }
+
+ NNC_Polyhedron ph;
+ ph.ascii_load(s);
+
+ const Constraint_System& cs = ph.constraints();
+ unsigned num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(), cs_end = cs.end();
+ i != cs_end;
+ ++i)
+ ++num_constraints;
+ ph.ascii_dump(nout);
+ const Generator_System& gs = ph.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) {
+
+ nout << "i->type() == " << i->type() << endl;
+
+ exit(1);
+ }
+ ++num_points;
+ }
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/cnncconversion1.cc b/tests/Polyhedron/cnncconversion1.cc
new file mode 100644
index 0000000..b64a6a4
--- /dev/null
+++ b/tests/Polyhedron/cnncconversion1.cc
@@ -0,0 +1,103 @@
+/* Test conversions between C_Polyhedron and NNC_Polyhedron.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+END_MAIN
diff --git a/tests/Polyhedron/concatenate1.cc b/tests/Polyhedron/concatenate1.cc
new file mode 100644
index 0000000..11714e3
--- /dev/null
+++ b/tests/Polyhedron/concatenate1.cc
@@ -0,0 +1,283 @@
+/* Test Polyhedron::concatenate_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..4bc5f07
--- /dev/null
+++ b/tests/Polyhedron/congruences1.cc
@@ -0,0 +1,53 @@
+/* Test C_Polyhedron(Congruence_System&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool test01() {
+ Variable x(0);
+ Variable y(1);
+
+ Congruence_System cgs;
+ cgs.insert(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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/constraints1.cc b/tests/Polyhedron/constraints1.cc
new file mode 100644
index 0000000..7254483
--- /dev/null
+++ b/tests/Polyhedron/constraints1.cc
@@ -0,0 +1,165 @@
+/* Test Polyhedron::constraints().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Variable A(0);
+
+ C_Polyhedron ph1(2);
+ ph1.add_constraint(0*A == 1);
+
+ print_constraints(ph1, "*** ph 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_and_minimize(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..e8768e1
--- /dev/null
+++ b/tests/Polyhedron/contains1.cc
@@ -0,0 +1,114 @@
+/* Test Polyhedron::contains(const Polyhedron&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..ed2cd3d
--- /dev/null
+++ b/tests/Polyhedron/contains2.cc
@@ -0,0 +1,176 @@
+/* Test NNC_Polyhedron::contains(const Polyhedron&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/disjoint1.cc b/tests/Polyhedron/disjoint1.cc
new file mode 100644
index 0000000..ad2ce3b
--- /dev/null
+++ b/tests/Polyhedron/disjoint1.cc
@@ -0,0 +1,145 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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);
+ 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..a877ea7
--- /dev/null
+++ b/tests/Polyhedron/disjoint2.cc
@@ -0,0 +1,132 @@
+/* Test Polyhedron::is_disjoint_from(const Polyhedron& y).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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);
+ 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/dualhypercubes.cc b/tests/Polyhedron/dualhypercubes.cc
new file mode 100644
index 0000000..8904361
--- /dev/null
+++ b/tests/Polyhedron/dualhypercubes.cc
@@ -0,0 +1,290 @@
+/* Exploit smf when computing the intersection of NNC dual hypercubes.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "timings.hh"
+#include <vector>
+
+#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 perc,
+ 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, perc));
+
+ // 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, perc));
+
+ // 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, perc));
+
+ // 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, perc));
+}
+
+void
+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 dimensions of arguments
+ // (being careful to override library laziness).
+ vnout << "Computing intersection of ph[0] and ph[1]:" << endl;
+ vnout << "=== ph[0] generators ===" << endl;
+ ph[0].generators().ascii_dump(vnout);
+ vnout << "=== ph[1] generators ===" << endl;
+ ph[1].generators().ascii_dump(vnout);
+
+ if (enhanced) {
+ ph[0].minimized_constraints();
+ ph[1].minimized_constraints();
+
+ // Print dimensions of arguments.
+ vnout << "After the computation of smf for constraints" << endl;
+ }
+
+ vnout << "=== ph[0] constraints ===" << endl;
+ ph[0].constraints().ascii_dump(vnout);
+ vnout << "=== ph[1] constraints ===" << endl;
+ ph[1].constraints().ascii_dump(vnout);
+ vnout << endl;
+
+ ph[0].intersection_assign(ph[1]);
+
+ // Compute the intersection of ph[2] and ph[3].
+
+ // Print dimensions of arguments
+ // (being careful to override library laziness).
+ vnout << "Computing intersection of ph[2] and ph[3]:" << endl;
+ vnout << "=== ph[2] generators ===" << endl;
+ ph[2].generators().ascii_dump(vnout);
+ vnout << "=== ph[3] generators ===" << endl;
+ ph[3].generators().ascii_dump(vnout);
+
+ if (enhanced) {
+ ph[2].minimized_constraints();
+ ph[3].minimized_constraints();
+
+ // Print dimensions of arguments.
+ vnout << "After the computation of smf for constraints" << endl;
+ }
+ vnout << "=== ph[2] constraints ===" << endl;
+ ph[2].constraints().ascii_dump(vnout);
+ vnout << "=== ph[3] constraints ===" << endl;
+ ph[3].constraints().ascii_dump(vnout);
+ vnout << endl;
+
+ ph[2].intersection_assign(ph[3]);
+
+ // Compute the poly-hull of ph[0] and ph[2].
+ vnout << "Computing poly-hull of ph[0] and ph[2]:" << endl;
+ if (enhanced) {
+ ph[0].minimized_generators();
+ ph[2].minimized_generators();
+
+ // Print dimensions of arguments.
+ vnout << "After the computation of smf for generators" << endl;
+ }
+
+ // Print dimensions of arguments
+ // (being careful to override library laziness).
+ vnout << "=== ph[0] generators ===" << endl;
+ ph[0].generators().ascii_dump(vnout);
+ vnout << "=== ph[2] generators ===" << endl;
+ ph[2].generators().ascii_dump(vnout);
+ vnout << endl;
+
+ ph[0].poly_hull_assign(ph[2]);
+ ph[0].constraints();
+
+ nout << "Wmf final result timing: ";
+ print_clock(nout);
+ nout << endl;
+
+ // How many constraints and generators obtained?
+ vnout << "Final result (wmf)" << endl;
+ vnout << "=== ph[0] constraints ===" << endl;
+ ph[0].constraints().ascii_dump(vnout);
+ vnout << endl;
+
+ nout << "Smf (cons) final result timing: ";
+ start_clock();
+ ph[0].minimized_constraints();
+ print_clock(nout);
+ nout << endl;
+
+ // How many constraints and generators obtained?
+ vnout << "Final result (smf cons)" << endl;
+ vnout << "=== ph[0] constraints ===" << endl;
+ ph[0].constraints().ascii_dump(vnout);
+}
+
+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
+
+ for (dimension_type dims = first_dim; dims <= last_dim; dims++)
+ for (int perc = 25; perc <= 50; perc += 25) {
+
+ nout << endl
+ << "++++++++ DIM = " << dims << " ++++++++"
+ << endl
+ << "++++++++ PERC = " << perc << " ++++++++"
+ << endl;
+
+ // Standard evaluation strategy.
+ ph.clear();
+ build_polyhedra(dims, perc, ph);
+ computation(ph, false);
+
+ // Enhanced evaluation strategy.
+ ph.clear();
+ build_polyhedra(dims, perc, ph);
+ computation(ph, true);
+ }
+ // FIXME: check the cardinalities of the results obtained.
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F64(test01);
+END_MAIN
diff --git a/tests/Polyhedron/empty1.cc b/tests/Polyhedron/empty1.cc
new file mode 100644
index 0000000..9491ab5
--- /dev/null
+++ b/tests/Polyhedron/empty1.cc
@@ -0,0 +1,50 @@
+/* Different ways of creating an empty polyhedron.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..66fca88
--- /dev/null
+++ b/tests/Polyhedron/equals1.cc
@@ -0,0 +1,61 @@
+/* Test operator==(const Polyhedron&, const Polyhedron&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..4544c64
--- /dev/null
+++ b/tests/Polyhedron/exceptions1.cc
@@ -0,0 +1,1375 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using std::invalid_argument;
+
+namespace {
+
+void
+error1() {
+ 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));
+
+ // It is an error if the exception is not thrown.
+ exit(1);
+ }
+
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error2() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error3() {
+ 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::poly_hull_assign(p): it is illegal to use
+ // it with two polyhedra of different dimensions.
+ ph1.poly_hull_assign_and_minimize(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error4() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error5() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error6() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error7() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error8() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error9() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error10() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error11() {
+ 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 function
+ // C_Polyhedron::intersection_assign_and_minimize(ph2): it is illegal
+ // to apply this function to two polyhedra of different dimensions.
+ ph1.intersection_assign_and_minimize(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error12() {
+ 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 polyhedron of different dimensions.
+ ph1.intersection_assign(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error13() {
+ Variable w(4);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_generators_and_minimize(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_and_minimize(gs);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error14() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error15() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(1);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_constraints_and_minimize(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_and_minimize(cs);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error16() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error17() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error18() {
+ 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::poly_hull_assign(ph2): it is illegal to apply
+ // this function to two polyhedra with different dimensions.
+ ph1.poly_hull_assign(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error19() {
+ 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));
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error20() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error21() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error22() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error23() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error24() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error25() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error26() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error27() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error28() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error29() {
+ Variable x(0);
+ Variable y(1);
+
+ C_Polyhedron ph(2, EMPTY);
+
+ try {
+ // This is an invalid use of the function
+ // C_Polyhedron::add_generators_and_minimize(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_and_minimize(gs);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error30() {
+
+ C_Polyhedron ph1(3);
+ C_Polyhedron ph2(5);
+
+ try {
+ // This is an incorrect use of function
+ // C_Polyhedron::poly_difference_assign(ph2): it is impossible to apply
+ // this function to two polyhedra of different dimensions.
+ ph1.poly_difference_assign(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error31() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error32() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error33() {
+ 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));
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error34() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error35() {
+ 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_and_minimize(gs)': it is illegal to
+ // add a system of generators that does not contain points
+ // to an empty polyhedron.
+ ph.add_generators_and_minimize(gs);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error36() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error37() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error38() {
+ 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_THAN_OR_EQUAL, B + 2, d);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error39() {
+ 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_THAN_OR_EQUAL, B);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error40() {
+ 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_THAN_OR_EQUAL, A + 1);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error41() {
+ 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_THAN_OR_EQUAL, B + C);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error42() {
+ 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_THAN_OR_EQUAL, A + 1);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error43() {
+ 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));
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error44() {
+ 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));
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error45() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error46() {
+ 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();
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error47() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error48() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error49() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error50() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error51() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error52() {
+ Variable A(0);
+
+ C_Polyhedron ph(1);
+ ph.add_constraint(A >= 1);
+
+ Polyhedra_Powerset<C_Polyhedron> ps(2, EMPTY);
+
+ try {
+ // This is an incorrect use of function
+ // Polyhedra_Powerset::add_disjunct(ph): the powerset and
+ // the added disjunct should have the same space dimension.
+ ps.add_disjunct(ph);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ error1();
+ error2();
+ error3();
+ error4();
+ error5();
+ error6();
+ error7();
+ error8();
+ error9();
+ error10();
+ error11();
+ error12();
+ error13();
+ error14();
+ error15();
+ error16();
+ error17();
+ error18();
+ error19();
+ error20();
+ error21();
+ error22();
+ error23();
+ error24();
+ error25();
+ error26();
+ error27();
+ error28();
+ error29();
+ error30();
+ error31();
+ error32();
+ error33();
+ error34();
+ error35();
+ error36();
+ error37();
+ error38();
+ error39();
+ error40();
+ error41();
+ error42();
+ error43();
+ error44();
+ error45();
+ error46();
+ error47();
+ error48();
+ error49();
+ error50();
+ error51();
+ error52();
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/exceptions2.cc b/tests/Polyhedron/exceptions2.cc
new file mode 100644
index 0000000..400d1ee
--- /dev/null
+++ b/tests/Polyhedron/exceptions2.cc
@@ -0,0 +1,1098 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using std::invalid_argument;
+using std::domain_error;
+
+namespace {
+
+void
+error1() {
+ 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);
+
+ // It is an error if the exception is not thrown.
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error2() {
+ 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 (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error3() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error4() {
+ 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)));
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error5() {
+ 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_and_minimize(cs): it is illegal to add a system of
+ // constraints that contains strict-inequalities to a closed polyhedron.
+ ph.add_constraints_and_minimize(cs);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error6() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error7() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error8() {
+ 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_and_minimize(gs): it is illegal to add a
+ // system of generators that contains closure-points to a closed
+ // polyhedron.
+ ph.add_generators_and_minimize(gs);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error9() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error10() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error11() {
+ 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_and_minimize': it is illegal to apply
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph1.intersection_assign_and_minimize(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error12() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error13() {
+ Variable A(0);
+ Variable B(1);
+
+ Generator_System gs1;
+ gs1.insert(point());
+ gs1.insert(point(3*A));
+ C_Polyhedron ph1(gs1);
+
+ Generator_System gs2;
+ gs2.insert(point(B));
+ gs2.insert(closure_point());
+ gs2.insert(closure_point(3*B));
+ NNC_Polyhedron ph2(gs2);
+
+ print_generators(ph1, "*** ph1 ***");
+ print_generators(ph2, "*** ph2 ***");
+
+ try {
+ // This is an invalid use of the function
+ // `poly_hull_assign_and_minimize': it is illegal to apply
+ // this function to a closed polyhedron and a
+ // non-closed polyhedron.
+ ph1.poly_hull_assign_and_minimize(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error14() {
+ 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
+ // `poly_hull_assign': it is illegal to apply this function
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph1.poly_hull_assign(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error15() {
+ 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
+ // `poly_difference_assign': it is illegal to apply this function
+ // to a closed polyhedron and a non-closed polyhedron.
+ ph1.poly_difference_assign(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error16() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error17() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error18() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error19() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error20() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error21() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error22() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error23() {
+ 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());
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error24() {
+ 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_and_minimize(gs)': it is illegal to
+ // add a system of generators that does not contain points
+ // to an empty zero-dimensional polyhedron.
+ ph.add_generators_and_minimize(gs);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error25() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error26() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error27() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error28() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error29() {
+ 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));
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error30() {
+ 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.
+ ph1.swap(ph2);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error31() {
+ 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);
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error32() {
+ Variable A(0);
+ LP_Problem lp;
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(A > -6);
+
+ try {
+ // This tries to build an invalid LP_Problem object: the feasible
+ // region can not be defined using strict inequalities.
+ lp.add_constraints(cs);
+
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error33() {
+ Variable A(0);
+ LP_Problem lp;
+
+ try {
+ // This tries to build an invalid LP_Problem object: the space dimension
+ // of the objective function can not be greater than the space dimension
+ // of the feasible region.
+ lp.set_objective_function(A);
+
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error34() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ cs.insert(A <= 0);
+ LP_Problem lp(cs, A, MAXIMIZATION);
+
+ try {
+ // We cannot extract a feasible point from an unsatisfiable LP_Problem.
+ Generator fp = lp.feasible_point();
+
+ exit(1);
+ }
+ catch (domain_error& e) {
+ nout << "domain_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error35() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ LP_Problem lp(cs, A, MAXIMIZATION);
+
+ try {
+ // We cannot extract an optimizing point from an unbounded LP_Problem.
+ Generator fp = lp.optimizing_point();
+
+ exit(1);
+ }
+ catch (domain_error& e) {
+ nout << "domain_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error36() {
+ Variable A(0);
+ Variable B(1);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ LP_Problem lp(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.
+ lp.evaluate_objective_function(p, num, den);
+
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+void
+error37() {
+ Variable A(0);
+ Constraint_System cs;
+ cs.insert(A >= 6);
+ LP_Problem lp(cs, A, MAXIMIZATION);
+ Generator r = ray(A);
+ Coefficient num;
+ Coefficient den;
+
+ try {
+ // This tries to evaluate the objective function on a ray.
+ lp.evaluate_objective_function(r, num, den);
+
+ exit(1);
+ }
+ catch (invalid_argument& e) {
+ nout << "invalid_argument: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ exit(1);
+ }
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ error1();
+ error2();
+ error3();
+ error4();
+ error5();
+ error6();
+ error7();
+ error8();
+ error9();
+ error10();
+ error11();
+ error12();
+ error13();
+ error14();
+ error15();
+ error16();
+ error17();
+ error18();
+ error19();
+ error20();
+ error21();
+ error22();
+ error23();
+ error24();
+ error25();
+ error26();
+ error27();
+ error28();
+ error29();
+ error30();
+ error31();
+ error32();
+ error33();
+ error34();
+ error35();
+ error36();
+ error37();
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/exceptions3.cc b/tests/Polyhedron/exceptions3.cc
new file mode 100644
index 0000000..b25df41
--- /dev/null
+++ b/tests/Polyhedron/exceptions3.cc
@@ -0,0 +1,242 @@
+/* Test that the right exceptions are thrown in case of incorrect uses.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using std::length_error;
+
+namespace {
+
+void
+error1() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error2() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error3() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error4() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error5() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error6() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error7() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error8() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+void
+error9() {
+ 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.
+ exit(1);
+ }
+ catch (length_error& e) {
+ nout << "length_error: " << e.what() << endl << endl;
+ }
+ catch (...) {
+ // It is an error if the wrong exception is thrown.
+ exit(1);
+ }
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ error1();
+ error2();
+ error3();
+ error4();
+ error5();
+ error6();
+ error7();
+ error8();
+ error9();
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/expandspacedim1.cc b/tests/Polyhedron/expandspacedim1.cc
new file mode 100644
index 0000000..db0e3e5
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim1.cc
@@ -0,0 +1,268 @@
+/* Test Polyhedron::expand_space_dimension().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..3834b9a
--- /dev/null
+++ b/tests/Polyhedron/expandspacedim2.cc
@@ -0,0 +1,102 @@
+/* Test Polyhedron::expand_space_dimension().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..33fb5fd
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims1.cc
@@ -0,0 +1,336 @@
+/* Test Polyhedron::fold_space_dimensions().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..3083d0d
--- /dev/null
+++ b/tests/Polyhedron/foldspacedims2.cc
@@ -0,0 +1,230 @@
+/* Test Polyhedron::fold_space_dimensions() for non-closed polyhedra.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_F8A(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+END_MAIN
diff --git a/tests/Polyhedron/generalizedaffineimage1.cc b/tests/Polyhedron/generalizedaffineimage1.cc
new file mode 100644
index 0000000..fc8250a
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage1.cc
@@ -0,0 +1,268 @@
+/* Test Polyhedron::generalized_affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_OR_EQUAL, 2*A - B + 2);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph,
+ "*** After ph.generalized_affine_image"
+ "(A + B, GREATER_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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..b834409
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffineimage2.cc
@@ -0,0 +1,559 @@
+/* Test Polyhedron::generalized_affine_image().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_THAN_OR_EQUAL, A+2);
+ ph2.generalized_affine_image(-2*B, LESS_THAN_OR_EQUAL, -2*(A+2));
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph, "--- ph after "
+ "ph.generalized_affine_image(B, GREATER_THAN_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_THAN_OR_EQUAL, A+2, -2);
+ ph2.generalized_affine_image(-2*B, LESS_THAN_OR_EQUAL, A+2);
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph, "--- ph after "
+ "ph.generalized_affine_image(B, GREATER_THAN_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_THAN_OR_EQUAL, A-B+2, -3);
+ ph2.generalized_affine_image(-3*B, GREATER_THAN_OR_EQUAL, A-B+2);
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph, "--- ph after "
+ "ph.generalized_affine_image(B, LESS_THAN_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_THAN_OR_EQUAL, 2*A - B + 2);
+ ph2.generalized_affine_image(-3*(A + B),
+ LESS_THAN_OR_EQUAL,
+ -3*(2*A - B + 2));
+
+ bool ok = (ph == ph2);
+
+ print_generators(ph,
+ "*** After ph.generalized_affine_image"
+ "(A + B, GREATER_THAN_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, PPLGT, 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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_OR_EQUAL, B + 3) ***");
+ print_generators(ph, "*** After ph.generalized_affine_image"
+ "(A - C, GREATER_THAN_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_THAN_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_THAN_OR_EQUAL, B - 1) ***");
+ print_constraints(ph, "*** After ph.generalized_affine_image"
+ "(A - C, LESS_THAN_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..cf45fe8
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage1.cc
@@ -0,0 +1,123 @@
+/* Test Polyhedron::generalized_affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_THAN_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_THAN_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_THAN_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_THAN_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_THAN_OR_EQUAL, A-B+2, -3);
+
+ bool ok = (ph == known_result);
+
+ print_generators(ph, "--- ph after "
+ "ph.generalized_affine_preimage"
+ "(B, LESS_THAN_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..a689517
--- /dev/null
+++ b/tests/Polyhedron/generalizedaffinepreimage2.cc
@@ -0,0 +1,63 @@
+/* Test Polyhedron::generalized_affine_preimage().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..2387c7c
--- /dev/null
+++ b/tests/Polyhedron/generators1.cc
@@ -0,0 +1,234 @@
+/* Test the construction of a polyhedron using generators.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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..e828ca2
--- /dev/null
+++ b/tests/Polyhedron/geomcovers1.cc
@@ -0,0 +1,60 @@
+/* Test Polyhedra_Powerset<PH>::geometrically_covers().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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);
+
+ Polyhedra_Powerset<C_Polyhedron> ps12(1, EMPTY);
+ ps12.add_disjunct(ph1);
+ ps12.add_disjunct(ph2);
+
+ Polyhedra_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..295afd0
--- /dev/null
+++ b/tests/Polyhedron/h79widening1.cc
@@ -0,0 +1,254 @@
+/* Test Polyhedron::H79_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+aux_test01(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.H79_widening_assign(ph2);
+
+ print_generators(ph1, "*** After H79_widening_assign ***");
+
+ return ph1 == known_result;
+}
+
+bool
+test01() {
+ 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_test01(ph1_1, ph2_1, ph1_1)
+ && aux_test01(ph2_3, ph2_4, ph2_3);
+
+ // FIXME: this must be reactivated (in some form) when we will
+ // have a decent error policy for H79_widening_assign().
+#if 0
+ if (!try_H79_widening_assign(ph2_2, ph1_2, ph1_2))
+ return false;
+#endif
+
+ 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..856b162
--- /dev/null
+++ b/tests/Polyhedron/h79widening2.cc
@@ -0,0 +1,63 @@
+/* Test Polyhedron::H79_widening_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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/intersection1.cc b/tests/Polyhedron/intersection1.cc
new file mode 100644
index 0000000..cd773a6
--- /dev/null
+++ b/tests/Polyhedron/intersection1.cc
@@ -0,0 +1,516 @@
+/* Testing Polyhedron::intersection_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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 ***");
+
+ 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_and_minimize(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_and_minimize(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_and_minimize(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_and_minimize ***");
+ 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_and_minimize(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_and_minimize ***");
+
+ 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_and_minimize(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_and_minimize(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** After ph1.intersection_assign_and_minimize(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_and_minimize(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1,
+ "*** After ph1.intersection_assign_and_minimize(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_and_minimize(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_constraints(ph1, "*** After intersection_assign ***");
+ print_constraints(copy_ph1,
+ "*** After intersection_assign_and_minimize ***");
+
+ 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_and_minimize(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_constraints(ph1, "*** After intersection_assign ***");
+ print_constraints(copy_ph1,
+ "*** After intersection_assign_and_minimize ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F8A(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..061e86c
--- /dev/null
+++ b/tests/Polyhedron/limitedbhrz03extrapolation1.cc
@@ -0,0 +1,66 @@
+/* Test Polyhedron::limited_BHRZ03_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+int
+main() TRY {
+ set_handlers();
+
+ 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);
+
+ int retval = (ph2 == known_result) ? 0 : 1;
+
+ print_constraints(ph2, "*** After ph2.limited_BHRZ03_widening(ph1, cs)***");
+
+ return retval;
+}
+CATCH
diff --git a/tests/Polyhedron/limitedh79extrapolation1.cc b/tests/Polyhedron/limitedh79extrapolation1.cc
new file mode 100644
index 0000000..deddc79
--- /dev/null
+++ b/tests/Polyhedron/limitedh79extrapolation1.cc
@@ -0,0 +1,273 @@
+/* Test Polyhedron::limited_H79_extrapolation_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/linearpartition1.cc b/tests/Polyhedron/linearpartition1.cc
new file mode 100644
index 0000000..4a9361a
--- /dev/null
+++ b/tests/Polyhedron/linearpartition1.cc
@@ -0,0 +1,298 @@
+/* Test linear_partition().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+aux_test01(const C_Polyhedron& p,
+ const C_Polyhedron& q,
+ const std::pair<C_Polyhedron,
+ Powerset<Determinate<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 Powerset<Determinate<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 Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+ const NNC_Polyhedron& a = i->element();
+ // 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->element();
+ // All elements of `s' must be pairwise disjoint.
+ if (!a.is_disjoint_from(b))
+ return false;
+ }
+ the_union.poly_hull_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, Powerset<Determinate<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,
+ Powerset<Determinate<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 Powerset<Determinate<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 Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+ const NNC_Polyhedron& a = i->element();
+ // 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->element();
+ // All elements of `s' must be pairwise disjoint.
+ if (!a.is_disjoint_from(b))
+ return false;
+ }
+ the_union.poly_hull_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, Powerset<Determinate<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,
+ Powerset<Determinate<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 Powerset<Determinate<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 Powerset<Determinate<NNC_Polyhedron> >::const_iterator iter;
+ for (iter i = s.begin(), s_end = s.end(); i != s_end; ++i) {
+ const NNC_Polyhedron& a = i->element();
+ // 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->element();
+ // All elements of `s' must be pairwise disjoint.
+ if (!a.is_disjoint_from(b))
+ return false;
+ }
+ the_union.poly_hull_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, Powerset<Determinate<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>
+Polyhedra_Powerset<NNC_Polyhedron>
+aux_test04(const PH& ph) {
+ std::pair<PH, Polyhedra_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;
+
+ Polyhedra_Powerset<NNC_Polyhedron> p_c = aux_test04(p);
+
+ nout << "complement(p) = " << p_c << 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;
+
+ Polyhedra_Powerset<NNC_Polyhedron> q_c = aux_test04(q);
+
+ nout << "complement(q) = " << q_c << endl;
+
+ // FIXME
+
+ 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..5172e6c
--- /dev/null
+++ b/tests/Polyhedron/linearsystem1.cc
@@ -0,0 +1,105 @@
+/* Test some functionality of class Linear_System.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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 ls1(NOT_NECESSARILY_CLOSED);
+ TEMP_INTEGER(tem);
+ for (dimension_type rowi = 0; rowi < ROWS; ++rowi) {
+ Linear_Row row(COLS,
+ Linear_Row::Flags(NOT_NECESSARILY_CLOSED,
+ Linear_Row::RAY_OR_POINT_OR_INEQUALITY));
+ for (dimension_type col = 0; col < COLS; ++col) {
+ rng.get(row[col], 0);
+ // The following workaround is to avoid trivial positive overflows
+ // when using bounded coefficients.
+ if (std::numeric_limits<Coefficient>::is_bounded
+ && row[col] == std::numeric_limits<Coefficient>::min())
+ // Here the randomly generated coefficients is equal to the
+ // allowed minimum value for a signed integer datatype 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.
+ ++row[col];
+ }
+
+ row.strong_normalize();
+ ls1.insert(row);
+
+ 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 ls2(NECESSARILY_CLOSED);
+ ls2.ascii_load(f);
+ close(f);
+
+ if (ls1 == ls2)
+ continue;
+
+ nout << "Linear_System::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/linexpression1.cc b/tests/Polyhedron/linexpression1.cc
new file mode 100644
index 0000000..a340f05
--- /dev/null
+++ b/tests/Polyhedron/linexpression1.cc
@@ -0,0 +1,56 @@
+/* Testing Linear_Expression.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+// 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;
+
+ C_Polyhedron ph(2);
+ ph.add_constraint(e1 >= 0);
+
+ C_Polyhedron known_result(2);
+ known_result.add_constraint(A - B >= 0);
+
+ bool ok = (ph == known_result);
+
+ print_constraints(ph, "*** ph ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/lpproblem1.cc b/tests/Polyhedron/lpproblem1.cc
new file mode 100644
index 0000000..631a0ce
--- /dev/null
+++ b/tests/Polyhedron/lpproblem1.cc
@@ -0,0 +1,764 @@
+/* Test the LP_Problem class.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ // Variable declaration.
+ 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);
+
+ LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
+
+ if (lp.solve() != OPTIMIZED_LP_PROBLEM)
+ return false;
+
+ // Computed numerator and denominator.
+ Coefficient num;
+ Coefficient den;
+ lp.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 = lp.optimizing_point();
+ nout << "Optimizing point = ";
+ print_generator(pg);
+ Generator pg_kr = point(300*X06 + 300*X15
+ + Coefficient("716072340751908900")*X16
+ + Coefficient("4773815605012726")*X21
+ + Coefficient("105023943310279972")*X39,
+ Coefficient("2386907802506363"));
+ if (pg != pg_kr)
+ return false;
+
+ // Making lp unfeasible.
+ Constraint_System further_cs;
+ further_cs.insert(X05 >= 5);
+ further_cs.insert(X05 <= 3);
+ lp.add_constraints(further_cs);
+
+ return !lp.is_satisfiable();
+}
+
+bool
+test02() {
+ // Variable definition.
+ 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);
+
+ LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
+
+ Generator pg = lp.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;
+ lp.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;
+
+ // Reoptimizing using another objective function.
+ Linear_Expression new_cost = -51*A + 632*B;
+ lp.set_objective_function(new_cost);
+ pg = lp.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;
+
+ lp.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;
+
+ // Reoptimizing after changing optimization mode.
+ lp.set_optimization_mode(MINIMIZATION);
+ pg = lp.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;
+
+ lp.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 declaration.
+ 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);
+
+ LP_Problem lp = LP_Problem(cs, cost, MAXIMIZATION);
+
+ Generator pg = lp.optimizing_point();
+ nout << "Optimizing point obtained by simplex:\n";
+ print_generator(pg);
+
+ Coefficient num;
+ Coefficient den;
+ lp.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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST_F64(test01);
+ DO_TEST_F64(test02);
+ DO_TEST_F64(test03);
+END_MAIN
diff --git a/tests/Polyhedron/mapspacedims1.cc b/tests/Polyhedron/mapspacedims1.cc
new file mode 100644
index 0000000..66cea1b
--- /dev/null
+++ b/tests/Polyhedron/mapspacedims1.cc
@@ -0,0 +1,443 @@
+/* Test Polyhedron::map_space_dimensions().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+} // 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);
+END_MAIN
diff --git a/tests/Polyhedron/matrix1.cc b/tests/Polyhedron/matrix1.cc
new file mode 100644
index 0000000..a1a8b3c
--- /dev/null
+++ b/tests/Polyhedron/matrix1.cc
@@ -0,0 +1,80 @@
+/* Test some functionality of class Matrix.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+namespace {
+
+const char* data_file = "matrix1.dat";
+
+void
+ascii_dump_load() {
+ Variable A(0);
+ Variable B(1);
+ Random_Number_Generator r;
+
+ for (dimension_type num_rows = 0; num_rows <= 3; ++num_rows)
+ for (dimension_type num_cols = 0; num_cols <= 3; ++num_cols) {
+ Matrix 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);
+
+ fstream f;
+ open(f, data_file, ios_base::out);
+ m1.ascii_dump(f);
+ close(f);
+
+ open(f, data_file, ios_base::in);
+ Matrix m2;
+ m2.ascii_load(f);
+ close(f);
+
+ if (m1 != m2) {
+
+ nout << "Matrix::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);
+
+ exit(1);
+ }
+ }
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ ascii_dump_load();
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/max_min1.cc b/tests/Polyhedron/max_min1.cc
new file mode 100644
index 0000000..b87c1f8
--- /dev/null
+++ b/tests/Polyhedron/max_min1.cc
@@ -0,0 +1,138 @@
+/* Test Polyhedron::maximize(const Linear_Expression&, ...)
+ and Polyhedron::minimize(const Linear_Expression&, ...).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST_F8(test02);
+END_MAIN
diff --git a/tests/Polyhedron/maxspacedim1.cc b/tests/Polyhedron/maxspacedim1.cc
new file mode 100644
index 0000000..2fea90a
--- /dev/null
+++ b/tests/Polyhedron/maxspacedim1.cc
@@ -0,0 +1,62 @@
+/* Test the *::max_space_dimension() methods.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+template <typename T>
+dimension_type foo() {
+ return T::max_space_dimension();
+}
+
+template dimension_type foo<Variable>();
+template dimension_type foo<Linear_Expression>();
+template dimension_type foo<Constraint>();
+template dimension_type foo<Generator>();
+template dimension_type foo<Constraint_System>();
+template dimension_type foo<Generator_System>();
+template dimension_type foo<C_Polyhedron>();
+template dimension_type foo<NNC_Polyhedron>();
+template dimension_type foo<Polyhedra_Powerset<C_Polyhedron> >();
+template dimension_type foo<Polyhedra_Powerset<NNC_Polyhedron> >();
+
+#define PRINT(T) \
+nout << #T "::max_space_dimension() = " << T::max_space_dimension() << endl
+
+int
+main() TRY {
+ set_handlers();
+
+ PRINT(Variable);
+ PRINT(Linear_Expression);
+ PRINT(Constraint);
+ PRINT(Generator);
+ PRINT(Constraint_System);
+ PRINT(Generator_System);
+ PRINT(C_Polyhedron);
+ PRINT(NNC_Polyhedron);
+ PRINT(Polyhedra_Powerset<C_Polyhedron>);
+ PRINT(Polyhedra_Powerset<NNC_Polyhedron>);
+
+ // FIXME.
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/mc91.cc b/tests/Polyhedron/mc91.cc
new file mode 100644
index 0000000..d02df7b
--- /dev/null
+++ b/tests/Polyhedron/mc91.cc
@@ -0,0 +1,117 @@
+/* Test the Polyhedra_Powerset construction with McCarthy's 91 function.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ typedef Polyhedra_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;
+ Polyhedra_Powerset<C_Polyhedron> b1(2);
+ b1.concatenate_assign(previous);
+ b1.add_space_dimensions_and_embed(2);
+ current.intersection_assign(b1);
+ Polyhedra_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);
+ Polyhedra_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..2952e5b
--- /dev/null
+++ b/tests/Polyhedron/membytes1.cc
@@ -0,0 +1,218 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+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
+
+int
+main() TRY {
+ set_handlers();
+
+ 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 0;
+}
+CATCH
diff --git a/tests/Polyhedron/membytes2.cc b/tests/Polyhedron/membytes2.cc
new file mode 100644
index 0000000..f729bdc
--- /dev/null
+++ b/tests/Polyhedron/membytes2.cc
@@ -0,0 +1,92 @@
+/* Test the total_memory_in_bytes() and external_memory_in_bytes() methods.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+int
+main() TRY {
+ set_handlers();
+
+ 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;
+
+ Polyhedra_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);
+ Polyhedra_Powerset<C_Polyhedron> pqh(qh);
+
+ Polyhedra_Powerset<C_Polyhedron> prh = pqh;
+ prh.poly_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 0;
+}
+CATCH
diff --git a/tests/Polyhedron/memory1.cc b/tests/Polyhedron/memory1.cc
new file mode 100644
index 0000000..f210872
--- /dev/null
+++ b/tests/Polyhedron/memory1.cc
@@ -0,0 +1,195 @@
+/* Test the allocation error recovery facility of the library.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <new>
+#include <cstring>
+#include <cerrno>
+
+#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
+
+// If GMP does not support exceptions the test is pointless.
+// Cygwin has an almost dummy definition of setrlimit().
+// For some reason, this test does not work on Alpha machines.
+#if !GMP_SUPPORTS_EXCEPTIONS \
+ || defined(__CYGWIN__) \
+ || defined(__alpha) \
+ || !(HAVE_DECL_RLIMIT_DATA || HAVE_DECL_RLIMIT_RSS \
+ || HAVE_DECL_RLIMIT_VMEM || HAVE_DECL_RLIMIT_AS)
+
+int
+main() TRY {
+ return 0;
+}
+CATCH
+
+#else // 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 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
+}
+
+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) {
+ return ::operator new(size);
+}
+
+extern "C" void*
+cxx_realloc(void* p, size_t old_size, size_t new_size) {
+ if (new_size <= old_size)
+ return p;
+ else {
+ void* new_p = ::operator new(new_size);
+ memcpy(new_p, p, old_size);
+ ::operator delete(p);
+ return new_p;
+ }
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+ ::operator delete(p);
+}
+
+#define INIT_MEMORY 3*1024*1024
+
+int
+main() TRY {
+ mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+
+ 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;
+
+ return 0;
+}
+CATCH
+
+#endif // GMP_SUPPORTS_EXCEPTIONS && !defined(__CYGWIN__) && ...
diff --git a/tests/Polyhedron/memory2.cc b/tests/Polyhedron/memory2.cc
new file mode 100644
index 0000000..a4d55e2
--- /dev/null
+++ b/tests/Polyhedron/memory2.cc
@@ -0,0 +1,222 @@
+/* Test the allocation error recovery facility of the library.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <new>
+#include <limits>
+
+// If GMP does not support exceptions the test is pointless.
+#if !GMP_SUPPORTS_EXCEPTIONS
+
+int
+main() TRY {
+ return 0;
+}
+CATCH
+
+#else // GMP_SUPPORTS_EXCEPTIONS
+
+namespace {
+
+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 = ::operator new(size);
+ vnout << "allocated " << size << " @ " << p << endl;
+ ++mallocated;
+ return p;
+}
+
+extern "C" void
+cxx_free(void* p, size_t) {
+ vnout << "freed " << p << endl;
+ ::operator delete(p);
+ ++freed;
+}
+
+extern "C" void*
+cxx_realloc(void* p, size_t old_size, size_t new_size) {
+ if (p == 0)
+ return cxx_malloc(new_size);
+
+ if (new_size == 0) {
+ cxx_free(p, old_size);
+ return 0;
+ }
+
+ if (new_size <= old_size) {
+ vnout << "reallocated " << old_size << " @ " << p
+ << " down to " << new_size << " @ " << p
+ << endl;
+ return p;
+ }
+ else {
+ if (reallocated >= realloc_threshold) {
+ nout << "std::bad_alloc thrown from cxx_realloc()" << endl;
+ throw std::bad_alloc();
+ }
+ void* new_p = ::operator new(new_size);
+ memcpy(new_p, p, old_size);
+ ::operator delete(p);
+ vnout << "reallocated " << old_size << " @ " << p
+ << " up to " << new_size << " @ " << new_p
+ << endl;
+ ++reallocated;
+ return new_p;
+ }
+}
+
+void
+test1() {
+ nout << "test1()" << endl;
+
+ reset_allocators(6, ULONG_MAX);
+ try {
+ Matrix* matrix = new Matrix(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&) { \
+}
+
+int
+main() TRY {
+ mp_set_memory_functions(cxx_malloc, cxx_realloc, cxx_free);
+
+ 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 // GMP_SUPPORTS_EXCEPTIONS
diff --git a/tests/Polyhedron/minconstraints1.cc b/tests/Polyhedron/minconstraints1.cc
new file mode 100644
index 0000000..22cac6f
--- /dev/null
+++ b/tests/Polyhedron/minconstraints1.cc
@@ -0,0 +1,77 @@
+/* Test Polyhedron::minimized_constraints().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..14c671a
--- /dev/null
+++ b/tests/Polyhedron/minconstraints2.cc
@@ -0,0 +1,70 @@
+/* Test Polyhedron::minimized_constraints().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..23e7fa7
--- /dev/null
+++ b/tests/Polyhedron/mingenerators1.cc
@@ -0,0 +1,85 @@
+/* Test Polyhedron::minimized_generators().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..df77663
--- /dev/null
+++ b/tests/Polyhedron/mingenerators2.cc
@@ -0,0 +1,48 @@
+/* Test Polyhedron::minimized_generators().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..7dd050f
--- /dev/null
+++ b/tests/Polyhedron/nncminimize1.cc
@@ -0,0 +1,378 @@
+/* Test minimization of NNC polyhedra.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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_and_minimize(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_and_minimize(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.poly_hull_assign_and_minimize(ph2);
+
+ 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..5b2f9de
--- /dev/null
+++ b/tests/Polyhedron/nncminimize2.cc
@@ -0,0 +1,80 @@
+/* Test NNC_Polyhedron::ph.minimized_generators().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/numberinput1.cc b/tests/Polyhedron/numberinput1.cc
new file mode 100644
index 0000000..e0d718f
--- /dev/null
+++ b/tests/Polyhedron/numberinput1.cc
@@ -0,0 +1,341 @@
+/* Test number input.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <string>
+#include <sstream>
+#include <cstdlib>
+
+namespace {
+
+using namespace Checked;
+
+struct Test_Extended_Number_Policy {
+ static const int check_overflow = 1;
+ static const int check_inf_add_inf = 0;
+ static const int check_inf_sub_inf = 0;
+ static const int check_inf_mul_zero = 0;
+ static const int check_div_zero = 0;
+ static const int check_inf_div_inf = 0;
+ static const int check_inf_mod = 0;
+ static const int check_sqrt_neg = 0;
+ static const int handle_nan = 1;
+ static const int handle_infinity = 1;
+ static const int fpu_check_inexact = 0;
+ static const int check_nan_args = 1;
+ 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 == VC_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);
+ 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)
+ && aux_test("InF", "+inf", "", V_EQ)
+ && aux_test("+inF", "+inf", "", V_EQ)
+ && aux_test("-InF", "-inf", "", V_EQ)
+ && aux_test("-InFinity", "-inf", "inity", V_EQ)
+ && aux_test("Inf7", "+inf", "7", V_EQ)
+ && aux_test("nan", "nan", "", VC_NAN)
+ && aux_test("NAN", "nan", "", VC_NAN)
+ && aux_test("Nan", "nan", "", VC_NAN);
+}
+
+// Testing symbols with trailing input and errors.
+bool
+test02() {
+ return aux_test("nAn+", "nan", "+", VC_NAN)
+ && aux_test("naN/", "nan", "/", VC_NAN)
+ && aux_test("nAN/0", "nan", "/0", VC_NAN)
+ && aux_test("nAN/-3", "nan", "/-3", VC_NAN)
+ && aux_test("inF/3", "+inf", "/3", V_EQ)
+ && aux_test("Inf/-3", "+inf", "/-3", V_EQ)
+ && aux_test("-inf/-3", "-inf", "/-3", V_EQ)
+ && 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(".333", "nan", ".333", V_CVT_STR_UNK);
+}
+
+// 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.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", "", VC_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(test03);
+ 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..a16680b
--- /dev/null
+++ b/tests/Polyhedron/onepoint.cc
@@ -0,0 +1,56 @@
+/* Creation of a one-point polyhedron.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..c593207
--- /dev/null
+++ b/tests/Polyhedron/permute.cc
@@ -0,0 +1,221 @@
+/* An example of iteration to a post-fixpoint.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_hull_assign_and_minimize(previous);
+
+ print_constraints(current, "*** after poly_hull_assign_and_minimize***");
+
+ 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..86034ac
--- /dev/null
+++ b/tests/Polyhedron/polydifference1.cc
@@ -0,0 +1,276 @@
+/* Test Polyhedron::poly_difference_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_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.poly_difference_assign(ph3);
+
+ bool ok = (computed_result == known_result);
+
+ print_generators(computed_result, "*** After poly_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.poly_difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** After ph1.poly_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.poly_difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** After ph1.poly_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.poly_difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1,
+ "**After ph1.poly_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.poly_difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** After ph1.poly_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.poly_difference_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** After ph1.poly_difference_assign(ph2) ***");
+
+ return ok;
+}
+
+// Creating a rectangle.
+C_Polyhedron
+aux_test07(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;
+}
+
+bool
+test07() {
+ Polyhedra_Powerset<C_Polyhedron> cross(2, EMPTY);
+ cross.add_disjunct(aux_test07(0, 3, 9, 3));
+ cross.add_disjunct(aux_test07(3, 0, 3, 9));
+
+ using namespace IO_Operators;
+ nout << "cross = " << cross << endl;
+
+ Polyhedra_Powerset<C_Polyhedron> squares(2, EMPTY);
+ squares.add_disjunct(aux_test07(1, 4, 1, 1));
+ squares.add_disjunct(aux_test07(4, 4, 1, 1));
+ squares.add_disjunct(aux_test07(7, 4, 1, 1));
+ squares.add_disjunct(aux_test07(4, 1, 1, 1));
+ squares.add_disjunct(aux_test07(4, 7, 1, 1));
+
+ nout << "squares = " << squares << endl;
+
+ Polyhedra_Powerset<C_Polyhedron> difference = cross;
+ difference.poly_difference_assign(squares);
+
+ nout << "cross - squares = " << difference << endl;
+
+ Polyhedra_Powerset<C_Polyhedron> intersection = difference;
+ intersection.meet_assign(squares);
+
+ nout << "(cross - squares) inters squares = " << intersection << endl;
+
+ // When using Polyhedra_Powerset<NNC_Polyhedron>, intersection will be
+ // empty. When using Polyhedra_Powerset<C_Polyhedron>,
+ // intersection will consist of objects of affine dimension at most 1.
+ bool ok1 = true;
+ for (Polyhedra_Powerset<C_Polyhedron>::const_iterator
+ i = intersection.begin(), in_end = intersection.end();
+ i != in_end; ++i)
+ if (i->element().affine_dimension() > 1) {
+ nout << "intersection contains " << i->element() << "," << endl
+ << "which is of affine dimension greater than 1" << endl;
+ ok1 = false;
+ }
+
+ Polyhedra_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);
+ DO_TEST(test04);
+ DO_TEST(test05);
+ DO_TEST(test06);
+ DO_TEST_F8(test07);
+END_MAIN
diff --git a/tests/Polyhedron/polydifference2.cc b/tests/Polyhedron/polydifference2.cc
new file mode 100644
index 0000000..98979bd
--- /dev/null
+++ b/tests/Polyhedron/polydifference2.cc
@@ -0,0 +1,150 @@
+/* Test Polyhedron::poly_difference_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_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 poly_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.poly_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.poly_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.poly_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 poly_difference_assign ***");
+ print_constraints(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/polyhull1.cc b/tests/Polyhedron/polyhull1.cc
new file mode 100644
index 0000000..9576c94
--- /dev/null
+++ b/tests/Polyhedron/polyhull1.cc
@@ -0,0 +1,404 @@
+/* Test Polyhedron::poly_hull_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_hull_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.poly_hull_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.poly_hull_assign_and_minimize(ph2);
+
+ C_Polyhedron computed_result2(ph1);
+ computed_result2.poly_hull_assign(ph2);
+
+ C_Polyhedron known_result(ph2);
+
+ bool ok = (computed_result1 == known_result
+ && computed_result2 == known_result);
+
+ print_generators(computed_result1,
+ "*** After poly_hull_assign_and_minimize ***");
+ print_generators(computed_result2, "*** After poly_hull_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.poly_hull_assign(ph2);
+
+ print_generators(ph1, "*** After poly_hull_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.poly_hull_assign_and_minimize(ph2);
+
+ print_generators(ph1, "*** After poly_hull_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.poly_hull_assign_and_minimize(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1,
+ "*** After ph1.poly_hull_assign_and_minimize(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.poly_hull_assign_and_minimize(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_generators(ph1,
+ "*** After ph1.poly_hull_assign_and_minimize(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.poly_hull_assign_and_minimize(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.poly_hull_assugn_and_minimize(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.poly_hull_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** After ph1.poly_hull_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.poly_hull_assign(ph2);
+
+ bool ok = (ph1 == known_result);
+
+ print_constraints(ph1, "*** After ph1.poly_hull_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.poly_hull_assign(ph2);
+ copy_ph1.poly_hull_assign(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_generators(ph1, "*** After poly_hull_assign ***");
+ print_generators(copy_ph1,
+ "*** After poly_hull_assign_and_minimize ***");
+
+ 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.poly_hull_assign(ph2);
+ copy_ph1.poly_hull_assign(copy_ph2);
+
+ bool ok = (ph1 == copy_ph1);
+
+ print_generators(ph1, "*** After poly_hull_assign ***");
+ print_generators(copy_ph1,
+ "*** After poly_hull_assign_and_minimize ***");
+
+ 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.poly_hull_assign_and_minimize(q);
+
+ bool ok = (p == q);
+
+ print_constraints(p, "*** p.poly_hull_assign_and_minimize(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..9010abe
--- /dev/null
+++ b/tests/Polyhedron/polyhull2.cc
@@ -0,0 +1,58 @@
+/* Test Polyhedron::poly_hull_assign_and_minimize().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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.poly_hull_assign_and_minimize(p2);
+
+ bool ok = p1.is_empty();
+
+ print_constraints(p1, "*** p1.poly_hull_assign_and_minimize(p2) ***");
+
+ return ok;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/polypowerset1.cc b/tests/Polyhedron/polypowerset1.cc
new file mode 100644
index 0000000..6f4ca8a
--- /dev/null
+++ b/tests/Polyhedron/polypowerset1.cc
@@ -0,0 +1,382 @@
+/* Test Polyhedra_Powerset<PH>.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+bool
+test01() {
+ Constraint_System cs = Constraint_System::zero_dim_empty();
+ Polyhedra_Powerset<C_Polyhedron> ps(cs);
+ return ps.OK();
+}
+
+bool
+test02() {
+ Variable x(0);
+ Constraint_System cs;
+ Polyhedra_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));
+
+ Polyhedra_Powerset<C_Polyhedron> c_ps(nnc_ps);
+
+ return c_ps.OK();
+}
+
+bool
+test03() {
+ Variable x(0);
+ Constraint_System cs;
+ Polyhedra_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);
+
+ Polyhedra_Powerset<NNC_Polyhedron> nnc_ps(c_ps);
+
+ return nnc_ps.OK();
+}
+
+bool
+test04() {
+ Variable x(0);
+ Polyhedra_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();
+}
+
+bool
+test05() {
+ Polyhedra_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;
+}
+
+bool
+test06() {
+ Variable x(0);
+ Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ Constraint_System cs;
+ cs.insert(x >= 0);
+ c_ps.add_disjunct(C_Polyhedron(cs));
+
+ Polyhedra_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;
+}
+
+bool
+test07() {
+ Variable x(0);
+ Polyhedra_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;
+}
+
+bool
+test08() {
+ Variable x(0);
+ Polyhedra_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;
+}
+
+bool
+test09() {
+ Polyhedra_Powerset<C_Polyhedron> c_ps(1, EMPTY);
+ bool ok = (c_ps.space_dimension() == 1);
+ return ok;
+}
+
+bool
+test10() {
+ Variable x(0);
+ Polyhedra_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;
+}
+
+bool
+test11() {
+ Variable x(0);
+ Polyhedra_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));
+
+ Polyhedra_Powerset<C_Polyhedron> c_ps1;
+ c_ps1 = c_ps;
+
+ bool ok = !c_ps.empty();
+ return ok;
+}
+
+bool
+test12() {
+ Variable x(0);
+ Polyhedra_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));
+
+ Polyhedra_Powerset<C_Polyhedron> c_ps1(1, EMPTY);
+ c_ps.swap(c_ps1);
+
+ bool ok = (c_ps.empty() && !c_ps1.empty());
+ return ok;
+}
+
+bool
+test13() {
+ Variable x(0);
+ Polyhedra_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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+}
+
+bool
+test14() {
+ Variable x(0);
+ Polyhedra_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);
+
+ Polyhedra_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);
+
+ Polyhedra_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;
+}
+
+bool
+test15() {
+ Variable x(0);
+ Polyhedra_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));
+
+ Polyhedra_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);
+ Polyhedra_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;
+}
+
+bool
+test16() {
+ Variable x(0);
+ Polyhedra_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);
+ Polyhedra_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;
+}
+
+} // 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/Polyhedron/powerset1.cc b/tests/Polyhedron/powerset1.cc
new file mode 100644
index 0000000..43ebc31
--- /dev/null
+++ b/tests/Polyhedron/powerset1.cc
@@ -0,0 +1,249 @@
+/* Test Powerset<CS>.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <algorithm>
+#include <set>
+
+namespace {
+
+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);
+
+// A class for representing Finite Conjunctions of Attribute
+// Independent Boolean Variable Properties.
+class Fcaibvp {
+private:
+ typedef Variable::Compare Compare;
+ typedef std::set<Variable, Compare> Set;
+
+ Set set;
+
+public:
+ Fcaibvp()
+ : set() {
+ }
+
+ explicit Fcaibvp(const Variable& x)
+ : set() {
+ set.insert(x);
+ }
+
+ memory_size_type total_memory_in_bytes() const {
+ return 1;
+ }
+
+ bool is_top() const {
+ return set.empty();
+ }
+
+ bool is_bottom() const {
+ return false;
+ }
+
+ bool 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(),
+ Compare());
+ }
+
+ void upper_bound_assign(const Fcaibvp& y) {
+ set.insert(y.set.begin(), y.set.end());
+ }
+
+ void meet_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()),
+ Compare());
+ std::swap(x, z);
+ }
+
+ bool OK() const {
+ return true;
+ }
+
+ friend std::ostream& operator<<(std::ostream& s, const Fcaibvp& x);
+};
+
+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; ++i) {
+ const Variable& v = *i;
+#if 0 // Old compilers may not understand the following.
+ using IO_Operators::operator<<;
+ s << v;
+#else
+ Parma_Polyhedra_Library::IO_Operators::operator<<(s, v);
+#endif
+ if (i != x_end)
+ s << ", ";
+ }
+ s << "}";
+ return s;
+}
+
+bool
+operator==(const Fcaibvp& x, const Fcaibvp& y) {
+ return x.definitely_entails(y) && y.definitely_entails(x);
+}
+
+bool
+operator!=(const Fcaibvp& x, const Fcaibvp& y) {
+ return !(x == y);
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ // Use every public Powerset method.
+
+ typedef Powerset<Fcaibvp> PS;
+
+ Variable A(0);
+
+ PS ps1;
+ ps1.add_disjunct(Fcaibvp(A));
+
+ PS ps2 = ps1;
+
+ if (ps2 != ps1 || !(ps2 == ps1))
+ exit(1);
+
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ nout << "ps1:" << std::endl << ps1 << std::endl;
+
+ Fcaibvp d(A);
+ PS ps3(d);
+
+ if (!ps1.definitely_entails(ps3))
+ exit(1);
+
+ if (ps3.is_top())
+ exit(1);
+
+ if (ps1.is_bottom())
+ exit(1);
+
+ nout << "Total memory: " << ps3.total_memory_in_bytes() << std::endl
+ << "External memory: " << ps3.external_memory_in_bytes() << std::endl;
+
+ ps3.omega_reduce();
+
+ if (ps3.size() == 0)
+ exit(1);
+
+ if (ps3.empty())
+ exit(1);
+
+ // Iterator.
+ dimension_type count = 0;
+ for (PS::iterator i = ps3.begin(); i != ps3.end(); ++i)
+ ++count;
+ if (count != 1)
+ exit(1);
+
+ // Constant iterator.
+ count = 0;
+ for (PS::const_iterator i = ps3.begin(); i != ps3.end(); ++i)
+ ++count;
+ if (count != 1)
+ exit(1);
+
+ // Reverse iterator.
+ count = 0;
+ for (PS::reverse_iterator i = ps3.rbegin(); i != ps3.rend(); ++i)
+ ++count;
+ if (count != 1)
+ exit(1);
+
+ // Constant reverse iterator.
+ count = 0;
+ for (PS::const_reverse_iterator i = ps3.rbegin(),
+ ps3_rend = ps3.rend(); i != ps3_rend; ++i)
+ ++count;
+ if (count != 1)
+ exit(1);
+
+ // Omega iterator typedef.
+ count = 0;
+ for (PS::omega_iterator i = ps3.begin(); i != ps3.end(); ++i)
+ ++count;
+ if (count != 1)
+ exit(1);
+
+ ps2 = ps3;
+ PS ps_empty;
+ ps2.drop_disjunct(ps2.begin());
+ if (ps2 != ps_empty)
+ exit(1);
+
+ ps2 = ps3;
+ ps2.drop_disjuncts(ps2.begin(),ps2.end());
+ if (ps2 != ps_empty)
+ exit(1);
+
+ ps2 = ps3;
+ ps2.clear();
+ if (ps2 != ps_empty)
+ exit(1);
+
+ ps3.swap(ps2);
+ ps3.swap(ps2);
+ if (ps3 != ps1 || ps2 != ps_empty)
+ exit(1);
+
+ ps2 = ps_empty;
+ ps2.least_upper_bound_assign(ps3);
+ if (ps2 != ps3)
+ exit(1);
+
+ ps2 = ps_empty;
+ ps2.upper_bound_assign(ps3);
+ if (ps2 != ps3)
+ exit(1);
+
+ Variable B(1);
+ ps2 = ps1;
+ ps2.meet_assign(ps3);
+ if (ps2 != ps3)
+ exit(1);
+
+ ps3.collapse();
+ if (ps3.size() != 1)
+ exit(1);
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/randphull1.cc b/tests/Polyhedron/randphull1.cc
new file mode 100644
index 0000000..31b8416
--- /dev/null
+++ b/tests/Polyhedron/randphull1.cc
@@ -0,0 +1,68 @@
+/* Compute poly-hulls of random polytopes.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+namespace {
+
+int
+count_points(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;
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ // 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 << 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));
+ nout << count_points(ph) << endl;
+ }
+
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/randphull2.cc b/tests/Polyhedron/randphull2.cc
new file mode 100644
index 0000000..b41809d
--- /dev/null
+++ b/tests/Polyhedron/randphull2.cc
@@ -0,0 +1,131 @@
+/* Compute random polytopes by generating points on the surface
+ of an n-dimensional sphere.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <vector>
+#include <cmath>
+
+using std::vector;
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+#ifndef M_PI
+# define M_PI 3.14159265358979323846 /* pi */
+#endif
+
+// 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.
+
+namespace {
+
+void
+point_on_the_unit_n_sphere(unsigned n,
+ const vector<float>& theta,
+ 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) {
+ if (dimension < 2)
+ abort();
+
+ vector<float> theta(dimension-1);
+ 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; )
+ le += Variable(i)*Coefficient(coordinate[i]*1000000.0);
+ ph.add_generator(point(le));
+ }
+}
+
+} // namespace
+
+int
+main() TRY {
+ set_handlers();
+
+ for (int dimension = 2; dimension <= 6; ++dimension) {
+ C_Polyhedron ph(dimension, EMPTY);
+ random_polytope(ph, dimension, dimension*dimension);
+ const Constraint_System& cs = ph.constraints();
+ unsigned num_constraints = 0;
+ for (Constraint_System::const_iterator i = cs.begin(), cs_end = cs.end();
+ i != cs_end;
+ ++i)
+ ++num_constraints;
+ const Generator_System& gs = ph.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) {
+ nout << "i->type() == " << i->type() << endl;
+ exit(1);
+ }
+ ++num_points;
+ }
+
+ nout << "dimension = " << dimension
+ << ", points = " << num_points << " (" << dimension*dimension << ")"
+ << ", constraints = " << num_constraints << endl;
+ }
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/relations1.cc b/tests/Polyhedron/relations1.cc
new file mode 100644
index 0000000..4d4ef3c
--- /dev/null
+++ b/tests/Polyhedron/relations1.cc
@@ -0,0 +1,484 @@
+/* Test Polyhedron::relation_with(g) and Polyhedron::relation_with(c).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..b30a4d1
--- /dev/null
+++ b/tests/Polyhedron/relations2.cc
@@ -0,0 +1,128 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/relations3.cc b/tests/Polyhedron/relations3.cc
new file mode 100644
index 0000000..ddacb5f
--- /dev/null
+++ b/tests/Polyhedron/relations3.cc
@@ -0,0 +1,294 @@
+/* Test Polyhedron::relation_with(c) and Polyhedron::relation_with(g).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+} // 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/removespacedims1.cc b/tests/Polyhedron/removespacedims1.cc
new file mode 100644
index 0000000..fea3341
--- /dev/null
+++ b/tests/Polyhedron/removespacedims1.cc
@@ -0,0 +1,298 @@
+/* Removing space dimensions from a polyhedron.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..c51c98c
--- /dev/null
+++ b/tests/Polyhedron/removespacedims2.cc
@@ -0,0 +1,66 @@
+/* Removing space dimensions form an NNC polyhedron.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/smm1.cc b/tests/Polyhedron/smm1.cc
new file mode 100644
index 0000000..1674cac
--- /dev/null
+++ b/tests/Polyhedron/smm1.cc
@@ -0,0 +1,149 @@
+/* SEND + MORE = MONEY.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace Parma_Polyhedra_Library {
+ // Import all the output operators into the main PPL namespace.
+ using IO_Operators::operator<<;
+}
+
+// The classic cryptarithmetic puzzle:
+//
+// S E N D
+// + M O R E
+// ---------
+// M O N E Y
+
+namespace {
+
+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
+
+int
+main() TRY {
+ set_handlers();
+
+ 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);
+ constraints(ph,
+ S, E, N, D, M, O, R, Y,
+ C1, C2, C3, C4);
+ if (!ph.is_empty()) {
+ 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 1;
+
+ 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 1;
+ }
+ }
+ return 0;
+}
+CATCH
diff --git a/tests/Polyhedron/timeelapse1.cc b/tests/Polyhedron/timeelapse1.cc
new file mode 100644
index 0000000..9d624c7
--- /dev/null
+++ b/tests/Polyhedron/timeelapse1.cc
@@ -0,0 +1,250 @@
+/* Test Polyhedron::time_elapse_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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);
+
+ Polyhedra_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);
+
+ Polyhedra_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);
+
+ Polyhedra_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..a20455b
--- /dev/null
+++ b/tests/Polyhedron/timeelapse2.cc
@@ -0,0 +1,132 @@
+/* Test time_elapse_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..2c0c473
--- /dev/null
+++ b/tests/Polyhedron/topclosed1.cc
@@ -0,0 +1,95 @@
+/* Test Polyhedron::is_topologically_closed().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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_and_minimize(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..a80bc6d
--- /dev/null
+++ b/tests/Polyhedron/topclosure1.cc
@@ -0,0 +1,160 @@
+/* Test Polyhedron::topological_closure_assign().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/universe1.cc b/tests/Polyhedron/universe1.cc
new file mode 100644
index 0000000..1713ae1
--- /dev/null
+++ b/tests/Polyhedron/universe1.cc
@@ -0,0 +1,164 @@
+/* Test Polyhedron::is_universe().
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..a2d8be1
--- /dev/null
+++ b/tests/Polyhedron/universe2.cc
@@ -0,0 +1,79 @@
+/* Test the function is_universe() for a NNC_polyhedron.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/watchdog1.cc b/tests/Polyhedron/watchdog1.cc
new file mode 100644
index 0000000..0b47a0d
--- /dev/null
+++ b/tests/Polyhedron/watchdog1.cc
@@ -0,0 +1,131 @@
+/* Test the timeout facility of the library.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "pwl.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 hundredth_secs) {
+ try {
+ Parma_Watchdog_Library::Watchdog
+ w(hundredth_secs, 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;
+ }
+ catch (...) {
+ 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/writeconsys1.cc b/tests/Polyhedron/writeconsys1.cc
new file mode 100644
index 0000000..a7b322a
--- /dev/null
+++ b/tests/Polyhedron/writeconsys1.cc
@@ -0,0 +1,58 @@
+/* Test operator<<(std::ostream&, const Constraint_System&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "writeconsys1.dat";
+ Variable A(0);
+ Variable B(1);
+
+ NNC_Polyhedron ph(2);
+ ph.add_constraint(A - 2*B > 2);
+ ph.add_constraint(Linear_Expression(0) <= -1);
+ ph.add_constraint(A == 2);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << ph.constraints() << endl;
+ close(f);
+
+ // FIXME.
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+END_MAIN
diff --git a/tests/Polyhedron/writegensys1.cc b/tests/Polyhedron/writegensys1.cc
new file mode 100644
index 0000000..49cc20b
--- /dev/null
+++ b/tests/Polyhedron/writegensys1.cc
@@ -0,0 +1,97 @@
+/* Test operator<<(std::ostream&, const Generator_System&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "writegensys1.dat";
+ 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));
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << gs << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+bool
+test02() {
+ const char* my_file = "writegensys1.dat";
+ C_Polyhedron ph(3, EMPTY);
+
+ Generator_System gs = ph.generators();
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << gs << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+bool
+test03() {
+ const char* my_file = "writegensys1.dat";
+ 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));
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << gs << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+} // 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..9a690b3
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron1.cc
@@ -0,0 +1,77 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "writepolyhedron1.dat";
+ 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);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << ph << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+bool
+test02() {
+ const char* my_file = "writepolyhedron1.dat";
+ NNC_Polyhedron ph1;
+
+ C_Polyhedron ph(ph1.constraints());
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << ph << endl;
+ close(f);
+ // FIXME.
+ return 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..b5a3696
--- /dev/null
+++ b/tests/Polyhedron/writepolyhedron2.cc
@@ -0,0 +1,71 @@
+/* Test operator<<(std::ostream&, const Polyhedron&).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+
+#include "files.hh"
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "writepolyhedron2.dat";
+ 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);
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << ph << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+} // 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..8310444
--- /dev/null
+++ b/tests/Polyhedron/writerelation1.cc
@@ -0,0 +1,95 @@
+/* Test operator<<(std::ostream& s, const Poly_Con_Relation& r)
+ and operator<<(std::ostream& s, const Poly_Gen_Relation& r).
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include "files.hh"
+#include <string>
+#include <fstream>
+
+using std::fstream;
+using std::ios_base;
+
+using namespace IO_Operators;
+
+namespace {
+
+bool
+test01() {
+ const char* my_file = "writerelation1.dat";
+ Poly_Con_Relation rel(Poly_Con_Relation::nothing());
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << rel << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+bool
+test02() {
+ const char* my_file = "writerelation1.dat";
+ Poly_Gen_Relation rel(Poly_Gen_Relation::nothing());
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << rel << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+bool
+test03() {
+ const char* my_file = "writerelation1.dat";
+ Poly_Con_Relation rel(Poly_Con_Relation::is_disjoint());
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << rel << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+bool
+test04() {
+ const char* my_file = "writerelation1.dat";
+ Poly_Gen_Relation rel(Poly_Gen_Relation::subsumes());
+
+ fstream f;
+ open(f, my_file, ios_base::out);
+ f << rel << endl;
+ close(f);
+ // FIXME.
+ return true;
+}
+
+} // namespace
+
+BEGIN_MAIN
+ DO_TEST(test01);
+ DO_TEST(test02);
+ DO_TEST(test03);
+ DO_TEST(test04);
+END_MAIN
diff --git a/tests/Polyhedron/writevariable1.cc b/tests/Polyhedron/writevariable1.cc
new file mode 100644
index 0000000..be7dafb
--- /dev/null
+++ b/tests/Polyhedron/writevariable1.cc
@@ -0,0 +1,103 @@
+/* Test operator<<(std::ostream& s, Variable v)
+ and the related machinery.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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/Random_Number_Generator.defs.hh b/tests/Random_Number_Generator.defs.hh
new file mode 100644
index 0000000..154c668
--- /dev/null
+++ b/tests/Random_Number_Generator.defs.hh
@@ -0,0 +1,46 @@
+/* Random_Number_Generator class declaration.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..d79654d
--- /dev/null
+++ b/tests/Random_Number_Generator.inlines.hh
@@ -0,0 +1,90 @@
+/* Random_Number_Generator class implementation: inline functions.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_Random_Number_Generator_inlines_hh
+#define PPL_Random_Number_Generator_inlines_hh 1
+
+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 info) {
+ using Implementation::Random_Numbers::Random_Number_Generator_Aux;
+ used(info);
+ 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..87f2f01
--- /dev/null
+++ b/tests/Random_Number_Generator.types.hh
@@ -0,0 +1,21 @@
+/* Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+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/files.cc b/tests/files.cc
new file mode 100644
index 0000000..efb5cb1
--- /dev/null
+++ b/tests/files.cc
@@ -0,0 +1,49 @@
+/* Definition of simple helper functions to open and close files.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "files.hh"
+#include <fstream>
+#include <iostream>
+
+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..6dd97d6
--- /dev/null
+++ b/tests/files.hh
@@ -0,0 +1,35 @@
+/* Declaration of simple helper functions to open and close files.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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..15abd2e
--- /dev/null
+++ b/tests/ppl_test.cc
@@ -0,0 +1,137 @@
+/* Implementation of simple print functions used in test programs.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "ppl_test.hh"
+#include <csignal>
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+#endif
+
+namespace PPL = Parma_Polyhedra_Library;
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+namespace {
+
+void
+unexpected_exception_handler() {
+ cerr << "unexpected exception thrown" << endl;
+ exit(1);
+}
+
+void
+uncaught_exception_handler() {
+ cerr << "uncaught exception" << endl;
+ exit(1);
+}
+
+void
+fpe_handler(int sig, siginfo_t* sip, void*) {
+ if (sig != SIGFPE) {
+ cerr << "fpe_handler called on signal different from SIGFPE" << 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)
+ cerr << "SIGFPE caught (cause: " << s << ")" << endl;
+ else {
+ cerr << "SIGFPE caught (unknown si_code " << sip->si_code << ")" << endl;
+#ifdef HAVE_FENV_H
+ cerr << "Inquire with fetestexcept(): ";
+ if (fetestexcept(FE_INEXACT))
+ cerr << "FE_INEXACT ";
+ if (fetestexcept(FE_DIVBYZERO))
+ cerr << "FE_DIVBYZERO ";
+ if (fetestexcept(FE_UNDERFLOW))
+ cerr << "FE_UNDERFLOW ";
+ if (fetestexcept(FE_OVERFLOW))
+ cerr << "FE_OVERFLOW ";
+ if (fetestexcept(FE_INVALID))
+ cerr << "FE_INVALID ";
+ cerr << endl;
+#endif
+ }
+ exit(1);
+}
+
+} // namespace
+
+void
+set_handlers() {
+ struct sigaction action;
+ action.sa_sigaction = fpe_handler;
+ sigemptyset(&action.sa_mask);
+ action.sa_flags = SA_SIGINFO;
+ if (sigaction(SIGFPE, &action, NULL) != 0) {
+ cerr << "sigaction() failed" << endl;
+ abort();
+ }
+
+ set_unexpected(unexpected_exception_handler);
+ set_terminate(uncaught_exception_handler);
+}
+
+bool
+PPL::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) {
+ Checked_Number<float, Extended_Number_Policy> dd(d, ROUND_UP);
+ nout << "Excessive " << d_name << " distance " << dd
+ << ": should be at most " << max_d << "."
+ << endl;
+ return false;
+ }
+ else
+ return true;
+}
diff --git a/tests/ppl_test.hh b/tests/ppl_test.hh
new file mode 100644
index 0000000..c9e5513
--- /dev/null
+++ b/tests/ppl_test.hh
@@ -0,0 +1,390 @@
+/* Header file for test programs.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_ppl_test_hh
+#define PPL_ppl_test_hh 1
+
+#include "ppl.hh"
+#include "print.hh"
+#include "Partial_Function.defs.hh"
+#include "Random_Number_Generator.defs.hh"
+#include <stdexcept>
+#include <sstream>
+#include <list>
+#include <string>
+
+using namespace std;
+using namespace Parma_Polyhedra_Library;
+
+void
+set_handlers();
+
+#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; \
+ list<string> failed_tests;
+
+#define END_MAIN \
+ if (failed_tests.empty()) \
+ return 0; \
+ else { \
+ std::cerr << "failed tests: "; \
+ copy(failed_tests.begin(), failed_tests.end(), \
+ ostream_iterator<string>(cerr, " ")); \
+ std::cerr << std::endl; \
+ return 1; \
+ } \
+} \
+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 " ===" << endl
+
+#define RUN_TEST(test) \
+ try { \
+ succeeded = test(); \
+ } \
+ catch (const std::overflow_error& e) { \
+ nout << "arithmetic overflow (" << e.what() << ")" \
+ << std::endl; \
+ 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) \
+ failed_tests.push_back(#test);
+
+#if COEFFICIENT_BITS == 0
+
+#define DO_TEST_F64(test) DO_TEST(test)
+#define DO_TEST_F32(test) DO_TEST(test)
+#define DO_TEST_F16(test) DO_TEST(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#elif COEFFICIENT_BITS == 64
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST(test)
+#define DO_TEST_F16(test) DO_TEST(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#elif COEFFICIENT_BITS == 32
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#elif COEFFICIENT_BITS == 16
+
+#ifdef NDEBUG
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#else
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST_F(test)
+#define DO_TEST_F8(test) DO_TEST(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#endif // !defined(NDEBUG)
+
+#elif COEFFICIENT_BITS == 8
+
+#ifdef NDEBUG
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST_F(test)
+#define DO_TEST_F8(test) DO_TEST_F(test)
+#define DO_TEST_F8A(test) DO_TEST(test)
+
+#else
+
+#define DO_TEST_F64(test) DO_TEST_F(test)
+#define DO_TEST_F32(test) DO_TEST_F(test)
+#define DO_TEST_F16(test) DO_TEST_F(test)
+#define DO_TEST_F16A(test) DO_TEST_F(test)
+#define DO_TEST_F8(test) DO_TEST_F(test)
+#define DO_TEST_F8A(test) DO_TEST_F(test)
+
+#endif // !defined(NDEBUG)
+
+#endif // COEFFICIENT_BITS == 8
+
+
+// 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)
+
+// These using directive and declaration are just to avoid the
+// corresponding namespace qualifications in all the tests.
+using namespace Parma_Polyhedra_Library;
+using std::endl;
+
+
+#ifdef DERIVED_TEST
+#define C_Polyhedron NNC_Polyhedron
+#endif
+
+#ifndef BD_SHAPE_INSTANCE
+#define BD_SHAPE_INSTANCE mpq_class
+#endif
+
+namespace Parma_Polyhedra_Library {
+
+//! Utility typedef to allow a macro argument to denote the long double type.
+typedef long double long_double;
+
+//! The incarnation of BD_Shape under test.
+typedef BD_Shape<BD_SHAPE_INSTANCE> TBD_Shape;
+
+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) {
+ using namespace IO_Operators;
+ 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) {
+ nout << "Equality does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << endl;
+ return false;
+ }
+ else
+ return true;
+ }
+
+ if (!q_computed_result.contains(known_result)) {
+ nout << "Containment does not hold:"
+ << "\ncomputed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << 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) {
+ nout << "Computed result is\n"
+ << q_computed_result
+ << "\nknown result is\n"
+ << known_result
+ << 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 <>
+inline bool
+check_result(const BD_Shape<mpq_class>& computed_result,
+ const BD_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 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);
+}
+
+//! Compare copies of \p a and \p b.
+/*!
+ Comparing temporary copies ensures that the underlying
+ representation of \p a and \p b stays the same.
+*/
+template <typename T>
+inline bool
+copy_compare(const T& a, const T& b) {
+ const T tem_a = a;
+ const T tem_b = b;
+ return tem_a == tem_b;
+}
+
+//! Look for variation in \p a.
+/*!
+ Return <CODE>true</CODE> if \p a contains variation from
+ consistency, else return <CODE>false</CODE>. Variation can be found
+ via the OK method, or via a comparison between \p a and an object
+ created from the ASCII dump of \p a.
+
+ It is assumed that \p a is up to date.
+
+ If the loading of the ASCII dump fails then an error message is
+ printed and `exit' is called.
+
+ \p T must provide:
+ void ascii_dump(std::ostream& s) const;
+ bool ascii_load(std::istream& s);
+ and there must be a:
+ bool operator==(const T& x, const T& y);
+*/
+template <typename T>
+static bool
+find_variation(T& a) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+
+ if (!a.OK()) {
+ nout << "OK() failed\nASCII dump:" << endl;
+ a.ascii_dump(nout);
+ return true;
+ }
+
+ /* FIX In some PPL classes (e.g. Congruence) the simple constructors
+ are private. */
+ //T b;
+ T b(a);
+ stringstream dump;
+ a.ascii_dump(dump);
+ if (!b.ascii_load(dump)) {
+ nout << "Failed to load `b' from the ASCII dump of `a'." << endl;
+ nout << "ASCII dump of `a':" << endl;
+ nout << dump.str();
+ exit(1);
+ }
+
+ if (a == b)
+ return false;
+
+ nout << "`b' loaded from ASCII dump of `a' should equal `a'" << endl
+ << "ASCII dump of `a':" << endl
+ << "------------------" << endl;
+ a.ascii_dump(nout);
+ nout << "ASCII dump of `b' (after comparison):" << endl
+ << "-------------------------------------" << endl;
+ b.ascii_dump(nout);
+ nout << "ASCII dump of `a' (after comparison):" << endl
+ << "-------------------------------------" << endl;
+ a.ascii_dump(nout);
+
+ return true;
+}
+
+} // namespace Parma_Polyhedra_Library
+
+#endif // !defined(PPL_ppl_test_hh)
diff --git a/tests/print.cc b/tests/print.cc
new file mode 100644
index 0000000..48f62a7
--- /dev/null
+++ b/tests/print.cc
@@ -0,0 +1,158 @@
+/* Implementation of simple print functions used in test programs.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include "print.hh"
+#include "ppl.hh"
+#include "Partial_Function.defs.hh"
+#include <iostream>
+#include <string>
+
+using namespace Parma_Polyhedra_Library;
+using namespace Parma_Polyhedra_Library::IO_Operators;
+
+void
+print_constraint(const Constraint& c,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ s << c << std::endl;
+}
+
+void
+print_constraints(const Polyhedron& ph,
+ const std::string& intro, std::ostream& s) {
+ print_constraints(ph.constraints(), intro, s);
+}
+
+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) {
+ 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";
+ 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) {
+ 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";
+ s << g << std::endl;
+}
+
+void
+print_generator(const Grid_Generator& g,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << "\n";
+ 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.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) {
+ 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) {
+ s << *i++;
+ if (i != gs_end)
+ s << ",\n";
+ }
+ s << (printed_something ? "." : "false.") << std::endl;
+}
+
+void
+print_function(const Partial_Function& function,
+ const std::string& intro, std::ostream& s) {
+ if (!intro.empty())
+ s << intro << std::endl;
+ function.print(s);
+}
diff --git a/tests/print.hh b/tests/print.hh
new file mode 100644
index 0000000..4f9bdf6
--- /dev/null
+++ b/tests/print.hh
@@ -0,0 +1,186 @@
+/* Declaration of simple print functions used in test programs.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#ifndef PPL_print_hh
+#define PPL_print_hh 1
+
+#include "ppl.hh"
+#include "Partial_Function.types.hh"
+#include <string>
+#include <iostream>
+
+#ifndef NOISY
+#define NOISY 0
+#endif
+
+#ifndef VERY_NOISY
+#define VERY_NOISY 0
+#endif
+
+static bool
+check_noisy(const char* environment_variable) {
+#if 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
+}
+
+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");
+
+// FIX use inline function?
+#define dump_grids(grid,known_grid) \
+ nout << endl << "ASCII dump of grid:" << endl; \
+ grid.ascii_dump(nout); \
+ nout << endl << "ASCII dump of known grid:" << endl; \
+ known_grid.ascii_dump(nout);
+
+void
+print_constraint(const Parma_Polyhedra_Library::Constraint& c,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_constraints(const Parma_Polyhedra_Library::Constraint_System& cs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_constraints(const Parma_Polyhedra_Library::Polyhedron& ph,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+template <typename T>
+void
+print_constraints(const Parma_Polyhedra_Library::BD_Shape<T>& bd,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ if (!intro.empty())
+ s << intro << std::endl;
+ s << bd << std::endl;
+}
+
+template <typename PH>
+void
+print_constraints(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ if (!intro.empty())
+ s << intro << std::endl;
+ s << pps << std::endl;
+}
+
+template <typename PH>
+void
+print_congruences(const Parma_Polyhedra_Library::Polyhedra_Powerset<PH>& pps,
+ const std::string& intro = "",
+ std::ostream& s = nout) {
+ using namespace Parma_Polyhedra_Library::IO_Operators;
+ if (!intro.empty())
+ s << intro << std::endl;
+ s << pps << std::endl;
+}
+
+void
+print_congruence(const Parma_Polyhedra_Library::Congruence& c,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_congruences(const Parma_Polyhedra_Library::Congruence_System& cgs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_congruences(const Parma_Polyhedra_Library::Grid& gr,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generator(const Parma_Polyhedra_Library::Generator& g,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generator(const Parma_Polyhedra_Library::Grid_Generator& g,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Generator_System& gs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Grid_Generator_System& gs,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Polyhedron& ph,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_generators(const Parma_Polyhedra_Library::Grid& gr,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+void
+print_function(const Parma_Polyhedra_Library::Partial_Function& function,
+ const std::string& intro = "",
+ std::ostream& s = nout);
+
+#endif // !defined(PPL_print_hh)
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644
index 0000000..364c235
--- /dev/null
+++ b/utils/Makefile.am
@@ -0,0 +1,58 @@
+# Automake source file for the Parma Polyhedra Library.
+# Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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
+
+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 Makefile
+ $(do_subst) < $(srcdir)/build_header.in > build_header
+ chmod +x build_header
+
+text2cxxarray: text2cxxarray.in Makefile
+ $(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..2375330
--- /dev/null
+++ b/utils/Makefile.in
@@ -0,0 +1,592 @@
+# Makefile.in generated by automake 1.9.6 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005 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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/ppl/ .
+
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+top_builddir = ..
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+INSTALL = @INSTALL@
+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 = $(dist_noinst_SCRIPTS) $(srcdir)/Makefile.am \
+ $(srcdir)/Makefile.in
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(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_cxx_attribute_weak.m4 \
+ $(top_srcdir)/m4/ac_cxx_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_flexible_arrays.m4 \
+ $(top_srcdir)/m4/ac_cxx_float_binary_format.m4 \
+ $(top_srcdir)/m4/ac_cxx_long_double_binary_format.m4 \
+ $(top_srcdir)/m4/ac_text_md5sum.m4 $(top_srcdir)/m4/lib-ld.m4 \
+ $(top_srcdir)/m4/lib-link.m4 $(top_srcdir)/m4/lib-prefix.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 =
+LIBRARIES = $(noinst_LIBRARIES)
+ARFLAGS = cru
+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)
+DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
+ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
+ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+ $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+ $(AM_LDFLAGS) $(LDFLAGS) -o $@
+SOURCES = $(libppl_utils_a_SOURCES)
+DIST_SOURCES = $(libppl_utils_a_SOURCES)
+ETAGS = etags
+CTAGS = ctags
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+AMDEP_FALSE = @AMDEP_FALSE@
+AMDEP_TRUE = @AMDEP_TRUE@
+AMTAR = @AMTAR@
+AR = @AR@
+AS = @AS@
+ASSERTIONS_ENABLED_FALSE = @ASSERTIONS_ENABLED_FALSE@
+ASSERTIONS_ENABLED_TRUE = @ASSERTIONS_ENABLED_TRUE@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BUILD_CIAO_PROLOG_INTERFACE_FALSE = @BUILD_CIAO_PROLOG_INTERFACE_FALSE@
+BUILD_CIAO_PROLOG_INTERFACE_TRUE = @BUILD_CIAO_PROLOG_INTERFACE_TRUE@
+BUILD_C_INTERFACE_FALSE = @BUILD_C_INTERFACE_FALSE@
+BUILD_C_INTERFACE_TRUE = @BUILD_C_INTERFACE_TRUE@
+BUILD_GNU_PROLOG_INTERFACE_FALSE = @BUILD_GNU_PROLOG_INTERFACE_FALSE@
+BUILD_GNU_PROLOG_INTERFACE_TRUE = @BUILD_GNU_PROLOG_INTERFACE_TRUE@
+BUILD_SICSTUS_PROLOG_INTERFACE_FALSE = @BUILD_SICSTUS_PROLOG_INTERFACE_FALSE@
+BUILD_SICSTUS_PROLOG_INTERFACE_TRUE = @BUILD_SICSTUS_PROLOG_INTERFACE_TRUE@
+BUILD_SWI_PROLOG_INTERFACE_FALSE = @BUILD_SWI_PROLOG_INTERFACE_FALSE@
+BUILD_SWI_PROLOG_INTERFACE_TRUE = @BUILD_SWI_PROLOG_INTERFACE_TRUE@
+BUILD_WATCHDOG_LIBRARY_FALSE = @BUILD_WATCHDOG_LIBRARY_FALSE@
+BUILD_WATCHDOG_LIBRARY_TRUE = @BUILD_WATCHDOG_LIBRARY_TRUE@
+BUILD_XSB_PROLOG_INTERFACE_FALSE = @BUILD_XSB_PROLOG_INTERFACE_FALSE@
+BUILD_XSB_PROLOG_INTERFACE_TRUE = @BUILD_XSB_PROLOG_INTERFACE_TRUE@
+BUILD_YAP_PROLOG_INTERFACE_FALSE = @BUILD_YAP_PROLOG_INTERFACE_FALSE@
+BUILD_YAP_PROLOG_INTERFACE_TRUE = @BUILD_YAP_PROLOG_INTERFACE_TRUE@
+CAN_CONTROL_FPU_FALSE = @CAN_CONTROL_FPU_FALSE@
+CAN_CONTROL_FPU_TRUE = @CAN_CONTROL_FPU_TRUE@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CIAO_PROLOG = @CIAO_PROLOG@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+ECHO = @ECHO@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+ENABLE_SHARED_FALSE = @ENABLE_SHARED_FALSE@
+ENABLE_SHARED_TRUE = @ENABLE_SHARED_TRUE@
+ENABLE_STATIC_FALSE = @ENABLE_STATIC_FALSE@
+ENABLE_STATIC_TRUE = @ENABLE_STATIC_TRUE@
+EXEEXT = @EXEEXT@
+F77 = @F77@
+FFLAGS = @FFLAGS@
+GNU_PROLOG = @GNU_PROLOG@
+HAVE_GLPK_FALSE = @HAVE_GLPK_FALSE@
+HAVE_GLPK_TRUE = @HAVE_GLPK_TRUE@
+HAVE_MD5SUM_FALSE = @HAVE_MD5SUM_FALSE@
+HAVE_MD5SUM_TRUE = @HAVE_MD5SUM_TRUE@
+HAVE_PERL_FALSE = @HAVE_PERL_FALSE@
+HAVE_PERL_TRUE = @HAVE_PERL_TRUE@
+HOST_OS_CYGWIN_FALSE = @HOST_OS_CYGWIN_FALSE@
+HOST_OS_CYGWIN_TRUE = @HOST_OS_CYGWIN_TRUE@
+HOST_OS_DARWIN_FALSE = @HOST_OS_DARWIN_FALSE@
+HOST_OS_DARWIN_TRUE = @HOST_OS_DARWIN_TRUE@
+HOST_OS_SOLARIS_FALSE = @HOST_OS_SOLARIS_FALSE@
+HOST_OS_SOLARIS_TRUE = @HOST_OS_SOLARIS_TRUE@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+ISODATE = @ISODATE@
+LDFLAGS = @LDFLAGS@
+LIBGMP = @LIBGMP@
+LIBGMPXX = @LIBGMPXX@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LN_S = @LN_S@
+LTLIBGMP = @LTLIBGMP@
+LTLIBGMPXX = @LTLIBGMPXX@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MD5SUM = @MD5SUM@
+NO_UNDEFINED_FALSE = @NO_UNDEFINED_FALSE@
+NO_UNDEFINED_TRUE = @NO_UNDEFINED_TRUE@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PERL = @PERL@
+PPL_CONFIGURE_OPTIONS = @PPL_CONFIGURE_OPTIONS@
+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@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SICSTUS_PROLOG_INCLUDE_OPTIONS = @SICSTUS_PROLOG_INCLUDE_OPTIONS@
+STRIP = @STRIP@
+SUPPORTED_DOUBLE_FALSE = @SUPPORTED_DOUBLE_FALSE@
+SUPPORTED_DOUBLE_TRUE = @SUPPORTED_DOUBLE_TRUE@
+SUPPORTED_FLOAT_FALSE = @SUPPORTED_FLOAT_FALSE@
+SUPPORTED_FLOAT_TRUE = @SUPPORTED_FLOAT_TRUE@
+SUPPORTED_LONG_DOUBLE_FALSE = @SUPPORTED_LONG_DOUBLE_FALSE@
+SUPPORTED_LONG_DOUBLE_TRUE = @SUPPORTED_LONG_DOUBLE_TRUE@
+SWI_PROLOG_INCLUDE_OPTIONS = @SWI_PROLOG_INCLUDE_OPTIONS@
+TEXT_MD5SUM = @TEXT_MD5SUM@
+USE_CHECKED_INTEGERS_FALSE = @USE_CHECKED_INTEGERS_FALSE@
+USE_CHECKED_INTEGERS_TRUE = @USE_CHECKED_INTEGERS_TRUE@
+USE_GMP_INTEGERS_FALSE = @USE_GMP_INTEGERS_FALSE@
+USE_GMP_INTEGERS_TRUE = @USE_GMP_INTEGERS_TRUE@
+USE_INT16_FALSE = @USE_INT16_FALSE@
+USE_INT16_TRUE = @USE_INT16_TRUE@
+USE_INT32_FALSE = @USE_INT32_FALSE@
+USE_INT32_TRUE = @USE_INT32_TRUE@
+USE_INT64_FALSE = @USE_INT64_FALSE@
+USE_INT64_TRUE = @USE_INT64_TRUE@
+USE_INT8_FALSE = @USE_INT8_FALSE@
+USE_INT8_TRUE = @USE_INT8_TRUE@
+USE_NATIVE_INTEGERS_FALSE = @USE_NATIVE_INTEGERS_FALSE@
+USE_NATIVE_INTEGERS_TRUE = @USE_NATIVE_INTEGERS_TRUE@
+USE_PRECOMPILED_HEADERS_FALSE = @USE_PRECOMPILED_HEADERS_FALSE@
+USE_PRECOMPILED_HEADERS_TRUE = @USE_PRECOMPILED_HEADERS_TRUE@
+VERSION = @VERSION@
+XSB_PROLOG_INCLUDE_OPTIONS = @XSB_PROLOG_INCLUDE_OPTIONS@
+YAP_PROLOG = @YAP_PROLOG@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_AS = @ac_ct_AS@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DLLTOOL = @ac_ct_DLLTOOL@
+ac_ct_F77 = @ac_ct_F77@
+ac_ct_OBJDUMP = @ac_ct_OBJDUMP@
+ac_ct_RANLIB = @ac_ct_RANLIB@
+ac_ct_STRIP = @ac_ct_STRIP@
+am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
+am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
+am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
+am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
+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@
+coefficient_mnemonic = @coefficient_mnemonic@
+datadir = @datadir@
+debug_flag = @debug_flag@
+docdir = @docdir@
+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@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+sicstus_prolog = @sicstus_prolog@
+subdirs = @subdirs@
+swi_prolog = @swi_prolog@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+xsb_prolog = @xsb_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
+
+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 \
+ && exit 0; \
+ exit 1;; \
+ esac; \
+ done; \
+ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign utils/Makefile'; \
+ 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
+
+clean-noinstLIBRARIES:
+ -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES)
+libppl_utils.a: $(libppl_utils_a_OBJECTS) $(libppl_utils_a_DEPENDENCIES)
+ -rm -f libppl_utils.a
+ $(libppl_utils_a_AR) libppl_utils.a $(libppl_utils_a_OBJECTS) $(libppl_utils_a_LIBADD)
+ $(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@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
+ at am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
+
+mostlyclean-libtool:
+ -rm -f *.lo
+
+clean-libtool:
+ -rm -rf .libs _libs
+
+distclean-libtool:
+ -rm -f libtool
+uninstall-info-am:
+
+ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ mkid -fID $$unique
+tags: TAGS
+
+TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
+ test -n "$$unique" || unique=$$empty_fix; \
+ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+ $$tags $$unique; \
+ fi
+ctags: CTAGS
+CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
+ $(TAGS_FILES) $(LISP)
+ tags=; \
+ here=`pwd`; \
+ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
+ unique=`for i in $$list; do \
+ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+ done | \
+ $(AWK) ' { files[$$0] = 1; } \
+ END { for (i in files) print i; }'`; \
+ test -z "$(CTAGS_ARGS)$$tags$$unique" \
+ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+ $$tags $$unique
+
+GTAGS:
+ here=`$(am__cd) $(top_builddir) && pwd` \
+ && cd $(top_srcdir) \
+ && gtags -i $(GTAGS_ARGS) $$here
+
+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)'; for file in $$list; do \
+ case $$file in \
+ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
+ $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
+ esac; \
+ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+ dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
+ if test "$$dir" != "$$file" && test "$$dir" != "."; then \
+ dir="/$$dir"; \
+ $(mkdir_p) "$(distdir)$$dir"; \
+ else \
+ dir=''; \
+ fi; \
+ if test -d $$d/$$file; then \
+ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
+ fi; \
+ cp -pR $$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:
+ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+ `test -z '$(STRIP)' || \
+ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
+mostlyclean-generic:
+
+clean-generic:
+ -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+ -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_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-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+info: info-am
+
+info-am:
+
+install-data-am:
+
+install-exec-am:
+
+install-info: install-info-am
+
+install-man:
+
+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-info-am
+
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
+ clean-libtool clean-noinstLIBRARIES ctags 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-exec \
+ install-exec-am install-info install-info-am install-man \
+ 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 uninstall uninstall-am \
+ uninstall-info-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 Makefile
+ $(do_subst) < $(srcdir)/build_header.in > build_header
+ chmod +x build_header
+
+text2cxxarray: text2cxxarray.in Makefile
+ $(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..4ebe2f3
--- /dev/null
+++ b/utils/build_header.in
@@ -0,0 +1,102 @@
+#! @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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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/text2cxxarray.in b/utils/text2cxxarray.in
new file mode 100644
index 0000000..2dcac65
--- /dev/null
+++ b/utils/text2cxxarray.in
@@ -0,0 +1,61 @@
+#! @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-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+#
+# This file is part of the Parma Polyhedra Library (PPL).
+#
+# The PPL is free software; you can 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.
+#
+# The PPL is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+#
+# For the most up-to-date information see the Parma Polyhedra Library
+# site: http://www.cs.unipr.it/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.
+ -h, --help Display this help message.
+EOF
+ exit 1;
+}
+
+my $array_name = "a";
+
+GetOptions(
+ 'name=s' => \$array_name,
+ 'help|h' => \&usage,
+) || usage();
+
+print "extern const char* const $array_name" . "[] = {\n";
+while (<>) {
+ chop;
+ s/\\/\\\\/g;
+ s/\t/\\t/g;
+ s/\"/\\"/g;
+ print " \"$_\",\n";
+}
+print " 0";
+print "};\n";
diff --git a/utils/timings.cc b/utils/timings.cc
new file mode 100644
index 0000000..1c30d82
--- /dev/null
+++ b/utils/timings.cc
@@ -0,0 +1,88 @@
+/* Definitions of simple functions for printing timings.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/ppl/ . */
+
+#include <config.h>
+
+#include "timings.hh"
+#include <cassert>
+#include <ctime>
+#include <iostream>
+#include <iomanip>
+#include <cstring>
+#include <cerrno>
+
+#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
+
+using namespace std;
+
+// To save the time when start_clock is called.
+static struct timeval saved_ru_utime;
+
+void
+start_clock() {
+ struct rusage rsg;
+ if (getrusage(RUSAGE_SELF, &rsg) != 0) {
+ cerr << "getrusage failed: " << strerror(errno) << endl;
+ exit(1);
+ }
+ else
+ saved_ru_utime = rsg.ru_utime;
+}
+
+void
+print_clock(ostream& s) {
+ struct rusage rsg;
+ if (getrusage(RUSAGE_SELF, &rsg) != 0) {
+ cerr << "getrusage failed: " << strerror(errno) << endl;
+ exit(1);
+ }
+ 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;
+ time_t secs;
+ time_t hsecs;
+ secs = current_secs - saved_secs;
+ if (current_usecs < saved_usecs) {
+ hsecs = (((1000000 + current_usecs) - saved_usecs) + 5000) / 10000;
+ if (hsecs < 100)
+ --secs;
+ else
+ hsecs = 0;
+ }
+ else
+ hsecs = ((current_usecs - saved_usecs) + 5000) / 10000;
+ assert(hsecs >= 0 && hsecs < 100 && secs >= 0);
+ int fill_char = s.fill();
+ s << secs << "." << setfill('0') << setw(2) << hsecs;
+ s.fill(fill_char);
+ }
+}
diff --git a/utils/timings.hh b/utils/timings.hh
new file mode 100644
index 0000000..73a8fb4
--- /dev/null
+++ b/utils/timings.hh
@@ -0,0 +1,31 @@
+/* Declaration of simple functions for printing timings.
+ Copyright (C) 2001-2006 Roberto Bagnara <bagnara at cs.unipr.it>
+
+This file is part of the Parma Polyhedra Library (PPL).
+
+The PPL is free software; you can 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.
+
+The PPL is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software Foundation,
+Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1307, USA.
+
+For the most up-to-date information see the Parma Polyhedra Library
+site: http://www.cs.unipr.it/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